Какой быстрый способ проверить, пересекаются ли 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
);
}
javascript
c++
language-agnostic
graphics
Робин Родрикс
источник
источник
r2->right left
не имеет смысла. Он может быть сломан из-за проблем с экранированием HTML.<
символами из-за экранирования HTML.Ответы:
Вот как этот код можно перевести на 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
источник
function intersect(a, b) { return (a.left <= b.right && b.left <= a.right && a.top <= b.bottom && b.top <= a.bottom) }
Это предполагает, что
top
обычно меньше чемbottom
(т. Е.y
Координаты увеличиваются вниз).источник
<=
на<
должно работать.=
для каждого условия, и это позволяет прямоугольникам «касаться» границ.Вот как .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; }
источник
Еще один более простой способ. (Предполагается, что ось 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 числа (макс. И мин.) В приведенном выше условии также дают точки пересечения.
источник
У него есть тип Rect, который вы можете использовать. Это уже JavaScript.
https://dxr.mozilla.org/mozilla-beta/source/toolkit/modules/Geometry.jsm
источник
Я использовал сочетание методов, чтобы обнаружить меньший прямоугольник внутри большого прямоугольника. Это метод nodejs, использующий ширину / высоту, но его легко адаптировать.
isIntersectingRect: function (r1, r2) { var quickCheck = (r1.x <= r2.x + r2.w && r2.x <= r1.x + r1.w && r1.y <= r2.y + r2.h && r2.y <= r1.y + r1.h) if (quickCheck) return true; var x_overlap = Math.max(0, Math.min(r1.x + r1.w, r2.x + r2.w) - Math.max(r1.x, r2.x)); var y_overlap = Math.max(0, Math.min(r1.y + r1.h, r2.y + r2.h) - Math.max(r1.y, r2.y)); var overlapArea = x_overlap * y_overlap; return overlapArea == 0; }
источник