2012-04-03 6 views
0

下のコードでは、thetaの小さな値に対してtheta xとyは滑らかに変化しますが、大きな値のthetaの場合は突然の変化が起こります。時間が経過したら、突然変更します。突然のxとyの値の変化

float tantheta=height/base; 

double theta=-Math.atan(tantheta);  

x=(int) (53*Math.cos(theta)+x0); 
y=(int) (53*Math.sin(theta)+y0); 
+1

'height'と' base'の種類は何ですか? – Attila

+0

複雑な数式を評価する場合、一般に数が大きいほど処理に時間がかかります。 * xとyはかなりの時間変化しません... *あなたはどれくらいの時間を見ていますか? – fireshadow52

+0

heightとbaseはintデータ型です。時間は、シータが小さくなると小さな増分で変化することを意味しますが、シータが大きくなると増分が大きくなります。 –

答えて

0

デビット、あなたの考えは正しいですが、私はそれを使って発射体の動きをシミュレートしたいと思っています。私の問題は、attilaのコメントに倍増するために高さと底面を変更することで解決されます。

2

あなたには、いくつかの長さ(高さとベース)を持って、その後、バック長さに、あなたは不必要な作業を行っている、角度(シータ)に変換するたびに。

ちょうど絵を描くには、底面と高さが正であると思ってください。数学はあらゆる基底と高さで機能します。

原点に1つの頂点があり、(底辺、高さに)別の頂点を持つ三角形を想像してください。三角形の辺は、(0,0)〜(base、height)、(0,0)〜(base、0)、(base、0)〜(base、height)です。 hypot = sqrt(base * base + height * height)としましょう。 θは原点における三角形の角度であることに注意してください。これは、cos(theta)= base/hypotとsin(theta)= height/hypotを意味します。

たとえば、xの式はx = x0 + 53 * base/hypotになります。

cosとsinのこれらの公式は、任意の基数と高さ、正または負の値で機能します。

ベースまたは高さがゼロに近い場合、浮動小数点エラーのために飛び跳ねることはほぼ確実です。これらは、シータの計算をスキップすると消えてしまいます。

関連する問題