射线与椭球体的交点问题的求解是一个非常常见和经典的问题,本文给出具体的计算原理和矩阵表达的过程,便于编程计算。
见下图,已知射线(点为 p 0 \textbf{p}_0 p0,单位方向为 d \textbf{d} d),那么与椭球面的交点 p \textbf{p} p) 的笛卡尔坐标。
在继续计算前,记住之前我们的假设:椭球面和直线等坐标都是在椭球为中心的笛卡尔坐标系下。
有关椭圆的基础性质,请参考:椭球面系列—基本性质!!
首先,射线上任意一点 p \textbf{p} p与 p 0 \textbf{p}_0 p0的距离为 t t t,则 p \textbf{p} p可表示为:
p = p 0 + t d \begin{equation} \textbf{p}=\textbf{p}_0+t\textbf{d} \end{equation} p=p0+td
p \textbf{p} p在椭球面上,则需满足椭球面方程:
p T Cp = 1 \textbf{p}^T\textbf{C}\textbf{p}=1 pTCp=1
则有:
( p 0 + t d ) T C ( p 0 + t d ) = 1 (\textbf{p}_0+t\textbf{d})^T\textbf{C}(\textbf{p}_0+t\textbf{d})=1 (p0+td)TC(p0+td)=1
化简可得:
( d T Cd ) t 2 + 2 ( p 0 T Cd ) t + p 0 T C p 0 − 1 = 0 (\textbf{d}^T\textbf{C}\textbf{d})t^2+2(\textbf{p}_0^T\textbf{C}\textbf{d})t+\textbf{p}_0^T\textbf{C}\textbf{p}_0-1=0 (dTCd)t2+2(p0TCd)t+p0TCp0−1=0
上式为典型的关于 t t t的一元二次方程:
a t 2 + b t + c = 0 at^2+bt+c=0 at2+bt+c=0
其中:
{ a = d T Cd b = 2 p 0 T Cd c = p 0 T C p 0 − 1 \begin{cases} a=\textbf{d}^T\textbf{C}\textbf{d} \\ b=2\textbf{p}_0^T\textbf{C}\textbf{d} \\ c=\textbf{p}_0^T\textbf{C}\textbf{p}_0-1 \end{cases} ⎩ ⎨ ⎧a=dTCdb=2p0TCdc=p0TCp0−1
最终得到距离 t t t的解(最多2个解):
t = − b ± b 2 − 4 a c 2 a t = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a} t=2a−b±b2−4ac
显然:
-
b 2 − 4 a c > 0 b^2 - 4ac>0 b2−4ac>0时,表示射线与椭球面有两个交点。
-
b 2 − 4 a c = 0 b^2 - 4ac=0 b2−4ac=0时,表示射线与椭球面相切。
-
b 2 − 4 a c < 0 b^2 - 4ac<0 b2−4ac<0时,表示射线与椭球面不相交。
当 t t t求得后,带入式(1)即可得到 p \textbf{p} p点的坐标。