已知
直线1:直线任意一点
P
1
P_1
P1直线方向
V
1
V_1
V1 (单位向量)
直线2:直线任意一点
P
2
P_2
P2直线方向
V
2
V_2
V2 (单位向量)
求解过程
需要用到点到直线的距离和垂足相关内容,参考 这里
下文中
⋅
\centerdot
⋅代表点乘
∗
*
∗代表乘
×
\times
×代表叉乘。
首先判断是否平行
V
1
=
=
V
2
V_1==V_2
V1==V2 (如果写程序需要注意误差)
- 如果平行
就利用点到直线的距离方法计算 P 1 P_1 P1到直线2的距离就可以,公垂线有无数个,看你怎么定义了 - 不平行
判断是否相交 ( V 1 × V 2 ) ⋅ ( P 2 − P 1 ) = = 0 (V_{1}\times V_{2})\centerdot(P_{2}-P_{1})==0 (V1×V2)⋅(P2−P1)==0- 相交 直接就是0 公垂线退化为一个点
- 不相交
我们假设公垂线与直线2的交点为 P p 2 = P 2 + K 2 ∗ V 2 P_{p2} =P_2+K_2*V_2 Pp2=P2+K2∗V2
根据点到直线距离里面的垂足公式,可以得到过 P p 2 P_{p2} Pp2与直线1对应的垂足表达式(也就是公垂线的另一个点)
P p 1 = P 1 + [ ( P p 2 − P 1 ) ⋅ V 1 ] ∗ V 1 P_{p1}=P_1+[(P_{p2}-P_1)\centerdot V_1]*V1 Pp1=P1+[(Pp2−P1)⋅V1]∗V1
即 P p 1 = P 1 + [ ( P 2 + K 2 ∗ V 2 − P 1 ) ⋅ V 1 ] ∗ V 1 P_{p1}=P_1+[(P_2+K_2*V_2-P_1)\centerdot V_1]*V1 Pp1=P1+[(P2+K2∗V2−P1)⋅V1]∗V1
向量 P p 1 − P p 2 P_{p1}-P_{p2} Pp1−Pp2同时与 V 2 V_2 V2垂直
所以可以列出方程
( P p 1 − P p 2 ) ⋅ V 2 = 0 (P_{p1}-P_{p2})\centerdot V_2 = 0 (Pp1−Pp2)⋅V2=0
即
( P 1 + [ ( P p 2 − P 1 ) ⋅ V 1 ] ∗ V 1 − P p 2 ) ⋅ V 2 = 0 (P_1+[(P_{p2}-P_1)\centerdot V_1]*V1-P_{p2})\centerdot V_2 = 0 (P1+[(Pp2−P1)⋅V1]∗V1−Pp2)⋅V2=0
( P 1 + [ ( P 2 + K 2 ∗ V 2 − P 1 ) ⋅ V 1 ] ∗ V 1 − P 2 − K 2 ∗ V 2 ) ⋅ V 2 = 0 (P_1+[(P_2+K_2*V_2-P_1)\centerdot V_1]*V1-P_2-K_2*V_2)\centerdot V_2 = 0 (P1+[(P2+K2∗V2−P1)⋅V1]∗V1−P2−K2∗V2)⋅V2=0
整理得到K 2 = ( P 1 − P 2 + ( ( P 2 − P 1 ) ⋅ V 1 ) ∗ V 1 ) ⋅ V 2 V 2 ⋅ V 2 − ( V 1 ⋅ V 2 ) ∗ ( V 2 ⋅ V 1 ) K_2 =\frac{(P_1-P_2+((P_2-P_1)\centerdot V_1)*V_1)\centerdot V_2}{V_2\centerdot V_2-(V_1\centerdot V_2)*(V_2\centerdot V_1)} K2=V2⋅V2−(V1⋅V2)∗(V2⋅V1)(P1−P2+((P2−P1)⋅V1)∗V1)⋅V2
由于方向都是单位向量式中 V 2 ⋅ V 2 = 1 V_2\centerdot V_2=1 V2⋅V2=1可以减少一次点乘运算
有了 K 2 K_2 K2其他就都可以求出了
补充
如果只需要求解距离,可以通过两个直线方向的叉乘获得公垂线方向,再利用向量
P
1
−
P
2
P_1-P_2
P1−P2与公垂线方向的单位向量的点积,即可获得距离。