2016-04-08 20 views
0

私はスヌーカーのゲームをコーディングしています。ボールを別のプログラムに衝突させる方法を理解するための最良の方法を決めました。かなり有能な数学者なので、私は座って、イベントを描いて実際に起こっていることの数学を見てきました。ボールが衝突する - vPythonの問題

私のアプローチは、xr成分が各ボールの中心を通るベクトルと一致する基準フレームにおいて、各ボールの初期速度をxr成分およびyr成分に分解し、yr-コンポーネントはこれに対して垂直です。次に、ボールのxr成分を単純に切り換え、yr成分をそのまま残してから、速度のx成分とy成分が標準参照フレームに戻ってくるものを計算します。

何らかの理由で、数学的なエラーかプログラミングエラーかにかかわらず、私はそれを動作させるようには見えません。以下は私が今までに持っていたもので、私が見つけることができるインターネット上の事実上すべての関連ページと、このサイトで尋ねられたすべての同様の質問です。私はまったく精通したプログラマーでもない。

from visual import * 

dt = 0.01 
r = 5 

red = sphere(pos=(-25,25,0),radius = r,color=color.red) 
green = sphere(pos=(25,-25,0),radius = r,color=color.green) 


red.velocity = vector(10,-10,0) 
green.velocity = vector(-10,10,0) 


def posupdate(ball): 

     ball.pos = ball.pos + ball.velocity*dt 


def ballhit(ball1,ball2): 

     v1 = ball1.velocity 
     v1x = ball1.velocity.x 
     v1y = ball1.velocity.y 
     v2 = ball2.velocity 
     v2x = ball2.velocity.x 
     v2y = ball2.velocity.y 
     xaxis = vector(1,0,0) 

     btb = ball2.pos - ball1.pos 
     nbtb = btb/abs(btb) 

     if abs(btb) < 2*r: 
       phi = acos(dot(nbtb,xaxis)/abs(nbtb)*abs(xaxis)) 
       ang1 = acos(dot(v1,xaxis)/abs(v1)*abs(xaxis)) 
       ang2 = acos(dot(v2,xaxis)/abs(v2)*abs(xaxis)) 

       v1xr = abs(v1)*cos((ang1-phi)) 
       v1yr = abs(v1)*sin((ang1-phi)) 
       v2xr = abs(v2)*cos((ang2-phi)) 
       v2yr = abs(v2)*sin((ang2-phi)) 

       v1fxr = v2xr 
       v2fxr = v1xr 
       v1fyr = v1yr 
       v2fyr = v2yr 

       v1fx = cos(phi)*v1fxr+cos(phi+pi/2)*v1fyr 
       v1fy = sin(phi)*v1fxr+sin(phi+pi/2)*v1fyr 
       v2fx = cos(phi)*v2fxr+cos(phi+pi/2)*v2fyr 
       v2fy = sin(phi)*v2fxr+sin(phi+pi/2)*v2fyr 

       ball1.velocity.x = v1fx 
       ball1.velocity.y = v1fy 
       ball2.velocity.x = v2fx 
       ball2.velocity.y = v2fy 

     return ball1.velocity, ball2.velocity 


while 1==1: 

     rate(100) 

     posupdate(red) 
     posupdate(green) 
     ballhit(red,green) 

ご協力いただきありがとうございます。

編集:衝突検出は問題ではなく、衝突後のボールの速度ベクトルの計算だけです。謝罪、私はそれをより明確にすべきだった。

+0

? – Carcigenicate

+0

ほとんどの場合、ボールの取る方向が間違っています。少数のもの、例えばX軸に沿った動きだけが適切に機能しますが、反発の方向は間違っています。 – Cowmilker

答えて

0

チェックアウトPhysics of Billiards:勢いの

保全は非弾性衝突を想定し、適用すると、運動エネルギーが保存されています。だから、(_0添字と_1は、衝突前と後を示している)は、次のベクトル方程式を得る:

m1*v1_0 + m2*v2_0 = M1*v1_1 + m2*v2_1 

0.5*m1*v1_0**2 + 0.5*m2*v2_0**2 = 0.5*m1*v1_1**2 + 0.5*m2*v2_1**2 

通常M1 ==平方メートル、そうするには、これらの簡素化:何をして動作していない

v1_0 + v2_0 = v1_1 + v2_1 

v1_0**2 + v2_0**2 = v1_1**2 + v2_1**2 
+0

問題は角度と関係がありますが、とにかく感謝します。私は前にその記事をチェックしました、そして、それは衝突で何が起こっているのかを理解することになると非常に便利です。私の主な問題はコードフォームに入れていることです。 – Cowmilker