Skip to main content
Talk:2D line intersection        

Hi, i think that this algorithm can be improved by looking for the x coordinate of the intersection if it exist (if the lines aren't parallels). Then you need no more than a test to see if it belongs to one of the lines. I would give something like:

bool vec2LinesIntersect ( Vector2 l1s, Vector2 l1f, Vector2 l2s, Vector2 l2f )
{
    // the two lines are defined by the following equations
    // (L1) y = m1*x + p1
    // (L2) y = m2*x + p2

    Real m1 = (l1f.y - l1s.y) / (l1f.x - l1s.x),
         m2 = (l2f.y - l2s.y) / (l2f.x - l2s.x);

    if ( m1 == m2) 
         // the two lines are parallels
         return false;

    // now calculates the x coordinate of the intersection point (which exist m1 != m2)
    Real interX = ( (l2s.y - m2*l1s.x) - (l1s.y - m1*l1s.x) ) / (m1 - m2);

    // the intercection belongs to the first line so a real k such as 
    // the vector [l1s,l1f] equals k*[l1s,inter] exists
    if ( interX == l1s.x )
         // the intersection point is the l1s point
         return true;

    Real k = (l1f.x - l1s.x) / (interX - l1s.x);

    // now verify if the intersection belong to the line area
    return ( k >= 0 && k<=1 );
}

Proposal doesn't work

Your proposal doesn't work:

1. m1 and m2 can be invalid due to division by zero problems.

2. interX doesn't always fit

3. probably some more (not sure though)