¿Cuál es una forma rápida de probar si 2 rectángulos se cruzan?
Una búsqueda en Internet dio como resultado este resumen (¡WOOT!), Pero no entiendo cómo escribirlo en Javascript, parece estar escrito en una forma antigua de 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
Robin Rodricks
fuente
fuente
r2->right left
no tiene sentido. Es posible que esté roto debido a problemas de escape de HTML.<
símbolos debido al escape de html.Respuestas:
Así es como ese código se puede traducir a JavaScript. Tenga en cuenta que hay un error tipográfico en su código y en el del artículo, como sugieren los comentarios. Específicamente
r2->right left
debería serr2->right < r1->left
yr2->bottom top
debería serr2->bottom < r1->top
para que la función funcione.function intersectRect(r1, r2) { return !(r2.left > r1.right || r2.right < r1.left || r2.top > r1.bottom || r2.bottom < r1.top); }
Caso de prueba:
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
fuente
function intersect(a, b) { return (a.left <= b.right && b.left <= a.right && a.top <= b.bottom && b.top <= a.bottom) }
Esto supone que
top
normalmente es menor quebottom
(es decir, que lasy
coordenadas aumentan hacia abajo).fuente
<=
a<
.=
para cada condición y permite que los rectángulos se "toquen" en los bordes.Así es como .NET Framework implementa 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; }
O la versión estática:
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; }
fuente
Otra forma más sencilla. (Esto supone que el eje y aumenta hacia abajo).
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); }
Los 4 números (máximos y mínimos) en la condición anterior también dan los puntos de intersección.
fuente
Tiene un tipo de Rect que puede utilizar. Ya es JavaScript.
https://dxr.mozilla.org/mozilla-beta/source/toolkit/modules/Geometry.jsm
fuente
Usé una combinación de métodos para detectar un rectángulo más pequeño dentro de un rectángulo grande. Este es un método de nodejs y usa ancho / alto, pero se puede adaptar fácilmente.
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; }
fuente