假设我们有4个Vector2
(是的,这是2d),所以我们有lineOneStart,lineOneEnd,lineTwoStart和lineTwoEnd。
如何检测2条线是否交叉?我不在乎他们在哪里交叉,我只是想知道他们是否相交。
答案 0 :(得分:6)
通过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)
求解为ua和ub提供以下表达式
将这些中的任何一个代入线的相应等式给出交点。例如,交点(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的范围内,则交叉点在两个线段内。
答案 1 :(得分:3)
该主题有一个tutorial(线段交叉点)。
答案 2 :(得分:0)
为了完整性,我将在(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;
要通过两个点(a,b,c)
和(x1,y1)
定义一行(x2,y2)
,请使用
a= y1-y2;
b= x2-x1;
c= x1*y2-y1*x2;
通过极向(a,b,c)
的点(x,y)
定义一条线(cos(θ),sin(θ))
a= -sin(θ);
b= cos(θ);
c= x*sin(θ)-y*cos(θ);