2017-11-18 3 views
1

私はcourseに登録しており、コードexampleからこの機能を持っています。最後の三つは、xおよびy位置、およびキャンバスに円の半径でありながらJavaScript - 私はこの衝突検出機能の仕組みを理解していません

function circRectsOverlap(x0, y0, w0, h0, cx, cy, r) { 
    var testX=cx; 
    var testY=cy; 
    if (testX < x0) testX=x0; 
    if (testX > (x0+w0)) testX=(x0+w0); 
    if (testY < y0) testY=y0; 
    if (testY > (y0+h0)) testY=(y0+h0); 
    return (((cx-testX)*(cx-testX)+(cy-testY)*(cy-testY))< r*r); 
} 

最初の4つの引数は、矩形のxおよびy位置、幅及び高さです。

長方形と円が接触すると、関数はtrueを返し、衝突が発生します。

答えて

3

testXとtestYは、四角形で囲まれた円の中心に最も近い点の座標になります。 4つのifテストは、円の中心がどちらの次元でもその外側にある場合、これらの値を四角形のエッジに「クランプ」します。円が四角形の内側にある場合を考えてみましょう。すべてのifが偽でtestXとtestYが円の中心の座標です。 return文のテストでは、Pythagorean Theoremを使用して、テストポイントが円の半径内にあるかどうかを判断します。

+1

多少は分かりますが、完全にはありません。斜辺がr * rよりも小さい場合、なぜそれがチェックされますか? –

+0

長方形の最も近い点が半径よりも円の中心に近い場合、それらはどこかで重なっています。長方形上の最も近い点と円の中心との間の距離二乗は、(cx-testX)*(cx-testX)+(cy-testY)*(cy-testY)であり、半径二乗はr * r 。著者はおそらく、書くのが簡単だったのですが、左側のJavaScriptのMath.sqrt()関数を使って、それがrよりも小さくなる必要がある(これは全く同じです)。 –

関連する問題