0

大きな円の中に小さな円があります。小さな円が飛び交っていて、小さな円が大きな円の境界に来たら衝突するはずです。私はほとんどそうすることができましたが、それでも完全には機能しません。円が境界の直前で衝突することもあれば、境界の直後で衝突することもあります。これは私のコードです:

    if (!(Math.pow((xSmallCircle + radiusSmallCircle) - (xBigCircle), 2) + Math.pow((
    ySmallCircle + radiusSmallCircle) - yBigCircle, 2) < Math.pow(radiusBigCircle + 10, 2))) {
                                    xVelocity *= -1;
                                    yVelocity *= -1;
    } else if (!(Math.pow((xSmallCircle - radiusSmallCircle) - (xBigCircle), 2) + Math.pow((
    ySmallCircle - radiusSmallCircle) - yBigCircle, 2) < Math.pow(radiusBigCircle + 10, 2))) {
                                        xVelocity *= -1;
                                        yVelocity *= -1;
    } else if (!(Math.pow((xSmallCircle + radiusSmallCircle) - (xBigCircle), 2) + Math.pow((
    ySmallCircle - radiusSmallCircle) - yBigCircle, 2) < Math.pow(radiusBigCircle + 10, 2))) {
                                        xVelocity *= -1;
                                        yVelocity *= -1;              
    } else if (!(Math.pow((xSmallCircle - radiusSmallCircle) - (xBigCircle), 2) + Math.pow((
    ySmallCircle + radiusSmallCircle) - yBigCircle, 2) < Math.pow(radiusBigCircle + 10, 2))) {
                                        xVelocity *= -1;
                                        yVelocity *= -1;
                        } 

これが機能しない理由はありますか?

4

1 に答える 1

0

これは、実際にはすべて内側の円の外側にある4つのポイントでのみ衝突をチェックしているためです。より単純で数学的に正しい衝突検出メカニズムを試してください。

var sep = Math.sqrt(
      Math.pow(xSmallCircle-xBigCircle, 2) 
      + Math.pow(ySmallCircle-yBigCircle, 2)
);
if( sep + radiusSmallCircle + borderWidthSmallCircle >= radiusBigCircle ){
    //You have a collision Here
}

ここでの論理は、各円の中心間の線分の長さを計算し、小さな円の半径を追加すると、(a)外側の円と同心である最小の円の半径を取得するというものです。 (b)小さい方の円を完全に囲みます。その円が外側の円よりも大きいか同じサイズの場合、衝突が発生します。

それでも不正確な衝突がある場合は、丸め誤差である可能性があります。

于 2012-10-09T22:48:14.927 に答える