2013-08-04 3 views
5

特定の座標に当たるために発射物を発射するのに必要な角度を計算しようとしています。仰角の異なる(0,0)以外の位置から座標(x、y)を打つのに必要な角度を計算する

私の発射体はランダムな座標にあり、ターゲットは静的な座標にあります。

Iは、(0,0)から(X、Y)の座標をヒットするために必要な角度を計算するためにウィキペディアに以下の式を横切って実行終わっ:

Iは、いくつかの試みを行っていますこれと他の数式を理解し、次の実装を試みました(私はC#とXNAを使用しています)。

double y = source.Y - target.Y; 
double x = Vector2.Distance(source, target); 
double v = 1440; //velocity 
double g = 25; //gravity 
double sqrt = (v*v*v*v) - (g*(g*(x*x) + 2*y*(v*v))); 
sqrt = Math.Sqrt(sqrt); 
double angleInRadians = Math.Atan(((v*v) + sqrt)/(g*x)); 

また、vとgの値が同じままである同一の角度が得られる以下のことも試みた。

double targetX = target.X - source.X; 
double targetY = -(target.Y - source.Y); 
double r1 = Math.Sqrt((v*v*v*v) - g*(g*(target.X*target.X) + ((2*target.Y)*(v*v)))); 
double a1 = ((v*v) + r1)/(g*target.X); 
angleInRadians = -Math.Atan(a1); 
if (targetX < 0) 
{ 
    angleInRadians -= 180/180*Math.PI; 
} 

私の推測も、私の(仮定)で、私はまだ未(0,0)、ソースと異なる高度での座標に対して正しく計算を行うわけではないことを、ソース座標ゼロにしようとしていることです。

以下は私の座標系を表す画像です。これはXNAのデフォルトです。

+1

私はあなたが(0,0)に、あなたの実際の位置を翻訳すべきだと思うベースのシステムで、そこに機能を実行し、(0,0から、最終的な変換を実行)実際のシステムに...重力以外の要因がないと仮定した場合、計算された角度はどのソースからも同じでなければなりません。 –

+0

発射経路に影響を与える他のパラメータ(入力)は何ですか?または他にどのような変数がありますか? –

+0

重力は負ではないと思われますか?私が正しく思い出すと-9.8m/sです。 –

答えて

2

この角度を見つけるためにコメントのヘルプソリューションのおかげで位置が(0,0)ベースのシステムに翻訳されることが必要となってしまいました。同じシナリオを探している人のために、最終的な作業溶液は:

double x = -(source.x - target.x); 
double y = (source.y - target.y); 
double v = 1440; //m/s 
double g = 25; //m/s 
double sqrt = (v*v*v*v) - (g*(g*(x*x) + 2*y*(v*v))); 
sqrt = Math.Sqrt(sqrt); 
angleInRadians = Math.Atan(((v*v) + sqrt)/(g*x)); 

そして、次の変換を実行し、XNAで動作するベクターにラジアンに変換するために:私は本当の問題を考える

Vector2 angleVector = new Vector2(-(float)Math.Cos(angleInRadians), (float)Math.Sin(angleInRadians)); 
+0

レコードの場合、他の誰かがこれを渡ってきて有用であるとわかった場合:戻り値は正規化されたベクトルです。私の場合は、発砲砲の速度でしかスケールすることができませんでした。 Java/libgdxを使用して: 'return angleVector.scl((float)RifleBullet.projectileSpeed);' – Jarmund

1

をarctanの使用にあります。範囲は-pi/2.pi/2に制限されているため、結果は右半面だけになります。

適切な座標を取得するために使用する上記Arctan2:

angleInRadians = Math.Atan2(((v*v) + tmp), (g*x)); 
関連する問題