2011-12-08 69 views
4

在圆形台球桌上,台球以一定的速度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来计算,使得入射角=反射(弹性碰撞)的角度θ PS:台球由具有速度矢量v(x,y)的点p(x,y)表示。仿真是,没有摩擦

+3

这个问题似乎并不是C++特有的。事实上,它似乎更像是一个数学问题而不是一个编程问题。 –

+0

你的初始速度在哪里?你如何表现? –

+0

类似'v_new = coeff *(v_old - 2 * dot(v_old,boundary_normal)* boundary_normal);'对于一些严重简化的物理? – Bart

回答

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(撞击后相同速度)之间的因素。你可以通过确定一个正确的恢复系数来使这更加物理上合理。

最后,上面的所有公式都是简单的reflection,例如您可能已经在基本的光线追踪器中看到过。如上所述,这是一个来自精确物理模拟的相当粗略的抽象,但很可能会完成这项工作。

+0

我更新了我的问题,以显示我的公式得出的结果。那里似乎有错误? – Ben

+0

您的正常情况是错误的。我写了normalize(c-p)。所以你的法线永远不会有250的长度。你需要规范化它。 – Bart

+0

谢谢,你是对的,我忘了。所以现在它适用于我的第一个问题更新中提到的情况。但是,对于其他情况,速度会增加(请参阅第二次更新)。 – Ben

0

正如评论所说,这是一个力学问题。 看看momentum的定义。 你特别想要的是弹性碰撞