快速矩形到矩形交叉

时间:2010-05-02 03:32:48

标签: javascript c++ language-agnostic graphics

测试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
        );
}

6 个答案:

答案 0 :(得分:129)

这就是将代码转换为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

答案 1 :(得分:61)

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

这假设top通常小于bottom(即y坐标向下增加)。

答案 2 :(得分:18)

这是.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;
}

答案 3 :(得分: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个数字(最大&#39; s和min&#39; s)也给出交点。

答案 4 :(得分:1)

这有一个你可以使用的Rect类型。 它已经是JavaScript了。

https://dxr.mozilla.org/mozilla-beta/source/toolkit/modules/Geometry.jsm

答案 5 :(得分:0)

我使用了多种方法来检测大矩形内的小矩形。这是一个nodejs方法,使用width / height,但可以轻松进行调整。

import Data.Array (null)
import Data.Array.Partial (tail,head)
import Partial.Unsafe (unsafePartial)
import Math

iseven :: Int -> Boolean
iseven a = mod a 2 == 0


len :: forall a. Array a -> Int
len arr =
  if null arr
  then 0
  else
    if iseven unsafePartial head arr
      then 1 + len (unsafePartial tail arr)
      else len (unsafePartial tail arr)