我有这个简单的圆碰撞检测公式:
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);
答案 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
函数,但这不会影响正确性。
您的代码不起作用,因为您使用Left
和Top
而不是中心的位置。如果半径相同,左上角之间的差异与中心之间的差异相同。这解释了为什么您的代码仅适用于该特殊情况。
不确定为什么使用矩形来表示圆圈。您可以将中心计算为centerX = 0.5*(Left+Right)
。您还应该添加Width==Height
的检查,否则您可能会获得椭圆作为参数,然后此算法将无效。