所以我正在编写一个斯诺克游戏,我决定找出如何让球相互碰撞的最佳方法是在一个单独的程序中这样做,然后将其复制进去。我就是这样做的。非常称职的数学家,所以我坐下来,吸引了这个事件并完成了实际发生的事情。
我的方法是打破每个球。在参考系中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 :(得分:0)
动量守恒适用,并且假设非弹性碰撞,动能得以保留。因此,您得到以下向量方程(下标_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