座標の反転
ツノン 2013/4/13(Sat) 06:02:21|NO.53538
実数の角度と半径とウィンドウの中心点を元に、左右に反転した点を割り出そうとしているのですが上手くいきません。
下のスクリプトではわずかながら差異が生まれてしまいます。
どなたか良い方法をご存じではないでしょうか?
r = 100f
a = 0f
*@
a += m_pi/100
b = a-((a-m_pi/2)*2)
redraw 0
color 255,255,255
boxf
color
line 0,240,640,240
line 320,0,320,480
s=calc(a,r,x1,y1)
f=calc(b,r,x2,y2)
if(absf(s) != absf(f)){
logmes strf("差異 %1.20f",absf(s)- absf(f))
title "差異Count"+Count
Count++
}
color:draw x1,y1
color 255:draw x2,y2
redraw
wait 30
goto*@b
#deffunc draw double x_ , double y_
#const c 3
line 320,240,x_,y_
circle x_-c,y_-c,x_+c,y_+c,1
pos x_,y_
mes x_-320f
return
#defcfunc calc double a_ , double r_ , var x_ , var y_
x_ = cos(a_)*r_+320f
y_ = sin(a_)*r_+240f
return x_-320f
kanahiron 2013/4/13(Sat) 09:39:28|NO.53539
これは浮動小数点演算の限界です
64bitのdouble型変数は14桁程度の精度しかありません
logを見る限り、これは達成できています
mesは小数点の7桁目を四捨五入して表示します
それ故に一見誤差は見られません
しかしstrfをつかって20桁くらいまで表示させるとめちゃくちゃなことがわかります
例えば、0.3を20桁のstrfでみると
0.2999999999999999000
になります
よって浮動小数点演算はifでの比較には向いていません
もし浮動小数点での比較をするなら一定の誤差を無視する必要があります
例えば
a = 2.000000000001
b = 1.99999999999
if a = b{
dialog
}
は
a = 2.000000000001
b = 1.99999999999
if (a - b) < 0.0000001 {
mes ""+a+"="+b
}
のようにします
暇人 2013/4/13(Sat) 10:13:42|NO.53540
精度に限界があるから足した数値を引いても元には戻らない事がある
だからsとfの内容が違うとしても実際の座標が違ってるかは不明
a=123.456789012345
mes strf("%4.15f",a)
a+100
mes strf("%4.15f",a-100)
それと計算後の結果を、そのまま=で比較は出来ないと思った方が良い
必要な桁以外を切り捨るとか余裕を持たせる比較をするしかない
座標が左右反転すれば良いだけなら
xを反転すれば良いだけだから
同じに出来なくは無いが・・・
r = 100f
a = 0f
*@
a += (m_pi/100)
redraw 0
color 255,255,255
boxf
color
line 0,240,640,240
line 320,0,320,480
s=calc(a,r,x1,y1)
f=calc(-a,-r,x2,y2)
if(absf(s) != absf(f)){
logmes strf("差異 %1.20f",absf(s)- absf(f))
title "差異Count"+Count
Count++
}
color:draw x1,y1
color 255:draw x2,y2
redraw
wait 30
goto*@b
#deffunc draw double x_ , double y_
#const c 3
line 320,240,x_,y_
circle x_-c,y_-c,x_+c,y_+c,1
pos x_,y_
mes x_-320f
return
#defcfunc calc double a_ , double r_ , var x_ , var y_
xx=cos(a_)*r_
x_ = xx+320f
y_ = sin(a_)*r_+240f
return xx
ツノン 2013/4/19(Fri) 14:08:32|NO.53582
kanahiron さん
暇人 さん
有難うございます解決しました。
ツノン 2013/4/19(Fri) 14:09:00|NO.53583
解決押し忘れました