圆碰撞公式

时间:2011-12-15 18:16:59

标签: c# collision-detection

我有这个简单的圆碰撞检测公式:

private bool CircleCollision(Rectangle Circle1, Rectangle Circle2)
{
    int X1 = Circle1.Left;
    int Y1 = Circle1.Top;
    int X2 = Circle2.Left;
    int Y2 = Circle2.Top;

    int R1 = Circle1.Width / 2;
    int R2 = Circle2.Width / 2;
    int Radius = R1 + R2;

    int dX = X2 - X1;
    int dY = Y2 - Y1;

    if (Math.Sqrt((dX * dX) + (dY * dY)) <= Math.Sqrt(Radius * Radius)) 
        return true; 
    else 
        return false;
}

但只要两个圆具有相同的半径,它就会暴露出检测。我做错了什么?

解决

int X1 = Circle1.Left + (Circle1.Width / 2);
int Y1 = Circle1.Top + (Circle1.Height / 2);
int X2 = Circle2.Left + (Circle2.Width / 2);
int Y2 = Circle2.Top + (Circle2.Height / 2);

1 个答案:

答案 0 :(得分:2)

要检查两个圆圈是否重叠,您可以执行以下操作:

var radius=circle1.Radius+circle2.Radius;
var deltaX=circle1.CenterX-circle2.CenterX;
var deltaY=circle1.CenterY-circle2.CenterY;
return deltaX*deltaX + deltaY*deltaY <= radius*radius;

请注意,我正在计算中心的距离,而不是左上角的距离。我也在比较半径的平方,所以我不需要使用昂贵的Math.Sqrt函数,但这不会影响正确性。

您的代码不起作用,因为您使用LeftTop而不是中心的位置。如果半径相同,左上角之间的差异与中心之间的差异相同。这解释了为什么您的代码仅适用于该特殊情况。

不确定为什么使用矩形来表示圆圈。您可以将中心计算为centerX = 0.5*(Left+Right)。您还应该添加Width==Height的检查,否则您可能会获得椭圆作为参数,然后此算法将无效。