0

これは、2 つの動くボールが衝突するビリヤード シミュレーションの衝突応答コードです。ニュートンの方程式の法則を使用し、速度ベクトルの成分をパラメータ化しました。

Alpha はボール 1
の軌道 Beta はボール 2 の軌道
Theta は軸に対する中心線の角度

私のアイデアは、2 つのボールのローカル フレームでの衝突応答の一般式を考え出し、それを固定フレームに再投影することでしたが、角度の問題がいくつかあることに気付きました。条件はアルファ用である必要があります

最後のビットは、衝突後にボールが重なり合っていないことを確認し、衝突の無限ループに陥らないようにすることです。

    def collision(b1,b2):

        dx=b1.x-b2.x
        dy=b1.y-b2.y
        Theta = atan2(dy,dx)
        Vx1=b1.speedx
        Vy1=b1.speedy


        Vx2=b2.speedx
        Vy2=b2.speedy

        V1 = sqrt((Vx1)**2+(Vx1)**2)
        V2 = sqrt((Vx2)**2+(Vx1)**2)
        Alpha = asin(Vx1/V1)
        Beta = asin(Vx2/V2)


       b1.speedx = (((1-e)/2)*V1*sin(Alpha-Theta) - ((1+e)/2)*V2*sin(Beta-Theta))*sin(Theta) - V1*cos(Alpha-Theta)*cos(Theta)
       b1.speedy = (((1-e)/2)*V1*sin(Alpha-Theta) - ((1+e)/2)*V2*sin(Beta-Theta))*cos(Theta) + V1*cos(Alpha-Theta)*sin(Theta)
       b2.speedx = (((1+e)/2)*V1*sin(Alpha-Theta) - ((1-e)/2)*V2*sin(Beta-Theta))*sin(Theta) + V2*cos(Beta-Theta)*cos(Theta)
       b2.speedy = (((1+e)/2)*V1*sin(Alpha-Theta) - ((1-e)/2)*V2*sin(Beta-Theta))*cos(Theta) - V2*cos(Beta-Theta)*sin(Theta)
4

1 に答える 1

0

角度の計算にasinを使用しないでください。(ベクトルの代わりに)角度を使用することを主張する場合は、atan2を使用する必要があります。

于 2013-01-22T23:11:39.560 に答える