射线与椭球体的交点问题的求解是一个非常常见和经典的问题,本文给出具体的计算原理和矩阵表达的过程,便于编程计算。
见下图,已知射线(点为 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点的坐标。