直线的信息可以以两个端点的形式给出,也可以以一个直线上的点和直线的方向向量给出。本文中假设这两条直线不共线,即这两条直线既不重合也不相交。

1.如果这两条直线是以两个端点的形式给出,那么假设直线l0的两端点为:P0、P1;直线l1的两端点为Q0、Q1,;求两直线的最短距离?

直线l0我们可以用方程表示为:

       

android 计算两条线之间的角度 求两条线之间的距离_计算机图形学

(1)

直线段l1我们也可以用方程表示为:

          

android 计算两条线之间的角度 求两条线之间的距离_最小二乘法_02

  (2)

式中,P、Q分别表示两直线段上的点。

那么点P和点Q的距离为:

android 计算两条线之间的角度 求两条线之间的距离_最小二乘法_03

(3)

我们将(3)式等式两边平方得到:

          

android 计算两条线之间的角度 求两条线之间的距离_c++编程_04

     (4)

那么求解这两条空间直线段的最短距离就变成了一个求解最小二乘法的最小值问题了,即求解方程:

      

android 计算两条线之间的角度 求两条线之间的距离_计算机图形学_05

(5)

那么这个方程怎么求解呢?下面我们来求解(5)式:由式(1)和式(2)我们有:

android 计算两条线之间的角度 求两条线之间的距离_android 计算两条线之间的角度_06

(6)

将(6)式带入(5)式有:

         

android 计算两条线之间的角度 求两条线之间的距离_计算机图形学_07

   (7)那么就变为求解超静定方程:  

android 计算两条线之间的角度 求两条线之间的距离_几何学_08

   (8)

我们将(8)式变形得到求解超静定方程:

          

android 计算两条线之间的角度 求两条线之间的距离_c++编程_09

 (9)

令A=(P0-P1,Q0-Q1),x=(a,-n)T,b=Q1-P1;则式(9)变为:

                

android 计算两条线之间的角度 求两条线之间的距离_android 计算两条线之间的角度_10

 (10)

两边同时乘以矩阵A的装置得到:

          

android 计算两条线之间的角度 求两条线之间的距离_android 计算两条线之间的角度_11

      (11)

则x可以求解得到:

          

android 计算两条线之间的角度 求两条线之间的距离_几何学_12

  (12)

求解得到a和n之后带入式(6)就可以求解得到点P和点Q了,然后代入式(3)就可以求解得到最小距离了。

2.如果这两条直线是以直线上的点和该直线的方向向量给出,那么假设直线l0上有一点P0,它的方向向量为n;直线l1上有一点Q0,它的方向向量为m;那么直线l0上的点可以表示为:

android 计算两条线之间的角度 求两条线之间的距离_最小二乘法_13

(13)

直线l1上的点可以表示为:

 

android 计算两条线之间的角度 求两条线之间的距离_几何学_14

(14)

点P和点Q的距离为:

 

android 计算两条线之间的角度 求两条线之间的距离_几何学_15

(15)

将式(13)和式(14)带入式(15)得到:

android 计算两条线之间的角度 求两条线之间的距离_android 计算两条线之间的角度_16

(16)

两边平方得到:

android 计算两条线之间的角度 求两条线之间的距离_几何学_17

(17)

那么求解两条直线的最短距离,就变为了求解式(17)的最小二乘方程组,即:

 

android 计算两条线之间的角度 求两条线之间的距离_几何学_18

 (18)

变形得到:

 

android 计算两条线之间的角度 求两条线之间的距离_最小二乘法_19

(19)

同理,令A=(n,m),x=(a,-b)T,b=Q0-P0,则(19)式变为:

android 计算两条线之间的角度 求两条线之间的距离_计算机图形学_20

(20)

同理求得x为:

   

android 计算两条线之间的角度 求两条线之间的距离_c++编程_21

(21)

求得a,b之后带入式(13)和式(14)就可以求得点P和点Q,根据式(15)就可以求得最短距离了。