2011-11-11 80 views
3

在基於時間步的模擬中,從圓內(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; 

// ??? 

回答

1

同時解決(易代碼)

(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

0

您希望新指向與原點(x,y)相同的角度,但移入。要將點「in」移動到圓的邊界,請調整其x座標,方法是減去

(x -a) * r/d
,然後將y座標減去
(y - b) * r/d
從x和y分別。

+0

你的d是什麼? – Ben