任意の時点での矢印の角度が必要です。角度を計算するために、接線があることを思い出しました。しかし、ここであなたの思考がうまくいかなくなったのです:
- 必要なのはデルタy /デルタxです。これは、勾配が変化率(他の回答の1つで言及されている)であるためです。xは、dxではなく、ある瞬間の位置にすぎないことに注意してください。
それでは、空気の摩擦を無視すると、矢印のx速度は一定になります。
まず、速度をx成分とy成分に分解します。45度または60度の角度で撮影できます。したがって、launchVelocityと角度が必要です。これはスカラーではありません。
第二に、すべてをフロートではなくダブルとして計算します。あなたは、丸め誤差があなたを殺さないときを知るほど数値的に洗練されていないので、試みないでください。いずれにせよ、それは素晴らしい時間の節約にはなりません。
第三に、Math.powを使用しないでください。これは遅く、整数の累乗の乗算ほど正確ではありません。また、Hornerのフォームを使用することで時間を大幅に節約できます(以下を参照)
final double DEG2RAD = Math.PI/180;
double ang = launchAngle * DEG2RAD;
double v0x = launchVelocity * cos(ang); // initial velocity in x
double v0y = launchVelocity * sin(ang); // initial velocity in y
double x = (v0x * time);
// double y = (v0y * time) + (0.5 * g * (float)Math.Pow(time, 2));
double y = (0.5 * g * time + v0y) * time
パフォーマンスに必死な場合は、0.5 * gを事前計算することもできますが、上記のコードを使用すると、狂ったことを何もせずに、そこから90%の方法で処理できます。必要に応じてこれを1000万回行うベンチマークは、確かに膨大な時間ではなく、割合的にはかなり大きいです-Javaではライブラリが非常に遅い
したがって、矢印が進むべき角度が必要な場合は、
atan(dy/dx)
この場合、dxは定数であるため機能します。しかし、一般に、dxはゼロになる可能性があるため、通常は以下を使用します。
atan2(dy, dx)
これは、このジョブ専用に設計された機能です。
しかし、私が言ったように、Javaのライブラリ関数はひどく遅いので、この場合、上記の@FxIIIで言及されていないように、それを行うより良い方法があります。
水平速度が常にv0xで、垂直速度が次の場合:
double vy = v0y - 0.5 * g * time;
あなたのデルタは:vx、vy
角度は必要ありません。矢印を描くには、名目上は次のようなものを使用します。
plot(x、y、x + vx、y + vy);
何を描いているのかわかりませんので、(JOGLを使用しているように)回転させるために角度が必要な場合は、角度を使用してください。
ATAN2はラジアンを返すため、openglを使用して角度を度に戻すことを忘れないでください。
final double RAD2DEG = 180 / Math.PI;
double ang = Math.atan2(vy,vx); // don't forget, vy first!!!
double deg = ang * RAD2DEG;