假设我们有四个Vector2(是的,这是2D),因此我们有lineOneStart、lineOneEnd、lineTwoStart和lineTwoEnd。如何检测这两条线是否相交?我不关心它们相交在哪里,我只想知道它们是否相交。
通过Bourke检查此公式。
我最近也必须解决这个问题。另一个选择是使用(获取)直线的方程(y = mx + c
),但是您需要关注几个边缘情况,并实际检查交点是否在线段内。上面链接中的公式有效,尽管我无法真正评论方程式如何重新排列,但我会说它有效;)
编辑:
如AndiDog所提到的,我使用的另一个网站(示例也很好)是tutorial。由于这是XNA,因此第二个链接将非常适合您。
编辑(来自损坏链接的内容):
直线的方程式为Pa = P1 + ua ( P2 - P1 )
和Pb = P3 + ub ( P4 - P3 )
Pa = Pb
得到以下两个未知数(ua 和 ub)的两个方程式:
x1 + ua (x2 - x1) = x3 + ub (x4 - x3)
和
y1 + ua (y2 - y1) = y3 + ub (y4 - y3)
解决后,将其代入线条相应的方程式中,得出交点。例如,交点 (x,y) 为:
x = x1 + ua (x2 - x1)
y = y1 + ua (y2 - y1)
注意:
ua和ub的分母相同。
如果ua和ub的方程分母为0,则两条直线平行。
如果ua和ub的方程的分子和分母都为0,则两条直线重合。
这些方程适用于直线,如果需要求线段的交点,则只需测试ua和ub是否在0到1之间。无论哪一个在该范围内,相应的线段都包含交点。如果两者都在0到1的范围内,则交点位于两个线段内部。(a,b,c)
坐标表示线时,线的方程为a*x+b*y+c=0
。
(a1,b1,c1)
和(a2,b2,c2)
的两条线在点(x,y)
相交找到该点的齐次坐标
u = b1*c2-b2*c1;
v = a2*c1-a1*c2;
w = a1*b2-a2*b1;
如果两条线平行,则w=0
。
否则,交点位于
x = u/w;
y = v/w;
通过两点 (x1,y1)
和 (x2,y2)
定义一条线 (a,b,c)
,使用以下公式:
a= y1-y2;
b= x2-x1;
c= x1*y2-y1*x2;
通过一个点 (x,y)
和极角方向 (cos(θ),sin(θ))
定义一条线 (a,b,c)
,使用以下公式:
a= -sin(θ);
b= cos(θ);
c= x*sin(θ)-y*cos(θ);