前面给出了射线与椭球体的交点问题的求解,本节讨论当射线与椭球面无交点时,那么在椭球面上离射线最近的点在那里?
本文给出具体的计算原理和矩阵表达的过程,便于编程计算。
有关椭圆的基础性质,请参考椭球面系列—基本性质
见下图,已知射线(点为
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的笛卡尔坐标?
?
首先不加证明的给出几个基本性质:
综合以上性质,我们可以知道,利用射线可以求得截面内垂直于射线的向量 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,此时对应射线指向椭球圆心,即射线与椭球面相交,那么可使用"射线与椭球面的交点"计算,而不是使用本算法计算。