2011-12-15 49 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,否則你可能會得到一個橢圓作爲參數,然後這個算法將不起作用。