2

私は、ボール[X、Y]の座標が定期的にインクリメントされるC#の簡単なプログラムに取り組んできました。

衝突検出方法を実装することができましたが、同じ直線経路に沿ってボールを跳ね返らせる角度でボールを反射する方法を決定しようとしています。

dx = -dx //This bounces the ball back along the same linear path
dy = -dy

ソリューション 三角法

theta = range between 0<theta<=360 depending on where it bounced
x = cos(theta)*time
y=  sin(theta)*time
4

4 に答える 4

9

ニュートン物理学の要点は、それがランダムではなく、決定論的であるということです。同じボールを同じ壁に同じ角度、同じ速度、同じスピンで投げると、毎回同じ場所にボールが行きます。

この種のプログラムは、プログラミングと物理学の両方にとって本当に素晴らしい学習の機会です。まず、非常に単純なバウンスをシミュレートするプログラムを作成することをお勧めします。お気づきのように、オブジェクトが真っ直ぐ下に移動して水平面に当たると、バウンスを単純に垂直速度成分を反転させるものとしてモデル化できます。正しく理解してください。重力も、何もありません。それは素晴らしいスタートです。

次に、同じ方法で、水平壁の跳ね返りを追加してみます。

次に、水平方向または垂直方向に位置合わせされていない壁の跳ね返りを追加してみてください。ここで、ベクトルと三角法がどのように機能するかを学ぶ必要があります。壁を斜めに打つことによって、ボールの速度のどの要素が変化するかを理解する必要があるからです。

次に重力を追加します。次に、空気からの摩擦を追加します。次に、ボールが回転している可能性があるという事実を追加します。ボールの変形をモデル化できるように、弾性を追加します。

その点に到達したら、ランダム性を導入したい場合は、それを行う方法を理解できるようになります。たとえば、「ボールが壁にぶつかって変形したときに、変形を0〜10%変化させるランダム要素を導入します」と言うことでランダム性を導入できます。これにより、シミュレーションがボールを跳ね返す方法が変わります。さまざまな種類のランダム性を試すことができます。たとえば、ランダムな気流を追加します。

于 2010-11-12T23:06:19.007 に答える
3

自分でランダム性を追加する必要があります。質問を言い換えると、「決定論的に、角度シータで跳ね返ります。角度シータ+イプシロンで跳ね返らせるにはどうすればよいですか。ここで、イプシロンはランダムな値です。」

ベクトルを回転させるには、これを参照してください。シータを指定するだけです。

擬似コード:

RotateVector(vec):
    bounce_vec = [-vec.x vec.y];  //deterministic answer is negative x, normal y
    bounce_angle = acos(dot(vec,bounce_vec) / (norm(vec)*norm(bounce_vec)));
    modified_angle = bounce_angle + random_number();
    ca = cos(modified_angle);
    sa = sin(modified_angle);
    rotation_matrix = [ca -sa; sa ca];
    return rotation_matrix * vec;

3行目は、余弦定理を使用して角度を計算しています。4行目では、その角度がランダムに変更されています。関数の残りの部分は、元のベクトルを新しい角度で回転させます。

于 2010-11-12T23:01:25.383 に答える
2

完璧な表面を持つ完璧なボールである限り、ランダムに跳ね返ることはありません。ベクトルも三角法もランダム性を与えません。

于 2010-11-12T22:50:18.570 に答える
0

「ランダムに、物理学の基本法則に適用しますが」は撞着語のようです。でも...

現在の速度を維持しながら、ランダムな方向にバウンスさせたい場合は、次のようにします(擬似コード)。

  • まず、標準的な方法で跳ね返ります(衝突に応じて、dx=-dxまたはdy=-dy)
  • 次に、dxとdyを極座標(シータとr)に変換します
  • シータを少しだけジッターします(好みに応じて、+または-数度)
  • 跳ね返ったばかりの壁にシータが向かっていないことを確認してください
  • thetaとrをdxとdyに変換し直します

それはスカラーの勢いを保存するでしょう。

于 2010-11-12T23:02:55.963 に答える