Fast rectangle to rectangle intersection
This is how that code can be translated to JavaScript. Note that there is a typo in your code, and in that of the article, as the comments have suggested. Specifically r2->right left
should be r2->right < r1->left
and r2->bottom top
should be r2->bottom < r1->top
for the function to work.
function intersectRect(r1, r2) { return !(r2.left > r1.right || r2.right < r1.left || r2.top > r1.bottom || r2.bottom < r1.top);}
Test case:
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 trueintersectRect(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)}
This assumes that the top
is normally less than bottom
(i.e. that y
coordinates increase downwards).
This is how the .NET Framework implements 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;}
Or the static version:
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;}