矩形與矩形碰撞(未旋轉)
這應該是旋轉主題裡面最簡單的吧,如果是用 Java Swing 矩形為框的眾多 JComponent 像 JLabel JButton 就有 .getBounds() 得到 Rectangle 物件,並有 .intersects() 方法可用。不過這個碰撞檢定剛好可視為旋轉矩形碰撞檢定的特例,我個人認為可以比較一下,所以未旋轉兩矩形的碰撞檢定還是做了個筆記。
未旋轉的擺正矩形,四個邊會平行兩軸,我們考慮矩形投影到 x 軸,會得到線段,如果兩個矩形有碰撞,則兩個投影線段會相交,相反地矩形沒有碰撞的話,投影到 x 軸的線段就會分開,我們可用線段的最左最右來比較是否重疊,可知其實就是比較原來矩形的左邊 x 坐標和右邊 x 坐標,如下圖:
如上圖,未碰撞可分兩種情形,一個是矩形 A 的最右邊小於矩形 B 的最左邊,也就是整個矩形落在另一個矩形的左側,不管矩形 A 上下如何移動,都和矩形 B 不會相交;同理當矩形 A 的最左 x 坐標大於矩形 B 的最右 x 坐標,兩矩形不會碰撞。
以此類推還有上下的:
如上圖,當其中一個矩形的上緣比另一個矩形的下緣還要低,則不會相交;當其中一個矩形的下緣比另一個的上緣還要更高,也不會相交。
參考 Java Code:
public boolean isRectRectCollide(Rectangle rectA, Rectangle rectB) { if(rectA.Left() > rectB.Right() || rectA.Right() < rectB.Left()) { return false; // Rectangle.Left() 取得矩形左邊線段的 x 坐標 } if(rectA.Top() > rectB.Bottom() || rectA.Bottom() < rectB.Top()) { return false; // Rectangle.Top() 取得矩形上方線段的 y 坐標 } // 要注意電腦坐標系是 y 是以下為正 return true; }
留言
張貼留言