检测圆圈A是否完全位于圆圈B内

l33*_*33t 4 c# math geometry collision-detection

下面是一个检测两个圆是否相交的函数.我想将其更改为仅检测圆圈的periferi是否相交.因此,如果圆圈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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 7

D说,你通过计算两个中心之间的距离来解决这个问题.如果有一个交叉点

abs(R1-R2) < D < R1+R2
Run Code Online (Sandbox Code Playgroud)

其中R1和R2是两个圆的半径.

第一个测试,abs(R1-R2) < D当一个圆圈的中心在另一个圆圈内时处理.第二个测试,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;
}
Run Code Online (Sandbox Code Playgroud)

如果性能在这里很重要,你可以不用这样的调用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;
}
Run Code Online (Sandbox Code Playgroud)