Быстрый прямоугольник для пересечения прямоугольника - PullRequest
75 голосов
/ 02 мая 2010

Какой быстрый способ проверить, пересекаются ли 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 ]

129 голосов
/ 02 мая 2010

Вот как этот код можно перевести на JavaScript. Обратите внимание на то, что в вашем коде и в статье есть опечатка, как и предлагалось в комментариях. В частности, r2->right left должно быть r2->right < r1->left и r2->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
61 голосов
/ 02 мая 2010
function intersect(a, b) {
  return (a.left <= b.right &&
          b.left <= a.right &&
          a.top <= b.bottom &&
          b.top <= a.bottom)
}

Это предполагает, что top обычно меньше bottom (то есть, что y координаты увеличиваются вниз).

18 голосов
/ 07 апреля 2014

Вот как .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;
}
5 голосов
/ 03 февраля 2016

Еще один более простой способ. (Предполагается, что ось 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 числа (максимальные и минимальные) в вышеуказанном условии также дают точки пересечения

1 голос
/ 21 сентября 2016

Это тип Rect, который вы можете использовать.Это уже JavaScript.

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

...