椭球面系列---椭球面上离直线最近的点
前面给出了射线与椭球体的交点问题的求解,本节讨论当射线与椭球面无交点时,那么在椭球面上离射线最近的点在那里?
本文给出具体的计算原理和矩阵表达的过程,便于编程计算。
有关椭圆的基础性质,请参考椭球面系列—基本性质
见下图,已知射线(点为 
     
      
       
        
        
          p 
         
        
          0 
         
        
       
      
        \textbf{p}_0 
       
      
    p0?,单位方向为 
     
      
       
       
         d 
        
       
      
        \textbf{d} 
       
      
    d),令射线与椭球面最近的点为 
     
      
       
       
         p 
        
       
      
        \textbf{p} 
       
      
    p,对应的椭球面上的点为 
     
      
       
       
         r 
        
       
      
        \textbf{r} 
       
      
    r,如何确定 
     
      
       
       
         p 
        
       
      
        \textbf{p} 
       
      
    p和 
     
      
       
       
         r 
        
       
      
        \textbf{r} 
       
      
    r的笛卡尔坐标?
 ?
首先不加证明的给出几个基本性质:
- 由点 p 0 \textbf{p}_0 p0?出发的射线和椭球体中心组成的平面与椭球体的截面为椭圆(上图即为截面内的射线和对应的椭圆,注意此椭圆的半长轴和半短轴未知,但是我们用不到)。
- 由于椭球面为凸面体,所以椭球面上离直线最近的点必定位于此截面内。
- 点到直线的距离最短为点到直线的垂线,因此 r ? p \textbf{r}-\textbf{p} r?p必定垂直于直线。
- 过椭球面上最近点 r \textbf{r} r的切平面必定垂直于上述的截面,也就是说切平面的法向量(椭球面法向量)垂直于直线。
综合以上性质,我们可以知道,利用射线可以求得截面内垂直于射线的向量 n \textbf{n} n,也就是椭球面在 r \textbf{r} r点处的法线向量(切平面法向量)。
首先,求解向量 
     
      
       
       
         n 
        
       
      
        \textbf{n} 
       
      
    n,可由下式给出:
  
      
       
        
         
          
          
           
            
            
              n 
             
            
              = 
             
            
              ? 
             
            
              d 
             
            
              × 
             
            
              ( 
             
            
              d 
             
            
              × 
             
             
             
               p 
              
             
               0 
              
             
            
              ) 
             
            
           
          
          
          
         
        
       
         \begin{equation} \textbf{n}=-\textbf{d}\times(\textbf{d}\times\textbf{p}_0) \end{equation} 
        
       
     n=?d×(d×p0?)??
 在椭球面系列—基本性质一文中,我们给出了椭球面的法线基本性质,可得:
  
      
       
        
         
          
          
           
            
             
             
               k 
              
             
               2 
              
             
            
              = 
             
             
             
               n 
              
             
               T 
              
             
             
             
               C 
              
              
              
                ? 
               
              
                1 
               
              
             
            
              n 
             
            
           
          
          
          
         
        
       
         \begin{equation} k^2=\textbf{n}^T\textbf{C}^{-1}\textbf{n} \end{equation} 
        
       
     k2=nTC?1n??
 那么椭球面上离直线最近的点 
     
      
       
       
         r 
        
       
      
        \textbf{r} 
       
      
    r可由下式给出:
  
      
       
        
         
          
          
           
            
            
              r 
             
            
              = 
             
             
             
               1 
              
             
               k 
              
             
             
             
               C 
              
              
              
                ? 
               
              
                1 
               
              
             
            
              n 
             
            
           
          
          
          
         
        
       
         \begin{equation} \textbf{r}=\frac1k\textbf{C}^{-1}\textbf{n} \end{equation} 
        
       
     r=k1?C?1n??
下面我们再给出直线上距离椭球面最近的点 
     
      
       
       
         p 
        
       
      
        \textbf{p} 
       
      
    p的求解。由前面给出的几条性质可知, 
     
      
       
       
         r 
        
       
         ? 
        
       
         p 
        
       
      
        \textbf{r}-\textbf{p} 
       
      
    r?p是垂直于直线的。因此将 
     
      
       
       
         r 
        
       
         ? 
        
        
        
          p 
         
        
          0 
         
        
       
      
        \textbf{r}-\textbf{p}_0 
       
      
    r?p0?投影到直线方向上可得到距离 
     
      
       
       
         t 
        
       
      
        t 
       
      
    t:
  
      
       
        
         
          
          
           
            
            
              t 
             
            
              = 
             
            
              ( 
             
            
              r 
             
            
              ? 
             
             
             
               p 
              
             
               0 
              
             
            
              ) 
             
            
              ? 
             
            
              d 
             
            
           
          
          
          
         
        
       
         \begin{equation} t=(\textbf{r}-\textbf{p}_0)\cdot\textbf{d} \end{equation} 
        
       
     t=(r?p0?)?d??
 那么射线上距离椭球面最近点 
     
      
       
       
         p 
        
       
      
        \textbf{p} 
       
      
    p可表示为:
  
      
       
        
         
          
          
           
            
            
              p 
             
            
              = 
             
             
             
               p 
              
             
               0 
              
             
            
              + 
             
            
              t 
             
            
              d 
             
            
           
          
          
          
         
        
       
         \begin{equation} \textbf{p}=\textbf{p}_0+t\textbf{d} \end{equation} 
        
       
     p=p0?+td??
上图推导过程中虽然依赖射线,但是整个过程都是与直线相关的,也就是说,射线的方向不影响结论。见下图,射线的方向 d \textbf{d} d相反,但是最终的结论都是求得直线上离椭球面最近点。

 实际编程计算时需要考虑射线情况时,对于上图右图情形,显然射线方向离椭球体距离越来越远,最近点即为 
     
      
       
        
        
          p 
         
        
          0 
         
        
       
      
        \textbf{p}_0 
       
      
    p0?,用公式表达为:
  
      
       
        
         
         
           p 
          
         
           0 
          
         
        
          ? 
         
        
          d 
         
        
          > 
         
        
          0 
         
        
       
         \textbf{p}_0\cdot\textbf{d}>0 
        
       
     p0??d>0
另外一种情形,在向量 n \textbf{n} n的求解中用到向量的叉乘,如果 p 0 \textbf{p}_0 p0?和 d \textbf{d} d在一条直线上时则叉乘结果为0,此时对应射线指向椭球圆心,即射线与椭球面相交,那么可使用"射线与椭球面的交点"计算,而不是使用本算法计算。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!