HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
0413
ツノン座標の反転4解決


ツノン

リンク

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

解決押し忘れました



ONION software Copyright 1997-2023(c) All rights reserved.