碰撞解决 - 圆形外的点

3
在基于时间步骤的模拟中,一个点粒子p(x,y)以速度v(x,y)从圆内部(x-a)^2 + (y-b)^2 = r^出发,与该圆发生碰撞,在两个时间步骤之间发生,以至于当检测到碰撞时,点粒子已经离开了圆。
因此,我想将粒子后移外深度(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's方案,将1中的2和3替换并重新排列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;

// ???
2个回答

1

同时解决(简单代码)

(x-a)^2 + (y-b)^2 = r^2

x = p(x) - v(x)*t

y = p(y) - v(y)*t

对于某些 t。根据 判别式(在 b^2 - 4ac 上使用条件语句),可能有零、一个或两个解。如果有两个解(b^2 > 4ac),选择最小化 size(p(x,y) - t(x, y)) 的 t(使用勾股定理)。返回。


我已经更新了我的问题,并尝试了您的解决方案。您能否详细解释一下如何找到最小值?谢谢。 - Ben
以上方程将给出一个位移向量v1(x, y),假设对于某个t1(表示圆心为(a, b)的圆上的一个点)。通过使用向量加法(减法)找到粒子点和圆上点之间的位移向量,即diffv = p - v1。然后计算该向量的大小((x^2 + y^2) ^ 1/2)。对于另一个解t2也做同样的操作。找到它们之间位移向量的最小大小,并假设粒子更靠近它离开圆的那个点(对于恒定速度是正确的)。那么t将定义出口点。 - Ian Haggerty

0

你希望新点与原始点(x, y)具有相同的角度,但向内移动。要将您的点“向内”移动到圆的边界,请通过从x和y中分别减去

(x -a) * r / d
(y - b) * r / d
来调整其x坐标和y坐标。


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