2012-02-17 43 views
0

私はボールが画面上でバウンドしていて、衝突する可能性のある静的な四角形があり、跳ね返るはずです。ボールが矩形に衝突しているかどうかをテストする方法はすでにわかっていますが、それはうまくいきます。今度はボールが当たった矩形のどの辺を決定する必要があります。私は現在、誰もが、私はこれを改善することができますどのように任意のアイデアを持っています(四辺をテストするために動作しますが、コーナーに問題があるようです)このコード...円と矩形の衝突Android

if(Math.abs(ball.centerY-boundingBox.top) < ball.radius) { 
    // Hit the top 

} 
else if(Math.abs(ball.centerY-boundingBox.bottom) < ball.radius) { 
    // Hit the bottom 

} 
else if(Math.abs(ball.centerX-boundingBox.left) < ball.radius) { 
    // Hit the left 

} 
else if(Math.abs(ball.centerX-boundingBox.right) < ball.radius) { 
    // Hit the right 

} 

...をしようとしていますか?それとも、より良い解決策を思いつきますか?

私は、基本的には、衝突した後にどの辺が四角形に当たったのかを判断する必要があります。そして、私はすでに彼らが衝突するかどうかをテストする方法を考え出しました。

ありがとうございます!

答えて

1

ボールがコーナーに当たったときに、同時に2面に当たってしまうため、おそらくコーナーでは機能しません。それを正確にバウンスさせるために探しているのであれば、関連する法線ベクトルは、ボールの中心からコーナーまでの垂直ベクトルです。これは、水平と垂直の間の対角線になります。内外の衝突を処理するために - -

// is the ball above the box? 
if(Math.abs(ball.ballCenterY-boundingBox.top) < ball.radius) 
{ 
    if(ball.ballCentreX >= boundingBox.left) 
    { 
     if(ball.ballCentreY <= boundingBox.right) 
     { 
      // ball hit the top edge 
     } 
     else 
     { 
      // ball hit the top right corner 
     } 
    } 
    else 
    { 
     // hit top left corner 
    } 
} 

より良いテストになります。ボールの中心が長方形の外側にある間、あなたは常に重複を検出すると仮定すると、

、何あなたはおそらくやりたいことのようなものがあります各辺の最も近い点までの距離を見つけ、最小の距離を選び、次に最も近い点がコーナーであるならコーナーの衝突、それ以外はサイドの衝突です。

+0

最も近い点を見つけることについてのあなたの最後のコメントは、私が現在どのように私の初期衝突検出を行っているかです。私は、最も近い点が角であるかどうかをテストすることについてあなたの考えが好きです。それがコーナーであると仮定すると、それに基づいてどの側面を決定するかについてどのような考えがありますか?それが隅に向かって直接行っていないと仮定します。途中であなたの答えをありがとう! – DRiFTy

+0

コーナーが2つの側面に属しているのでコーナーに当たっても固有の側面はありません。しかし、もしあなたが1つを選ぶ必要があれば、右上隅に当たったと仮定すると、コーナーから球の中心までのベクトルが垂直に近い場合は、上端を選択し、水平に近い場合は右端を選択しますこれはx座標とy座標の絶対値の比較です)、正確に45度であれば優先度なしです。 – Tommy

+0

私は今、それがコーナーに当たったときにそれを選ぶように作った。あなたがいくつかの洞察力を持っているかもしれないちょっとした小さな問題...ボールが矩形の頂点を横切って本当にゆっくりと転がり、転倒しようとしているとき、角に達すると少し跳ね上がります。それでも同じ一般的な道をたどりますが、ちょうどよく見えません。コーナーはとてもうまく処理されているようですが、それではありがとうございます。 – DRiFTy