我们的问题是这样的:给定一条线段的起点为$A_1$、终点为$A_2$,另一条线段的起点为$B_1$、终点为$B_2$,问线段$A_1A_2$和线段$B_1B_2$是否相交?
我们首先解释一下,两条线段相交的概念是指,存在一个点,这个点同时在两条线段上。
方法一(解方程法):
容易知道,线段$A_1A_2$上的点的集合为$A = A_1 * (1 - r_1) + A_2 * r_1$,其中$r_1 \in [0, 1]$;同理,线段$B_1B_2$上的点的集合为$B = B_1 * (1 - r_2) + B_2 * r_2$,其中$r_2 \in [0, 1]$。一般的,如果不对$r_1$(或$r_2$)的范围作约束,得到的点集构成该线段所在的直线。那么这个问题就简单了,我们可以首先将两条线段延展成直线,求出两条直线的交点,根据交点位置可以分别求出$r_1$和$r_2$,然后判断$r_1$和$r_2$是否同时在$[0, 1]$区间即可。我们把$r_1$($r_2$)叫做点$A$($B$)在线段$A_1A_2$(线段$B_1B_2$)上的比例。
两直线的交点满足$A_1 * (1 - r_1) + A_2 * r_1 = B_1 * (1 - r_2) + B_2 * r_2$,稍微变形可得$(A_2 - A_1) * r_1 - (B_2 - B_1) * r_2 = B_1 - A_1$,即$$\overrightarrow{A_1A_2} * r_1 - \overrightarrow{B_1B_2} * r_2 = \overrightarrow{A_1B_1}$$,表示为向量矩阵的形式为(令$\overrightarrow{r} = (r_1, r_2)^T$):$$[\overrightarrow{A_1A_2}, - \overrightarrow{B_1B_2}] * \overrightarrow{r} = \overrightarrow{A_1B_1}$$
我们的目的是根据以上二元方程组求出$r_1$和$r_2$,但是在此之前,我们要判断一些特殊情况:
(1). 如果$\overrightarrow{A_1A_2} = \overrightarrow{0}$,即线段$A_1A_2$是一个点,这时,等式退化为$- \overrightarrow{B_1B_2} * r_2 = \overrightarrow{A_1B_1