2011-12-15 124 views
0

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

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

嘿!对不起,只是输入错误。 – MahanGM 2011-12-15 18:22:11

+1

您可以放弃对`Math.Sqrt`的调用 - 只需测试是否(dX * dX)+(dY * dY)<= Radius * Radius`。 – 2011-12-15 18:22:57

回答

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