C++ 圆碰撞后的新速度

C++ 圆碰撞后的新速度,c++,collision,geometry,C++,Collision,Geometry,在圆形台球桌上,台球以一定速度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 vel

在圆形台球桌上,台球以一定速度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
double s=sqrt((p.x-a)*(p.x-a)+(p.y-b)*(p.y-b));
if(sr)//点位于圆外
//将点移回到圆上(我已经有了那个部分)
//计算新速度
现在,如何计算碰撞后的新速度v2,即入射角=反射角(弹性碰撞)


PS:台球由点p(x,y)和速度向量v(x,y)表示。模拟没有摩擦。

正如评论所说,这是一个力学问题。 请看一下定义。
“弹性碰撞”一节介绍了您特别想要的内容。

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

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


最后,上面所有的公式都很简单,就像你在基本光线跟踪器中看到的那样。如前所述,这是从精确的物理模拟中提取出来的一个相当粗糙的抽象,但很可能会完成这项工作

这个问题似乎不是C++特有的。事实上,它看起来更像一个数学问题而不是一个编程问题。你的初始速度在哪里?你是如何表示它的?类似于
v_new=coeff*(v_old-2*dot(v_old,boundary_normal)*boundary_normal