5

ボールを窓の周りで跳ねさせようとしています。ボールが壁に当たる距離と角度に応じて、反射が決まります。写真では、黒い軌道が内側半分の反対側の壁に当たっていることがわかります...そして、灰色の軌道は、反射して残りの半分に当たった場合を表しています...反射角が減少します.

私はそれについて正しく考えているかどうかわかりません... 座標を度で表そうとしています。

写真を考えると...あなたはそれらのデルタを取り、次に度を取得します...

度 = Math.atan2(反対/隣接) = (-4/-2)

ここに画像の説明を入力

私のコード

public class Calculate {

public Calculate() {
    System.out.println(getCalc(7,5,4,0));       
}

public double getCalc(int x1, int x2, int y1, int y2) {
    double deltaX = Math.abs(x2-x1);
    double deltaY = Math.abs(y2-y1);
    double degrees = Math.toDegrees((java.lang.Math.atan2(deltaX, deltaY)));

    return degrees;
}

}

次の出力が得られます。26.56505117707799

これで、ボールが壁から 26 度で反射することがわかりました (これが入射角であるため)。しかし、ボールが必ずしも各壁から一様に反射することを望んでいないので、変動性が追加されます。

私の質問:

  • ボールの角度を正しく計算していますか?
  • 壁に当たった場所に基づいて、バウンスに変動性を追加するにはどうすればよいですか?
  • 角度を度単位で取得したら、それを座標に変換するにはどうすればよいですか?

ありがとうございました!

4

3 に答える 3

2

ボールの角度を正しく計算していますか?

あなたの図面は縮尺通りではありません。26 度は、壁に垂直な線から測定されます。

壁に当たった場所に基づいて、バウンスに変動性を追加するにはどうすればよいですか?

あなたはすでにランダムな角度を提案しました。壁の中心からの距離に基づいて反射角度を調整することもできます。

反射角度の計算を独自の方法に入れます。計算によって、探している「ランダム性」が得られるまで、計算を調整できます。

角度を度単位で取得したら、それを座標に変換するにはどうすればよいですか?

度をラジアンに変換してから、三角形の SAS を計算します。モデルに角度をラジアンのままにして、表示/診断メソッドで度に変換するだけです。

于 2013-07-26T15:41:00.127 に答える
1

少しランダムに見えるようにしたい場合は、スピンをいくらかモデル化できます。複雑すぎる必要はありません。

回転せずに 45 度の角度で壁にぶつかると、ボールにスピンがかかります。次の壁にぶつかると、スピンが角度に追加され、スピンは角度だけ増加 (または減少) します。スピンと角度の組み合わせも、壁から落ちる速度に影響すると思います(実際の状況を視覚化するだけです)

それは真にランダムでなくても変化します-しかし、実際にどのように見えるかはわかりません-他の制限を適用する必要があるかもしれません(最大スピンを制限する方法が必要だと思います)。

ルールを作りたくないのであれば、数学に深く入り込まずにこれをモデル化するのに十分な単純な物理学の本が周りにあるに違いありません。

于 2013-07-26T15:51:47.627 に答える
1

球面からの距離は角度にあまり影響しないと思います。ボールが表面に当たる前の角度は、表面を離れるときに同じ(鏡面反射)である必要があり、それは自然です。

ゴムボールは力などによって少しずつ変化するので、反射は毎回全く同じではないので、ゴムボールがどうなるかを考えて変化を加えることができます。ランダムに1度または2度を追加または削除して、それがどのようになるかを確認するだけです.

角度ができたら、三角法に戻ります。角度があり、斜辺がわかっています (フレームレートとボールの速度によっては、ボールが表面から一定量移動したと思います)。そのため、三角形の隣接する線と反対の線を取得する必要があります。

例えば:

sin(angle) * hypothenuse = opposite (so Y offset from the surface).

cos(angle) * hypothenuse = adjacent (so X offset from the point of contact).

接触点の座標から隣接する値と反対の値を (方向に応じて) 追加または削除するだけです。

于 2013-07-26T15:41:27.150 に答える