Collision Resolving - Point outside Circle

问题描述:

在基于时间步的模拟中,从圆内(xa)^ 2 +中开始的点粒子p(x,y)与速度v(x,y) (yb)^ 2 = r ^,这个圆圈出现在两个时间步长之间,这样当检测到碰撞时点粒子已经离开了圆。Collision Resolving - Point outside Circle

因此我想将粒子移回数量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; 
    } 
} 

EDIT尝试在Ian的溶液,代替图2和3在1和rearange为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; 

// ??? 

同时解决(易代码)

(XA)^ 2 +(YB)^ 2 = R^2

X = P(X) - V(x)的*吨

Y = p(Y) - v(Y)* T

一些吨。根据discriminant(在b^2 - 4ac上使用条件),可能有零个,一个或两个解决方案。如果两个解(b^2> 4ac)选择使大小最小化的t(p(x,y)-t(x,y))(使用pythag)。返回。

+0

我已经更新了我的问题,试图解决您的问题。你能否解释一下如何找到更多细节的最低要求。 – Ben

+0

上面的方程将给出位移矢量v1(x,y),例如对于某些t1(表示以(a,b)为中心的圆上的点)。通过使用矢量加法(减法)来查找粒子点与圆上点之间的位移矢量。即diffv = p-v1。然后计算该向量的大小((x^2 + y^2)^ 1/2)。对另一个解决方案t2做同样的事情。找到它们之间的位移矢量的最小量值,并且假设粒子更接近它离开圆的点(对于常速而言为真)。这将定义出口点。 –

+0

Thx,问题解决了。 – Ben

您希望新指向与原点(x,y)相同的角度,但移入。要将点“in”移动到圆的边界,请调整其x坐标,方法是减去

(x -a) * r/d
,然后将y坐标减去
(y - b) * r/d
从x和y分别。

+0

你的d是什么? – Ben