您显示的第一段代码基于矢量叉积,已在此处进行了说明。如何检测两条线段相交的位置?非常详细。
IMO,一种更容易理解的方法是通过求解方程组。首先通常要看线,然后从中切出线段。下面,我对给定的段
((x1, x2), (y1,y2))和使用符号
((x3, x4), (y3, y4))。
- 检查任何线条是否垂直(
x1 == x2
或x3 == x4
)。
一个。如果两个都是垂直的
x1 != x3,则没有相交。
b。如果两个都是垂直的
x1 == x3,请检查
(y1, y2)和是否
(y3, y4)重叠。
C。如果只有一条是垂直的(例如,第一条),则构建第二条线的方程式(如下所示),找到两条线相交的点(代
x1入第二条线的方程式),然后检查该点是否为在两个段中(类似于步骤5)。
d。如果不是,请继续。
- 使用点坐标以形式构建线方程
y = a*x + b
(如此处)。
a1 = (y2-y1)/(x2-x1) b1 = y1 - a1*x1 a2 = (y4-y3)/(x4-x3) b2 = y3 - a2*x3
检查直线是否平行(斜率相同
a
)。如果是,请检查它们是否具有相同的interceptb
。如果是,检查是否1D段(x1, x2)
和(x3, x4)
重叠。如果是,则您的细分确实重叠。线平行的情况可能会模棱两可。如果它们重叠,则可以将其视为一个相交(如果它们的端点接触,甚至可以是一个点)。注意:如果使用的是浮点数,则会有些棘手,我认为您可能会忽略此问题。如果您只有整数,则检查ifa1 = a2
是否等于:if((y2-y1)*(x4-x3) == (x2-x1)*(y4-y3))
如果线不平行。相交点等效于代表两条直线的方程组的解。说真的,
y = a1*x + b1
和y = a2*x + b2
相交的基本意思是,这两个等式的成立。通过等同于两个右侧来解决该系统,它会给您交叉点。实际上,您只需要x
交叉点的坐标(将其绘制即可,然后看到原因):x0 = -(b1-b2)/(a1-a2)
最后一步是检查交点是否
x0
在两个线段内。即min(x1, x2) < x0 < max(x1, x2)
和min(x3, x4) < x0 < max(x3, x4)
。如果是,则您的线条确实相交!



