已知
三维空间中两个直线
直线1:方向
V
1
V_{1}
V1 直线上的任意一个点
P
1
P_{1}
P1
直线2:方向
V
2
V_{2}
V2 直线上的任意一个点
P
2
P_{2}
P2
为了方便计算上面的方向向量
V
V
V均为单位向量
(从这里可以看出其实描述一个直线线只用5个数就可以 了,这个跟本文无关只是白话一下)
示意图如
求解过程
下文中
∗
×
⋅
u
n
i
t
(
)
m
o
d
(
)
*\times\centerdot unit()mod()
∗×⋅unit()mod()分别表示乘、叉乘、点乘、取单位向量、取向量的模
首先应该确保两个直线不平行,且共面
不平行判断
∣
V
1
×
V
2
∣
≠
0
|V_{1}\times V_{2}|\not=0
∣V1×V2∣=0 或者
∣
V
1
⋅
V
2
∣
∣
V
1
∣
∗
∣
V
2
∣
≠
1
\frac{|V_{1}\centerdot V_{2}|}{|V_{1}|* |V_{2}|} \not= 1
∣V1∣∗∣V2∣∣V1⋅V2∣=1
共面判断
(
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
注意这里还要判断
P
1
=
=
P
2
P_1==P_2
P1==P2如果相等了就直接返回结果就行
满足上面的条件后 假设交点为
P
X
P_{X}
PX
P
X
=
P
1
+
k
1
∗
V
1
P_X=P_1+k1*V1
PX=P1+k1∗V1
或者
P
X
=
P
2
+
k
2
∗
V
2
P_X=P_2+k2*V2
PX=P2+k2∗V2
P 1 P 2 P X P_1 P_2 P_X P1P2PX三点构成三角形必然满足正弦定理
m o d ( P 1 − P 2 ) s i n ( ∠ P 1 P X P 2 ) = m o d ( P X − P 1 ) s i n ( ∠ P 1 P 2 P X ) \frac{mod(P_1-P_2)}{sin(\angle P_1P_XP_2)} =\frac{mod(P_X-P_1)}{sin(\angle P_1P_2P_X)} sin(∠P1PXP2)mod(P1−P2)=sin(∠P1P2PX)mod(PX−P1)
其中
s
i
n
(
∠
P
1
P
X
P
2
)
=
m
o
d
(
V
2
×
V
1
)
sin(\angle P_1P_XP_2) = mod(V_2\times V_1)
sin(∠P1PXP2)=mod(V2×V1) (因为是单位向量所以直接取模)
同理
s
i
n
(
∠
P
1
P
2
P
X
)
=
m
o
d
(
V
2
×
u
n
i
t
(
P
1
−
P
2
)
)
sin(\angle P_1P_2P_X) =mod(V2\times unit(P_1-P_2))
sin(∠P1P2PX)=mod(V2×unit(P1−P2))
因为
P
X
=
P
1
+
k
1
∗
V
1
P_X=P_1+k1*V_1
PX=P1+k1∗V1
所以
m
o
d
(
P
X
−
P
1
)
=
∣
k
1
∣
mod(P_X-P_1) = |k1|
mod(PX−P1)=∣k1∣
重新整理可以得到
m o d ( P 1 − P 2 ) m o d ( V 2 × V 1 ) = ∣ k 1 ∣ m o d ( V 2 × u n i t ( P 1 − P 2 ) ) \frac {mod(P_1-P_2)}{mod(V_2\times V_1) }= \frac {|k1|}{mod(V2\times unit(P_1-P_2))} mod(V2×V1)mod(P1−P2)=mod(V2×unit(P1−P2))∣k1∣
前面的判断保证了这里的分母都不是0
根据正负
k
1
k1
k1分别算出两个点
P
X
1
P_{X1}
PX1和
P
X
2
P_{X2}
PX2
判断
P
X
1
−
P
2
P_{X1}-P_2
PX1−P2和
P
X
2
−
P
2
P_{X2}-P_2
PX2−P2哪个与
V
2
V2
V2平行哪个就是结果