2016-04-08 80 views
0

所以我編了一個斯諾克遊戲,我決定找出如何讓球相互碰撞的最好方法是在一個單獨的程序中這樣做,然後複製它。我是一位非常出色的數學家,所以我坐下來,畫出了這個事件,並通過了實際發生的事情的數學。球碰撞 - vPython問題

我的方法是將每個球的初始速度分解爲xr和yr分量,在xr分量與通過每個球中心的向量一致的參照系中,並且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 == M2,所以這些簡化爲:

v1_0 + v2_0 = v1_1 + v2_1 

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

問題更多的是與角度,但無論如何感謝。我之前已經檢查過這篇文章,並且在瞭解碰撞事件時非常方便。我的主要問題是編碼形式。 – Cowmilker