Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

XNA line segment intersection?

Tags:

c#

math

xna

Lets say we have 4 Vector2's (yes this is 2d), so we have lineOneStart, lineOneEnd, lineTwoStart and lineTwoEnd.

How can I detect if the 2 lines cross? I don't care where they cross, I just want to know if they intersect.

like image 873
Peter Avatar asked Feb 17 '10 22:02

Peter


1 Answers

Check this formula by Bourke.

I recently had to solve this issue too. Another option is using (getting) the equation of the line (y = mx + c) but there are several edge cases you need to be concerned with, as well as actually checking if the point of intersection is within the line segment. The formula in the link above works, though I cannot really comment on how the equation is re-arranged, all I'll say is it works ;)

Edit:

As mentioned by AndiDog, another site I used (the example is excellent too) is this tutorial. As this is XNA the second link will be right up your street.

Edit (Content from broken link):

The equations of the lines are Pa = P1 + ua ( P2 - P1 ) and Pb = P3 + ub ( P4 - P3 )

Solving for the point where Pa = Pb gives the following two equations in two unknowns (ua and ub) x1 + ua (x2 - x1) = x3 + ub (x4 - x3) and y1 + ua (y2 - y1) = y3 + ub (y4 - y3) Solving gives the following expressions for ua and ub

Substituting either of these into the corresponding equation for the line gives the intersection point. For example the intersection point (x,y) is x = x1 + ua (x2 - x1) y = y1 + ua (y2 - y1)

Notes: The denominators for the equations for ua and ub are the same. If the denominator for the equations for ua and ub is 0 then the two lines are parallel. If the denominator and numerator for the equations for ua and ub are 0 then the two lines are coincident. The equations apply to lines, if the intersection of line segments is required then it is only necessary to test if ua and ub lie between 0 and 1. Whichever one lies within that range then the corresponding line segment contains the intersection point. If both lie within the range of 0 to 1 then the intersection point is within both line segments.

like image 121
Finglas Avatar answered Oct 08 '22 04:10

Finglas