Intersecting line segments (2D)

From CGAFaq

Jump to: navigation, search

This problem can be extremely easy or extremely difficult; it depends on your application. If all you want is the intersection point, the following should work:

Let A,B,C,D be 2-space position vectors. Then the directed line segments AB and CD are given by:

AB=A+r(B-A), r ∈ [0,1]
CD=C+s(D-C), s ∈ [0,1]

If AB and CD intersect, then

A+r(B-A)=C+s(D-C), or
Ax+r(Bx-Ax)=Cx+s(Dx-Cx)
Ay+r(By-Ay)=Cy+s(Dy-Cy) for some r,s ∈ [0,1]

Solving the above for r and s yields

    (Ay-Cy)(Dx-Cx)-(Ax-Cx)(Dy-Cy)
r = -----------------------------  (eqn 1)
    (Bx-Ax)(Dy-Cy)-(By-Ay)(Dx-Cx)
    (Ay-Cy)(Bx-Ax)-(Ax-Cx)(By-Ay)
s = -----------------------------  (eqn 2)
    (Bx-Ax)(Dy-Cy)-(By-Ay)(Dx-Cx)

Let P be the position vector of the intersection point, then

P=A+r(B-A) or
Px=Ax+r(Bx-Ax)
Py=Ay+r(By-Ay)

By examining the values of r and s, you can also determine some other limiting conditions:

If 0 ≤ r ≤ 1 and 0 ≤ s ≤ 1, intersection exists
r < 0 or r > 1 or s < 0 or s > 1 line segments do not intersect
If the denominator in eqn 1 is zero, AB and CD are parallel
If the numerator in eqn 1 is also zero, AB and CD are collinear.

If they are collinear, then the segments may be projected to the x- or y-axis, and overlap of the projected intervals checked.

If the intersection point of the two lines are needed (lines in this context mean infinite lines) regardless whether the two line segments intersect, then

If r > 1, P is located on extension of AB
If r < 0, P is located on extension of BA
If s > 1, P is located on extension of CD
If s < 0, P is located on extension of DC

Also note that the denominators of eqn 1 and 2 are identical.

References:

  • [O’Rourke (C)] pp. 249-51
  • [Gems III] pp. 199-202 Faster Line Segment Intersection
Personal tools