【发布时间】:2011-11-12 02:04:37
【问题描述】:
在基于时间步长的模拟中,点粒子 p(x,y) 与速度 v(x,y) 之间的碰撞,从圆内 (x-a)^2 + (y-b)^2 = r^,与那个圆,发生在两个时间步之间,这样当检测到碰撞时,点粒子已经离开了圆。
因此,我想将粒子向后移动一个量 outsideDepth(x,y),使其正好位于圆上。
现在的问题是:如何确定点p与速度矢量与圆的交点之间的距离l?
在代码中:
Vector2 circleCollision(double a, double b, double r, double x, double y){
double s = sqrt( pow((x-a),2) + pow((y-b),2) );
if (s>r) {
Vector2 outsideDepth = {0,0};
// determine depth by which point lies outside circle as vector (x,y)
return outsideDepth;
}
}
编辑尝试 Ian 的解决方案,将 2 和 3 替换为 1 并重新排列 t,然后按如下方式确定 p 和 q:
p = 1/( pow(v.x,2) + pow(v.y,2) ) * (-2*x*v.x + 2*v.x*a - 2*y*v.y + 2*v.y*b);
q = 1/( pow(v.x,2) + pow(v.y,2) ) * (-2*x*a -2*y*b + x*x + y*y + a*a + b*b - r*r);
root = sqrt( pow((p/2),2) - q );
t1 = -p/2 + root;
t2 = -p/2 - root;
// ???
【问题讨论】:
标签: c++ collision-detection geometry