2011-11-11 14 views
3

タイムステップベースのシミュレーションでは、円(xa)^ 2 +内側から開始した速度v(x、y)を持つ点パーティクルp(x、y) (yb)^ 2 = r ^は、その円が2つのタイムステップの間に発生し、衝突が検出されたときにポイントパーティクルがすでに円を離れるようになっています。衝突の解決 - 円の外側の点

したがって、正確に円の上にあるように、外の深さ(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試行、tについて1とrearangeで2と3に置き換え、次のように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)* T

Y = P(Y) - V(Y)*

トンいくつかのtについて。 discriminant(b^2 - 4acの条件文を使用)に応じて、ゼロ、1つまたは2つの解が存在する可能性があります。 2つの解(b^2> 4ac)がサイズ(p(x、y) - t(x、y))を最小にするtを選択する(pythagを使う)。戻る。

+0

あなたの解決策を試して質問を更新しました。最小限の詳細な説明方法を教えてください。 – Ben

+0

上記の式は、いくつかのt1((a、b)を中心とする円上の点を表す)変位ベクトル、v1(x、y)を与えます。ベクトルの加算(減算)を使用して、粒子の点と円上の点との間の変位ベクトルを求めます。すなわちdiffv = p-v1である。そのベクトル((x^2 + y^2)^ 1/2)の大きさを計算します。他の解決策t2についても同じことを行う。それらの間の変位ベクトルの最小の大きさを見つけて、粒子が円から出た点に近いと仮定します(コンスタント速度の場合は真)。それは出口点を定義します。 –

+0

Thx、問題は解決しました。 – Ben

0

あなたが新しいの欲しいです元の点(x、y)と同じ角度にあるが、移動した点を円の境界に移動するには、

(x -a) * r/d
を減算してx座標を調整し、
(y - b) * r/d
を減算してy座標を調整しますそれぞれxとyから。

+0

あなたのDは何ですか? – Ben