圆形碰撞后的新速度

3
在一个圆形的台球桌上,台球以速度v1撞击该桌子的边界。检测到这种碰撞的方法如下:
double s = sqrt( (p.x-a)*(p.x-a) + (p.y-b)*(p.y-b) );
if (s<r)        // point lies inside circle
                    // do nothing
else if (s==r)  // point lies on circle
                    // calculate new velocity
else if (s>r)   // point lies outside circle 
                    // move point back onto circle (I already have that part)
                    // calculate new velocity

现在如何计算碰撞后的新速度v2,使得入射角等于反射角(弹性碰撞)?
注:台球被表示为一个点p(x,y),具有速度向量v(x,y)。模拟中没有摩擦。

3
这个问题似乎与C++无关,实际上更像是一个数学问题而不是编程问题。 - Björn Pollex
基本物理学 - 详见:http://en.wikipedia.org/wiki/Coefficient_of_restitution - Paul R
@Tim 我更新了问题,速度只是一个向量。 - Ben
边界法线就是在撞击点处圆形台球桌的(向内指向)法线。如果您不关心准确性,那么coeff只是0到1之间的一个虚假因子。否则,它就是Paul所暗示的(仍然在0到1之间)。 - Bart
@juanchopanza 这是一个二维的圆,如果你是想问它如何轴对齐,那么它并没有旋转。这是完全弹性碰撞。对于矩形来说,沿着x或y轴翻转是可行的,但是对于圆形不行。我已经尝试过了。 - Ben
显示剩余7条评论
2个回答

3

假设您正在制作一些简单的(类似游戏的)台球模拟,您可以使用以下内容:

v_new = coeff*(v_old - 2*dot(v_old, boundary_normal)*boundary_normal);

这里,v_old 是您当前的速度向量,boundary_normal 是撞击点处圆形台球桌内向的法向量。如果您知道圆形桌的中心c并且有撞击点p,则法向量就是normalize(c-p),也就是从c中减去p后得到的归一化向量。
现在,我将coeff定义为一个调整因子,介于0(撞击后完全没有速度)和1(撞击后速度不变)之间。您可以通过确定正确的恢复系数来使其更具物理可行性。
最终,上述公式实际上就是简单的反射,就像您可能在基本的光线追踪器中看到的那样。正如前面所说,这只是一个粗略的抽象,不太准确地模拟了物理过程,但很可能能完成工作。

我更新了我的问题,展示了使用你的公式得到的结果。似乎有一个错误? - Ben
谢谢,你说得对,我忘记了。现在它可以处理我第一个问题更新中提到的情况。然而,对于其他情况,速度会增加(请参见第二个更新)。 - Ben
你得到了什么?你的系数是多少?你的法线仍然不正确。你如何进行归一化? - Bart
我在我的问题中添加了源代码(在底部)。你能看一下哪里出了问题吗?我使用1作为系数,以使碰撞后的速度与碰撞前的速度相同。 - Ben
太好了。也许你现在可以将问题简化到必要的部分。这样对于未来的访问者可能会再次有用。 - Bart
显示剩余3条评论

0

正如评论所说,这是一个力学问题。 请查看动量的定义。 你特别想要的内容在弹性碰撞部分有涉及。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接