圆碰撞公式

本文关键字:碰撞 | 更新日期: 2023-09-27 18:18:04

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

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);

圆碰撞公式

检查两个圆圈是否重叠,您可以这样做:

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,否则您可能会得到一个椭圆作为参数,然后这个算法将无法工作。