最近在建立气凝胶的有限元模型中需要计算每两根纤维(线段)之间的距离,最初参考的两篇文章确实提供了关于一些数值方法的计算思路(文章1 && 文章2),但忽略了线段距离问题的理论推导,导致无法用参数 t t t 正确描述两目标线段!所求得的结果错误。本文从理论推导和程序实现两方面来说明求空间线段之间距离的方法。
理论推导
空间直线的参数方程
如果一个非零向量平行于一条已知直线,这个向量就叫做这条直线的方向向量
由于过空间一点可作而且只能作一条直线平行于一已知直线,所以当直线 L L L上一点 M 0 ( x 0 , y 0 , z 0 ) M_{0}\left(x_{0},y_{0},z_{0}\right) M0(x0,y0,z0)和它的一方向向量 s = ( m , n , p ) \boldsymbol{s}=\left(m,n,p\right) s=(m,n,p)为已知时,直线 L L L的位置就完全确定了。下面我们来建立这直线的方程。
设点 M ( x , y , z ) M\left(x,y,z\right) M(x,y,z)是直线 L L L上的任意一点,那么向量 M 0 M → \overrightarrow{M_{0}M} M0M与 L L L的方向向量 s \boldsymbol{s} s平行(如上图所示)。所以两向量的对应坐标成比例,由于 M 0 M → = ( x − x 0 , y − y 0 , z − z 0 ) , s = ( m , n , p ) \overrightarrow{M_{0}M}=\left(x-x_{0},y-y_{0},z-z_{0}\right),\boldsymbol{s}=\left(m,n,p\right) M0M=(x−x0,y−y0,z−z0),s=(m,n,p),从而有
x − x 0 m = y − y 0 n = z − z 0 p \frac{x-x_{0}}{m}=\frac{y-y_{0}}{n}=\frac{z-z_{0}}{p} mx