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

时间:2012-09-03 15:59:33

标签: c# math collision-detection geometry

下面是一个检测两个圆是否相交的函数。我想将其更改为仅检测圆圈的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;
    }
}

4 个答案:

答案 0 :(得分:7)

D说,你通过计算两个中心之间的距离来解决这个问题。如果

,就会有一个交叉点
abs(R1-R2) < D < R1+R2

其中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;
}

如果这里的表现非常重要,那么您可以在不调用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;
}

答案 1 :(得分:2)

当且仅当两个中心之间的距离小于或等于两个半径之和但大于或等于其绝对差值时,周长才会相交。有了这个事实,重写函数应该不难。

答案 2 :(得分:0)

您可以添加一项检查,以查看distance + radius1是否小于radius2distance + radius2是否小于radius1,但您需要distance }是实际距离而不是它的正方形。

答案 3 :(得分:0)

else if (Math.Sqrt(dx * dx + dy * dy) < Math.Abs(radius1 - radius2))