4

以下は、2つの円が交差するかどうかを検出する関数です。円のペリフェリが交差するかどうかだけを検出するように変更したいと思います。したがって、円Aが完全に円Bの内側にある場合、衝突はありません。

どのように?

private bool IsCircleCollision(
    int x1, int y1, int radius1,
    int x2, int y2, int radius2)
{
    int dx = x2 - x1;
    int dy = y2 - y1;

    int distance = (dx * dx) + (dy * dy);

    int radii = radius1 + radius2;
    if (distance < radii * radii)
    {
        return true;
    }
    else
    {
        return false;
    }
}
4

4 に答える 4

7

あなたは2つの中心間の距離を計算することによってこれを解決します、とDは言います。交差点がある場合

abs(R1-R2) < D < R1+R2

ここで、R1とR2は2つの円の半径です。

最初のテストでabs(R1-R2) < Dは、一方の円の中心がもう一方の円の中心にある場合を処理します。そして、2番目のテストはD < R1+R2、どちらの円にも他方の中心が含まれていない場合を処理します。

だから、私たちが持っているあなたのコードを適応させる:

private bool IsCircleCollision(
    int x1, int y1, int radius1,
    int x2, int y2, int radius2)
{
    int dx = x2 - x1;
    int dy = y2 - y1;

    double D = Math.Sqrt(dx*dx + dy*dy);
    return Math.Abs(radius1-radius2)<D && D<radius1+radius2;
}

Math.Sqrtここでパフォーマンスが重要な場合は、次のように呼び出すことなく実行できます。

private bool IsCircleCollision(
    int x1, int y1, int radius1,
    int x2, int y2, int radius2)
{
    int dx = x2 - x1;
    int dy = y2 - y1;

    int Dsqr = dx*dx + dy*dy;
    int rdiff = Math.Abs(radius1-radius2);
    int rsum = radius1+radius2
    return rdiff*rdiff<Dsqr && D<rsum*rsum;
}
于 2012-09-03T16:02:50.517 に答える
2

周囲長は、2つの中心間の距離が、2つの半径の合計以下であるが、それらの絶対差以上である場合にのみ交差します。この事実で、関数を書き直すのは難しいことではありません。

于 2012-09-03T16:03:29.207 に答える
0

distance + radius1がより小さいradius2distance + radius2より小さいかを確認するためのチェックを追加できますが、その場合は、その2乗ではなく実際の距離であるradius1必要があります。distance

于 2012-09-03T16:03:58.457 に答える
0
else if (Math.Sqrt(dx * dx + dy * dy) < Math.Abs(radius1 - radius2))
于 2012-09-03T16:06:03.617 に答える