2013-04-05 150 views
2

我想檢測圓形與矩形之間的碰撞,但不知道如何。圓形與矩形之間的碰撞

我知道如何檢測圓之間碰撞利用勾股定理這是圈:

(X2 - X1)^ 2 +(Y2 - Y1)^ 2 - (R2 + R1),但什麼是用C或C++編程語言檢測圓形和矩形形狀之間的碰撞的數學運算。

+0

也許你想測試多邊形之間的碰撞,而不是? ;) – Shark 2013-04-05 11:52:32

+0

你嘗試了什麼?你有沒有發現*可能是檢測這一部分的任何測試? – unwind 2013-04-05 11:52:43

+0

鯊魚多邊形也將是有用的,但我不知道如何 - 放鬆,爲什麼我要求幫助,因爲我不知道從哪裏開始 – 2013-04-05 11:53:52

回答

7

在碰撞檢測中,首先檢測簡單物體之間的碰撞然後專用於更復雜的物體通常是有益的。這被稱爲寬相和窄相碰撞檢測。我們的想法是,使用更簡單的算法來排除衝突首先會使對象更快速,因爲對象可以被證明不會發生碰撞。

您可以將所有對象初始建模爲包含可能更復雜真實形狀的圓或框。如果您發現這些物體正在碰撞,那麼您可以使用更復雜的算法來檢查碰撞。

衆所周知,對於所有的凸物體,如果兩個物體沒有碰撞,那麼你可以在它們之間找到一個平面。這被稱爲分離軸定理。既然圓和方形都是凸的,你可以用它設計一個算法來檢測它們之間的衝突。

您可以先搜索簡單的平面,例如平行於正方形邊緣的平面和那些與圓相切的平面。一個不錯的選擇是與物體的兩個中心之間的直線上的圓相切的平面,接着是圓的中心與每個角之間的直線。

一旦你找到了一個分離平面的對象不能碰撞,你可以停止搜索。

希望這會有所幫助。

(此應用的一個非常詳細的說明可以在這裏找到:http://www.metanetsoftware.com/technique/tutorialA.html#section1

1

一種解決方案是將矩形變成四個線段,然後測試它們的交點。

在僞碼:

for line in line-segments(rectangle) 
    if line.end1 inside circle or line.end2 inside circle 
     return true 
    if line intersects circle 
     return true 
return false 

這給出了兩種類型的測試:在圓

  1. 點 - 這是簡單的,從圓
  2. 線的中心的距離與一個圓的交點 - 這是更復雜一點(example
+0

我只是想要一些算法/數學公式來檢測圓和矩形的碰撞 – 2013-04-05 12:03:22

+0

@annaSjolvikaz,我相信上面就是這樣 - 它顯示如何檢測一個圓是否與一個矩形相交。 – 2013-04-05 13:12:30

3

的圓相交的矩形,如果圓的中心是矩形從圓的中心的距離內,或者如果到矩形邊界上的最近點小於圓的半徑。有九種可能性相對矩形圓的中心的位置,不同的地方在於它相對於它的擴展方面:

A|B|C 
-+-+- 
D|E|F 
-+-+- 
G|H|I 

如果E,明確了圓形和矩形相交。在A, C, G, I的情況下,您需要測試到最近角落的距離。在剩餘的情況下,使用從圓心到最近邊的點線距離。

+2

+1。注意:您的答案的第一句未能涵蓋案例E(想象一個大矩形內的小圓圈)。 – 2013-04-05 12:08:44

+0

@KlasLindbäck更正,謝謝。 – ecatmur 2013-04-05 12:35:07

0

如前所述,將您的矩形形狀分爲幾行,然後用算法here將各行與圓相交。