1. Introduction
In this tutorial, we’ll show how to check if a line segment intersects a rectangle.
2. Intersection
Let’s say that the segment’s endpoints are and . Similarly, let , , , and be the rectangle’s corners.
We say that the segment intersects the rectangle if has at least one common point with at least one rectangle’s side. For example:
So, the idea is to check if intersects , , , or . If we find an intersection with any side, we don’t need to check the rest.
3. The Intersection of Two Segments
So, let’s see how we can check if intersects . The steps will be the same for the three remaining sides.
If intersects , there will be at least one point that belongs to both and :
Focusing on the triangle and treating , , , , and as vectors directed from the origin, we see that the following must hold:
The condition ensures that belongs to both segments.
3.1. Solving a Linear System
If , , , and , we get a system of two linear equations:
(1)
The next step is to solve it for and .
3.2. Interpreting the Solution
If the system has no solution, doesn’t intersect .
If there’s a unique solution such that and , then they intersect at a single point .
If there’s more than one solution, we’ll get a range of values for and . If the ranges include values from , and coincide at least partially. In particular, if the ranges are completely inside , we have , , or both.
3.3. Algorithm
Here’s our algorithm:
algorithm CheckIfLineSegmentIntersectsRectangle(UV, A1, A2, A3, A4):
// INPUT
// UV = a line segment
// A1, A2, A3, A4 = the corners of the rectangle
// OUTPUT
// Returns true if UV intersects A1A2A3A4; otherwise, returns false
for XY in {A1A2, A2A3, A3A4, A4A1}:
Formulate the system for UV and the side XY
Solve the system
if the system has a solution in [0, 1]^2:
return true
return false
So, we start with one side and check all the others iteratively until we either find an intersection or test all of them without success.
Since we deal with a fixed number of dimensions, solving systems takes time, so the complexity of the entire algorithm is also .
3.4. What if the Segment Is Inside the Rectangle?
We set out the problem and formulated our algorithm to test only if has a mutual point with the rectangle’s boundary.
On the other hand, if we want to cover the rectangle’s interior, we need to extend our algorithm. The already formulated pseudocode deals with all the cases except when lies inside the interior of .
To handle it, we note that is inside the rectangle only if and are linear combinations of the rectangle’s directed non-parallel sides such that all the coefficients are between 0 and 1:
We can take any two adjacent sides as the vectors as long as we direct them so that the interior points have positive coefficients.
To check that, we solve two linear systems we derive from:
and
If both have single solutions and , is in the interior of .
4. Conclusion
In this article, we talked about how to check if a line segment intersects with a rectangle. We differentiated between two cases: in the first one, we considered if the segment intersects the rectangle’s boundary, and in the second one, the case where we covered the intersections with the interior as well.