矩形與矩形碰撞(未旋轉)

這應該是旋轉主題裡面最簡單的吧,如果是用 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;
  }

留言