-1

2D ゲームでの発射体のトレース パスの問題:

予測:

重力は一定で、風や抗力がないという単純化した仮定を行います。発射体の運動は、次の式で与えられます。

x = x0 + v0t cos(シータ)

y = y0 + v0t sin(シータ) + .5 gt^2

ここで、(x0, y0) は初期位置、v0 は初期速度 (大きさのみ)、theta は放出角度、g は重力加速度です。v0t の最初の方程式を解き、2 番目の方程式に代入すると、方程式 [1] が得られます。

y = y0 + (x-x0) tan(シータ) + .5 (g/v0^2) (x-x0)^2 / cos(シータ)^2

較正:

キャリブレーションは、実際の発射体から g の値を決定するプロセスです。そのために、ランダムな発射体を発射してキャプチャします。

  1. 開始点 (x0, y0)
  2. 照準ベクトル (v0、シータ)
  3. 曲線上のランダムな点 (x1, y1)

式 [1] に値を代入し、g について解くと、次のようになります。

g = (v0^2) * {[2 cos(シータ)^2 (y1-y0) / (x1-x0)^2] - [sin(2シータ) / (x1-x0)]}

応用:

g が得られたので、それを式 [1] に代入できます。これを使用して、任意の開始点と初期速度から発射体の経路を追跡できます。(ここがよく分からない部分です)

g=5.89

(x0,y0) 開始位置 = 0,0

初速度 = 1 ~ 100

放出角度 = 0-360

重力による加速度が 5.89 (このゲーム) である場合、1 ~ 100 の間の任意の初期速度、および 0 ~ 360 の間の任意の放出角度に対して、放物線の完全なプロットされたパスを取得する方法を誰か説明してください。位置は 0,0?

私は数学の完全な初心者であり、他の場所で見つけた太字の文字ではないこのすべてのものは、頭を悩ませてきました。私は何も知らないと仮定してください。

4

3 に答える 3

2

選択するv0 = 10theta = 60 degrees

tan(theta) = 1.732
cos(theta) = 0.5

したがって、式1は次のようになります(、、x0=0が与えられました)y0=0g=5.89

y = 1.732*x - 0.1178*x^2

直接プロットすることができます(yx):ここを参照してください

注:-重力の符号を修正しました。

于 2012-06-07T17:28:17.133 に答える
2

方程式の最初のセットと空間/時間制約で時間tのみを見逃し、発射物の最初の x 秒をプロットするか、発射物が境界ボックス m を離れるまで。したがって、擬似コードは次のようになります。

  • t=0; x(0)=ある座標; y(0)=別の座標
  • ループする
  • t=t+1
  • 座標の計算 {X(t=1), Y(t=1)}
  • この点と前の点の間の点または線を描画します
  • LOOP UNTIL t>time limit OR ポイント {X(t), Y(t)} がバウンディング ボックスの外にある

これがあなたの努力に役立つことを願っています

于 2012-06-07T15:50:26.037 に答える
0

これは非常に単純な学部物理の問題です。x 方向と y 方向のニュートンの法則から始めます。

x 方向の力の平衡

y 方向の力の平衡

初期条件付き:

時間ゼロでの x 変位

時間ゼロでの x 速度

時間ゼロでの y 変位

時間ゼロでの y 速度

ここで、Q は発射体の初速度、シータは銃が右を向いている場合に水平線から反時計回りに測定した角度で​​す。

したがって、それぞれを 1 回ずつ統合すると、次のようになります。

x速度対時間

y 速度対時間

初期条件の適用:

x 速度定数

y 速度定数

もう一度積分すると、次のようになります。

x 変位対時間

y 変位対時間

初期条件を再度適用します。

x 変位の初期条件

y 変位の初期条件

置換を行うと、銃が爆発した瞬間からの発射体の (u, v) 位置に必要な最終的な方程式が得られます。

時間の関数としての発射体の x 位置

時間の関数としての発射体の y 位置

座標系の原点を銃口の出口に置くと、2 つの初期変位はゼロになります。

これで、発射体の (u, v) 位置に関する 2 つの方程式が得られました。発射体の初速度と、水平線から右を向いて測定した銃の角度を差し込むことができます。

時間ゼロから開始し、時間の増分を選択して、好きなだけ長い時間間隔でループします。時間の現在の値をこれらの方程式に代入し、結果を評価し、時間を増やして、繰り返します。

水平線から反時計回りに 45 度の角度で銃を向け、毎秒 1000 インチで発射体を発射するとします。時間を進めて、発射体が放物線状の経路で右上に移動し、頂点に到達してから地平線に戻り始めるのを見ることができます。最終的に、y 変位はゼロに戻り、崖の端から撃ったかのように、負の領域に入り続けます。

発射体が地面に衝突するまでにどれくらいの距離を移動したかを知りたい場合は、高さがゼロ以下になったときにタイム ループを停止します。

地球に戻る時間

これがあなたのためのJava実装です:

package physics;

/**
 * CannonSimulator simulates shooting a projectile.  Users are responsible for making
 * sure that all constants use consistent units (e.g. meters for length, seconds for
 * time, kg for mass, etc.)
 * @author Michael
 * @since 6/14/12 9:47 PM
 * @link http://stackoverflow.com/questions/10935060/2d-projectile-tracing-path-clarification/11043389#11043389
 */
public class CannonSimulator {

    private double m;
    private double g;
    private double q;
    private double theta;

    public static void main(String[] args) {
        double m = ((args.length > 0) ? Double.valueOf(args[0]) : 1.0); // default mass is 1 kg
        double g = ((args.length > 1) ? Double.valueOf(args[1]) : 9.8); // default gravity is 9.8 m/sec^2
        double q = ((args.length > 2) ? Double.valueOf(args[2]) : 100.0); // default velocity is 100 m/sec
        double theta = ((args.length > 3 ? Double.valueOf(args[3]) : Math.PI/4.0)); // default angle is 45 degrees
        CannonSimulator simulator = new CannonSimulator(m, g, q, theta);
        double t = 0.0;
        double dt = 0.001; // time increment of 0.1 seconds
        while (simulator.v(t) >= 0.0) {
            System.out.println(String.format("time: %10.3f u: %10.3f v: %10.3f", t, simulator.u(t), simulator.v(t)));
            t += dt;
        }
    }

    public CannonSimulator(double m, double g, double q, double theta) {
        if (m <= 0.0) throw new IllegalArgumentException("mass must be greater than zero");
        if (g <= 0.0) throw new IllegalArgumentException("gravity must be greater than zero");
        if (q <= 0.0) throw new IllegalArgumentException("velocity must be greater than zero");

        this.m = m;
        this.g = g;
        this.q = q;
        this.theta = theta;
    }

    public double v(double time) {
        return time*(q*Math.sin(theta) - g*time/m);
    }

    public double u(double time) {
        return time*q*Math.cos(theta);
    }
}

それがこの問題を解決する方法です。

于 2012-06-15T01:02:55.610 に答える