4

下面是一个检测两个圆是否相交的函数。我想将其更改为仅检测圆圈的周边是否相交。因此,如果圆 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

你可以通过计算两个中心之间的距离来解决这个问题,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;
}
于 2012-09-03T16:02:50.517 回答
2

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

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

您可以添加一个检查来查看distance + radius1是小于radius2还是distance + radius2小于radius1,但是您需要distance是实际距离而不是它的平方。

于 2012-09-03T16:03:58.457 回答