让两个球,其中一个在笛卡尔坐标平面上移动,而另一个是静止和不动的。在某些时候,移动的球与惰性球碰撞。假设移动的球在一条直线上行进,在得到以下信息的情况下,如何得出移动球将被推进的新角度:
移动球的中心坐标(X0,Y0),半径(R0)和撞击前的行进角度(A0)
固定球的中心坐标(X1,Y1)和半径(R1)
答案 0 :(得分:12)
如果你的第二个球有无限质量:
phi(长时间计算后)是:
phi= -ArcTan[
( 2 R^2 Sin[A0] + 2 (YD Cos[A0] - XD Sin[A0]) (2 H Cos[A0] +
2 XD Sin[A0]^2 - YD Sin[2 A0])) /
((2 R^2 - XD^2 - 3 YD^2) Cos[A0] + (XD^2 - YD^2) Cos[3 A0] +
8 XD YD Cos[A0]^2 Sin[A0] + 4 H Sin[A0] (-YD Cos[A0] + XD Sin[A0]))
]
其中:
H = (R0 + R1)^2 - ((Y0 - Y1) Cos[A0] + (X0 - X1) Sin[A0])^2
R^2 = (R0 + R1)^2
XD = X1 - X0
YD = Y1 - Y0
修改强>
要确定整个轨迹,您还需要在撞击时移动球的中心坐标。他们是:
{X,Y}= {X1+Sin[A0] ((Y1-Y0) Cos[A0]+ (X0-X1) Sin[A0])-Cos[A0] Sqrt[H],
Y1+Cos[A0] ((Y0-Y1) Cos[A0]+(-X0+X1) Sin[A0])-Sin[A0] Sqrt[H]}
答案 1 :(得分:4)
Pool Hall Lessons by Joe van den Heuvel, Miles Jackson的第3页给出了如何做到这一点的一个很好的例子。
// First, find the normalized vector n from the center of circle1 to the center of circle2
Vector n = circle1.center - circle2.center;
n.normalize();
// Find the length of the component of each of the movement vectors along n.
float a1 = v1.dot(n);
float a2 = v2.dot(n);
float optimizedP = (2.0 * (a1 - a2)) / (circle1.mass + circle2.mass);
// Calculate v1', the new movement vector of circle1
// v1 = v1 - optimizedP * m2 * n
Vector v1 = v1 - optimizedP * circle2.mass * n;
// Calculate v2', the new movement vector of circle2
// v2 = v2 + optimizedP * m1 * n
Vector v2 = v2 + optimizedP * circle1.mass * n;
circle1.setMovementVector(v1);
circle2.setMovementVector(v2);
至少阅读第三页,了解这里发生的事情。
答案 2 :(得分:3)
您应该查看维基百科上的elastic collision
文章。我会在这里解释,但我可以说的一切,维基百科说它更好,并有明确的例子和方程式。
答案 3 :(得分:2)
你需要清楚群众。可能你假设两个球都具有相同的质量,而不是一个具有无限质量的球。
第二件事是:您是否有兴趣考虑滚动约束和线性动量。你会遇到的一种简单的弹性碰撞的对话就会忽略这一切。作为一个例子,考虑在水池/斯诺克中投球,你故意将球从中点击出以产生前或后旋。
你想要这样做吗?
如果是这样,你需要考虑旋转球和表面之间的摩擦。
例如,在滚球和静止球之间的“简单”直接碰撞中,如果我们假设完全有弹性(再次不完全正确):
对于简单的情况,如果转换为质心的坐标,则计算会更容易。在那个框架中,碰撞总是直接碰撞,反转球的方向。然后你转换回来得到结果。
假设在v1和w1影响之前的质量和速度。
V0 = centre of mass speed = (v1+w1)/2
v1_prime = v of mass_1 in transformed coords = v1 - V0
w1_prime = w1 - V0
发生碰撞后,我们有一个简单的反思:
v2_prime = -v1_prime (== w1_prime)
w2_prime = -vw_prime (== v1_prime)
v2 = v2_prime + V0
w2 = w2_prime + V0
答案 4 :(得分:0)
它只是从静止球反射出来。因此,计算接触点(球的中心将分开R0 + R1),反射轴将是连接中心的线。
编辑:我的意思是在接触点连接中心的线将有一个角度,你可以使用这个角度来帮助计算移动球的新角度。