2011-06-02 226 views
3

找出一個軸對齊的矩形是否與一個旋轉的矩形發生碰撞,最有效的方法是什麼?每個類都有一個位置矢量和一個大小矢量,旋轉的類有一個角度值。旋轉矩形碰撞

+0

你正在尋找的重疊,還是一個真正有關聯的速度它? – phkahler 2011-06-02 17:16:15

+0

只是靜態重疊。 – Matt 2011-06-02 17:22:15

回答

5

你想使用分離軸定理(SAT)。通常它用在3d中,但它很好地摺疊到2d。既然你已經有了一個特殊的情況下,你需要考慮的唯一軸線是你的矩形的4個主要軸線:

 
[ 1,0 ] 
[ 0,1 ] 
[ sin(theta), cos(theta) ] 
[ -cos(theta), sin(theta) ] 

要檢查一個軸,計算與軸每個頂點的點積。然後檢查兩組值的最小值和最大值,看它們是否重疊。如果4軸中的任何一個給出不重疊的範圍,則矩形不重疊(您已經找到了分離軸)。如果所有4軸都顯示重疊,則矩形相交。

這裏有一個同樣的問題最近SO問題: Separating Axis Theorem and Python

這裏是維基百科的文章

http://en.wikipedia.org/wiki/Separating_axis_theorem

3

最有效的方法是創建一個更大的矩形,它限制旋轉的矩形,並基於邊界矩形執行碰撞檢測。

這意味着邊界矩形衝突並不表示「點擊」,而是需要進一步調查的條件。調查手段根據您可以做出的假設而有所不同。在最簡單的情況下,您可以使用AND像素檢查真實輸出。

然後,您可以使用此「已確認」命中以更復雜的模型進行分析;考慮到碰撞的角度,速度,幾何形狀和彈性(或者你感興趣的任何東西)。

存在更復雜的模型,但通常更復雜的模型需要更多的計算能力。通過設置一系列快速,快速的檢查來節省您的計算能力會更容易,並且只會爲需要付清的情況帶來沉重的計算週期。

+0

-1僅提及優化並忽略了基本功能(例如,您不會提到測試是否在另一個矩形中包含了一個矩形的頂點)。 – finnw 2011-06-02 17:22:24

+0

實際上,這只是一個「快速檢查」,以避免更昂貴的分析適用(請閱讀帖子的後半部分)。因此+1 – ignis 2011-06-02 17:26:48

+1

這裏沒有給出實際的解決方案。 – phkahler 2011-06-02 17:41:47