在论文中遇到了求解三维异面直线的距离和垂足的问题,网上资源参差不齐,遂把它记录下来,万一你也用得上呢


本文参考自:求3维度空间异面直线的垂足点


在此基础上做了更详细的论述、扩展和python实现


题设:假设有两条直线 L1,L2 ,以及两条直线的方向向量V1,V2,求其最短距离及其垂足。


直接求距离


对于最短距离,也即两异面直线公垂线的长度,有一个方便快捷的求解方法,选择L1上任意一点P1连接L2上任意一点P2,则线段P1P2在L1,L2的公垂线上的投影即是长度,共垂线可以通过方向向量叉乘得到(注意两直线平行时,该方法无法得到距离),下面为python求解代码:


def distace_3d(p1, p2, q1, q2):
# 叉乘方法计算三维异面直线距离

# p1,p2为L1上的两个节点,q1,q2为L2上的两个节点
v1 = np.array([p2[i] - p1[i] for i in range(len(p1))])
v2 = np.array([q2[i] - q1[i] for i in range(len(q1))])

# 叉乘公式:(a1,a2,a3) X (b1,b2,b3)=(a2b3-a3b2,a3b1-a1b3,a1b2-a2b1)
chacheng = np.array([v1[1]_v2[2]-v1[2]_v2[1],v1[2]_v2[0]-v1[0]_v2[2],v1[0]_v2[1]-v1[1]_v2[0]])
segment = np.array([p1[i] - q1[i] for i in range(len(p1))])
dis = abs(sum(chacheng_segment)) / math.sqrt(sum([chacheng[i]**2 for i in range(len(chacheng))]))
return dis

求垂足加距离


异面直线共垂线的垂足点求解,就没有上面那么容易了,基本思路如下:


因为直线的定义可以给出如下直线方程

L(t)=P+t∗V

则在L1和L2上分别选择任意的p1,p2,以及对应的t1,t2,得到的

t1=0

t 2 = − d / a 

将t1,t2带入到直线方程中就可以得到对应的垂足了,而两垂直足间的距离即为两直线的距离

该方法对应的python代码见:https://github.com/hichenway/UsefulCode/blob/master/distance_3d_line.py