已知
三维空间中两个直线
直线1:方向V1V_{1}V1 直线上的任意一个点P1P_{1}P1
直线2:方向V2V_{2}V2 直线上的任意一个点P2P_{2}P2
为了方便计算上面的方向向量VVV均为单位向量
(从这里可以看出其实描述一个直线线只用5个数就可以 了,这个跟本文无关只是白话一下)
示意图如

求解过程
下文中∗×⋅unit()mod()*\times\centerdot unit()mod()∗×⋅unit()mod()分别表示乘、叉乘、点乘、取单位向量、取向量的模
首先应该确保两个直线不平行,且共面
不平行判断 ∣V1×V2∣≠0|V_{1}\times V_{2}|\not=0∣V1×V2∣=0 或者 ∣V1⋅V2∣∣V1∣∗∣V2∣≠1\frac{|V_{1}\centerdot V_{2}|}{|V_{1}|* |V_{2}|} \not= 1∣V1∣∗∣V2∣∣V1⋅V2∣=1
共面判断(V1×V2)⋅(P2−P1)==0(V_{1}\times V_{2})\centerdot(P_{2}-P_{1})==0(V1×V2)⋅(P2−P1)==0
注意这里还要判断P1==P2P_1==P_2P1==P2如果相等了就直接返回结果就行
满足上面的条件后 假设交点为PXP_{X}PX
PX=P1+k1∗V1P_X=P_1+k1*V1PX=P1+k1∗V1
或者PX=P2+k2∗V2P_X=P_2+k2*V2PX=P2+k2∗V2
P1P2PXP_1 P_2 P_XP1P2PX三点构成三角形必然满足正弦定理
mod(P1−P2)sin(∠P1PXP2)=mod(PX−P1)sin(∠P1P2PX)\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)
其中sin(∠P1PXP2)=mod(V2×V1)sin(\angle P_1P_XP_2) = mod(V_2\times V_1)sin(∠P1PXP2)=mod(V2×V1) (因为是单位向量所以直接取模)
同理sin(∠P1P2PX)=mod(V2×unit(P1−P2))sin(\angle P_1P_2P_X) =mod(V2\times unit(P_1-P_2))sin(∠P1P2PX)=mod(V2×unit(P1−P2))
因为 PX=P1+k1∗V1P_X=P_1+k1*V_1PX=P1+k1∗V1
所以 mod(PX−P1)=∣k1∣mod(P_X-P_1) = |k1|mod(PX−P1)=∣k1∣
重新整理可以得到
mod(P1−P2)mod(V2×V1)=∣k1∣mod(V2×unit(P1−P2))\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
根据正负k1k1k1分别算出两个点
PX1P_{X1}PX1和PX2P_{X2}PX2
判断PX1−P2P_{X1}-P_2PX1−P2和PX2−P2P_{X2}-P_2PX2−P2哪个与V2V2V2平行哪个就是结果
该博客详细介绍了如何在三维空间中求解两条直线的交点。首先判断直线是否不平行且共面,然后利用正弦定理建立方程,通过求解得出可能的交点。内容涉及向量的乘法、叉乘、点乘及单位化,并提供了计算步骤和特殊情况处理。
2587

被折叠的 条评论
为什么被折叠?



