【发布时间】:2010-02-17 22:05:15
【问题描述】:
假设我们有 4 个Vector2(是的,这是 2d),所以我们有 lineOneStart、lineOneEnd、lineTwoStart 和 lineTwoEnd。
如何检测两条线是否交叉?我不在乎它们在哪里相交,我只想知道它们是否相交。
【问题讨论】:
假设我们有 4 个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)
求解给出了 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 的范围内,则交点在两条线段内。
【讨论】:
关于该主题(线段交点)有一个tutorial。
【讨论】:
为了完整起见,当线条以(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;
定义一条线(a,b,c)通过点(x,y),极坐标方向(cos(θ),sin(θ))
a= -sin(θ);
b= cos(θ);
c= x*sin(θ)-y*cos(θ);
【讨论】: