2010-05-02 156 views
63

什麼是測試2個矩形是否相交的快速方法?快速矩形到矩形相交


在互聯網上搜索想出了這個一行代碼(WOOT!),但我不知道如何把它寫在Javascript中,它似乎是在一個古老的形式C的++編寫。

struct 
{ 
    LONG left; 
    LONG top; 
    LONG right; 
    LONG bottom; 
} RECT; 

bool IntersectRect(const RECT * r1, const RECT * r2) 
{ 
    return ! (r2->left > r1->right 
     || r2->right < r1->left 
     || r2->top > r1->bottom 
     || r2->bottom < r1->top 
     ); 
} 
+5

我想你已經在你的副本有一個錯字/粘貼 – fmark 2010-05-02 03:35:26

+0

好了,這是從哪兒它,它看起來同我 - http://tekpool.wordpress.com/2006/ 10/11/rectangle-intersection-determining-if-two-given-rectangles-intersect-each-other-or-not/ – 2010-05-02 03:36:50

+5

原文有一個錯字。 'r2->左'沒有意義。由於HTML轉義問題,它可能會被破壞。 – 2010-05-02 03:41:53

回答

107

這是如何將該代碼轉換爲JavaScript。請注意,您的代碼中存在拼寫錯誤,正如評論所暗示的那樣,文章錯誤。具體來說r2->right left應該是r2->right < r1->leftr2->bottom top應該是r2->bottom < r1->top的功能工作。

function intersectRect(r1, r2) { 
    return !(r2.left > r1.right || 
      r2.right < r1.left || 
      r2.top > r1.bottom || 
      r2.bottom < r1.top); 
} 

測試用例:

var rectA = { 
    left: 10, 
    top: 10, 
    right: 30, 
    bottom: 30 
}; 

var rectB = { 
    left: 20, 
    top: 20, 
    right: 50, 
    bottom: 50 
}; 

var rectC = { 
    left: 70, 
    top: 70, 
    right: 90, 
    bottom: 90 
}; 

intersectRect(rectA, rectB); // returns true 
intersectRect(rectA, rectC); // returns false 
+0

只是要添加/確認 - 這是測試三個20px x 20px的盒子,除了rectB,它是30px x 30px – verenion 2013-03-20 12:29:20

+3

如果r1和r2相同,intersectRect函數將返回false – zumalifeguard 2013-09-23 15:28:31

+0

Fantastic雄辯實現。愛它! +1,完美地爲我的遊戲工作。 – Unome 2014-09-04 22:37:21

56
function intersect(a, b) { 
    return (a.left <= b.right && 
      b.left <= a.right && 
      a.top <= b.bottom && 
      b.top <= a.bottom) 
} 

這假定top通常小於bottom(即該y座標向下增加)。

+0

良好的工作解決方案,但應該有點慢,因爲所有的條件都必須評估。一旦其中一個條件評估爲真,另一個解決方案就完成了。 – Gigo 2013-01-14 20:43:36

+17

只要其中一個條件的評估結果爲假,也會完成此項工作。即與另一個完全相同的情況。 – 2013-01-22 22:06:11

+0

+1正確,不知道我在想什麼。 – Gigo 2013-01-23 14:19:30

17

這是.NET Framework如何實現Rectangle.Intersect

public bool IntersectsWith(Rectangle rect) 
{ 
    if (rect.X < this.X + this.Width && this.X < rect.X + rect.Width && rect.Y < this.Y + this.Height) 
    return this.Y < rect.Y + rect.Height; 
    else 
    return false; 
} 

或者靜態版本:

public static Rectangle Intersect(Rectangle a, Rectangle b) 
{ 
    int x = Math.Max(a.X, b.X); 
    int num1 = Math.Min(a.X + a.Width, b.X + b.Width); 
    int y = Math.Max(a.Y, b.Y); 
    int num2 = Math.Min(a.Y + a.Height, b.Y + b.Height); 
    if (num1 >= x && num2 >= y) 
    return new Rectangle(x, y, num1 - x, num2 - y); 
    else 
    return Rectangle.Empty; 
} 
4

另一個更簡單辦法。 (這假定y軸向下增加)。

function intersect(a, b) { 
    return Math.max(a.left, b.left) < Math.min(a.right, b.right) && 
      Math.max(a.top, b.top) < Math.min(a.bottom, b.bottom); 
} 

上述條件中的4個數字(最大值和最小值)也給出了交點。