2011-05-21 21 views
4

有人能告訴我我的矩形相交代碼是否正確?矩形相交代碼 - 這是正確的嗎?

bool checkCollide(int x, int y, int oWidth, int oHeight, 
        int x2, int y2, int o2Width, int o2Height) { 

    bool collide = false; 

    if (x >= x2 && x <= x2+o2Width && y >= y2 && y <= y2+o2Height) 
     collide = true; 

    if (x+oWidth >= x2 && x+oWidth <= x2+o2Width && y >= y2 && y <= y2+o2Height) 
     collide = true; 

    if (x >= x2 && x<= x2+o2Width && y+oHeight >= y2 && y+oHeight <= y2+o2Height) 
     collide = true; 

    if (x+oWidth >= x2 && x+oWidth <= x2+o2Width && y+oHeight >= y2 && y+oHeight <= y2+o2Height) 
     collide = true; 

    return collide; 
} 
+0

它是否正確地與您的矩形相交?如果是這樣,是的。 – 2011-05-21 15:15:39

+3

爲什麼不寫一些單元測試代碼來測試它是否爲不同的輸入提供了正確的答案? – Jesper 2011-05-21 15:17:30

+0

你可能會更好的問這個http://codereview.stackexchange.com – rlc 2011-05-21 15:17:57

回答

6

不可以,一個矩形的一個角不一定要在另一個矩形中碰撞。你想要做的是找到不相交的邏輯,並使用否定的邏輯。下面的圖片顯示了兩個明顯相交的矩形,但只有邊相交,而不是角。

enter image description here

剛剛制定的邏輯如下:怎樣才能爲藍不相交的紅?那麼它要麼完全向右,要麼完全向左,向上或向下。制定一個if語句並且否定它。 讓我來幫你開頭:

if (!(x2 > x+oWidth || x2+o2Width < x || ..)) 
     collide = true; 
0
checkCollide(0, 0, 3, 3, 1, 1, 1, 1) == false 

我猜這不是你想要的。

1

首先實現區間交集(即一維)。 然後,您可以通過首先將間隔交點應用於x座標,然後將間隔交點應用於y座標來實現矩形交點。

2

繼馬格納斯的答案後,我會採取一種稍微不同的方法。

正如他所說,如果兩個相交,然後一會完全離開,完全正確,等等。但是性能就可以停止一旦測試任何條件都發現是假的 ,例如:

if (x2 + owidth2 < x) 
    return false; // box 2 is left of box 1 

if (x + owidth < x2) 
    return false; // box 1 is left of box 2 

// etc... 
+0

+1效率問題的好處! – ralphtheninja 2011-05-21 16:09:42

+0

在您的版本中布爾表達式的實際短路評估應該產生相同的效果。不過,這更明確。 – Alnitak 2011-05-21 17:00:14