写在前面
最近的研究中大量的用到了椭圆、椭球等东西,而且我在学习过程中发现中文网络上居然查不到“点到椭球面的距离”这种看起来非常理所当然大家都会的东西,甚至连个推导过程都没有.在谷歌上查到了一篇相关的文章,在学习过程中,想把心得体会等记录下来,写在这里.那篇文章的链接先放在这里了.
下载原pdf
点到椭圆的距离
椭圆的一些基础知识
一个二维的普通椭圆可以由一个中心点 C \mathbf{C} C,一组椭圆轴方向的标准正交的向量 { U 0 , U 1 } \{\mathbf{U}_0,\mathbf{U}_1\} {U0,U1},以及 e i e_i ei表示(其中 e 0 ≥ e 1 > 0 e_0\geq e_1>0 e0≥e1>0).椭圆上的所有点可以表示为
P = C + x 0 U 0 + x 1 U 1 (1) \mathbf{P} = \mathbf{C}+x_0\mathbf{U}_0+x_1\mathbf{U}_1 \tag{1} P=C+x0U0+x1U1(1)
其中
( x 0 e 0 ) 2 + ( x 1 e 1 ) 2 = 1 (2) (\frac{x_0}{e_0})^2+(\frac{x_1}{e_1})^2=1 \tag{2} (e0x0)2+(e1x1)2=1(2)
由于轴方向是正交的,则有
x
i
=
U
i
⋅
(
P
−
C
)
x_{i}=\mathbf{U}_{i} \cdot(\mathbf{P}-\mathbf{C})
xi=Ui⋅(P−C),带入(2)式中,可以得到
(
P
−
C
)
T
M
(
P
−
C
)
=
1
(3)
(\mathbf{P}-\mathbf{C})^T M(\mathbf{P}-\mathbf{C})=1\tag{3}
(P−C)TM(P−C)=1(3)
其中 M = R T D R M = R^TDR M=RTDR, R R R是正交矩阵,每一列分别为 { U 0 , U 1 } \{\mathbf{U}_0,\mathbf{U}_1\} {U0,U1}; D D D是一个对角阵,对角元素为 1 e 0 2 , 1 e 1 2 \frac{1}{e_0^2},\frac{1}{e_1^2} e021,e121.
想求出点到椭圆的距离,在椭圆对应的坐标系下进行求解就很重要.也就是说将任一点 Q Q Q表示为 Q = C + y 0 U 0 + y 1 U 1 \mathbf{Q} = \mathbf{C}+y_0\mathbf{U}_0+y_1\mathbf{U}_1 Q=C+y0U0+y1U1的形式.由方程(3)定义的点 Q Q Q到点 P P P 的距离,与由椭圆标准方程定义的 Y = ( y 0 , y 1 ) Y=(y_0,y_1) Y=(y0,y1)到 X = ( x 0 , x 1 ) X=(x_0,x_1) X=(x0,x1)的距离是相等的.
再利用椭圆的对称性简化我们的问题(这里就不再赘述).我们只考虑在第一象限的点.
我们的问题是找到点到椭圆的距离,那么也就是要在椭圆上找到到目标点最近的点.
一个重要发现:椭圆上最近点处的法线指向目标点
标准椭圆的参数化表达式为 X ( θ ) = ( e 0 cos θ , e 1 sin θ ) , θ ∈ [ 0 , 2 π ) X(\theta)=(e_0\cos{\theta},e_1\sin{\theta}),\theta\in\left[0,2\pi\right) X(θ)=(e0cosθ,e1sinθ),θ∈[0,2π),点 Y \mathbf{Y} Y 到椭圆上任意一点的距离可表示为:
F ( θ ) = ∣ X ( θ ) − Y ∣ 2 (4) F(\theta)=|\mathbf{X}(\theta)-\mathbf{Y}|^2\tag{4} F(θ)=∣X(θ)−Y∣2(4)
这是一个非负、周期性、可微的函数,因此它一定会有一个全局最小值,此时的一阶导数值为0,即
F ′ ( θ ) = 2 ( X ( θ ) − Y ) ∗ X ′ ( θ ) = 0 (5) F'(\theta)=2(\mathbf{X}(\theta)-\mathbf{Y})*\mathbf{X}'(\theta)=0\tag{5} F′(θ)=2(X(θ)−Y)∗X′(θ)=0(5)
这是两个向量的内积,那么也就是说这两个向量是垂直的. X ′ ( θ ) \mathbf{X}'(\theta) X′(θ)是 X ( θ ) \mathbf{X}(\theta) X(θ)处的切线,则说明点 Y \mathbf{Y} Y 到最近的点 X \mathbf{X} X所连接成的向量就正是这里的曲线的法线.
有了这一发现,我们再利用椭圆的隐式表达式: G ( x 0 , x 1 ) = ( x 0 / e 0 ) 2 + ( x 1 / e 1 ) 2 − 1 = 0 G(x_0,x_1)=(x_0/e_0)^2+(x_1/e_1)^2-1=0 G(x0,x1)=(x0/e0)2+(x1/e1)2−1=0, G ( x 0 , x 1 ) G(x_0,x_1) G(x0,x1)处的梯度就是点 ( x 0 , x 1 ) (x_0,x_1) (x0,x1) 处的法向量.则有 ( y 0 , y 1 ) − ( x 0 , x 1 ) = t ∇ G ( x 0 , x 1 ) / 2 = t ( x 0 / e 0 2 , x 1 / e 1 2 ) (y_0,y_1)-(x_0,x_1)=t\nabla G(x_0,x_1)/2=t(x_0/e_0^2,x_1/e_1^2) (y0,y1)−(x0,x1)=t∇G(x0,x1)/2=t(x0/e02,x1/e12), 也即
y 0 = x 0 ( 1 + t e 0 2 ) , y 1 = x 1 ( 1 + t e 1 2 ) (6) y_0 = x_0(1+\frac{t}{e_0^2}),y_1 = x_1(1+\frac{t}{e_1^2})\tag{6} y0=x0(1+e02t),y1=x1(1+e12t)(6)
如果 ( y 0 , y 1 ) (y_0,y_1) (y0,y1)在椭圆外,则 t > 0 t>0 t>0;如果 ( y 0 , y 1 ) (y_0,y_1) (y0,y1)在椭圆内,则 t < 0 t<0 t<0;如果 ( y 0 , y 1 ) (y_0,y_1) (y0,y1)在椭圆上,则 t = 0 t=0 t=0,距离为0.
圆的情况
如果
e
0
=
e
1
e_0=e_1
e0=e1,则椭圆为一个圆.原点
(
0
,
0
)
(0,0)
(0,0)在圆上有无限个距离最近的点,显然最近距离为
e
0
e_0
e0. 非原点的任意一点
(
y
0
,
y
1
)
(y_0,y_1)
(y0,y1)的距离最近的点为
(
x
0
,
x
1
)
=
e
0
(
y
0
,
y
1
)
/
∣
(
y
0
,
y
1
)
∣
(x_0,x_1)=e_0(y_0,y_1)/|(y_0,y_1)|
(x0,x1)=e0(y0,y1)/∣(y0,y1)∣.
式(6)中的
t
=
−
e
0
2
+
e
0
y
0
2
+
y
1
2
t=-e_{0}^{2}+e_{0} \sqrt{y_{0}^{2}+y_{1}^{2}}
t=−e02+e0y02+y12.
目标点为原点
y 0 = 0 , y 1 = 0 y_0=0,y_1=0 y0=0,y1=0.式(6)化为 0 = x 0 ( 1 + t / e 0 2 ) , 0 = x 1 ( 1 + t / e 1 2 ) 0=x_{0}\left(1+t / e_{0}^{2}\right),0=x_{1}\left(1+t/e_{1}^{2}\right) 0=x0(1+t/e02),0=x1(1+t/e12), 考虑4个情况
- x 0 = 0 , x 1 = 0 x_0=0,x_1=0 x0=0,x1=0,显然不在椭圆上,排除掉;
- x 0 = 0 , x 1 ≠ 0 x_0=0,x_1\ne 0 x0=0,x1=0,有 t = − e 1 2 t=-e_1^2 t=−e12,这个点为 ( 0 , e 1 ) (0,e_1) (0,e1)
- x 0 ≠ 0 , x 1 = 0 x_0\ne 0,x_1=0 x0=0,x1=0,有 t = − e 0 2 t=-e_0^2 t=−e02,这个点为 ( e 0 , 0 ) (e_0,0) (e0,0)
- x 0 ≠ 0 , x 1 ≠ 0 x_0\ne 0,x_1\ne 0 x0=0,x1=0,有 t = − e 1 2 t=-e_1^2 t=−e12且 t = − e 1 2 t=-e_1^2 t=−e12,显然不成立,排除掉;
那么只有 ( 0 , e 1 ) (0,e_1) (0,e1)和 ( e 0 , 0 ) (e_0,0) (e0,0)这两个点满足条件,而显然 ( 0 , e 1 ) (0,e_1) (0,e1)更近,则其距离为 d = e 1 d=e_1 d=e1
目标点在 y y y轴上
y 0 = 0 , y 1 > 0 y_0=0,y_1>0 y0=0,y1>0.式(6)化为 0 = x 0 ( 1 + t / e 0 2 ) , y 1 = x 1 ( 1 + t / e 1 2 ) 0=x_{0}\left(1+t / e_{0}^{2}\right),y_1=x_{1}\left(1+t/e_{1}^{2}\right) 0=x0(1+t/e02),y1=x1(1+t/e12), 考虑2 个情况
- x 0 = 0 x_0=0 x0=0,为使其在椭圆上,这个点为 ( 0 , e 1 ) (0,e_1) (0,e1);
-
x
0
≠
0
x_0\ne0
x0=0,有
t
=
−
e
0
2
,
y
1
=
x
1
(
1
−
e
0
2
/
e
1
2
t=-e_0^2,y_1=x_1(1-e_0^2/e_1^2
t=−e02,y1=x1(1−e02/e12.而由于
x
1
≥
0
,
e
0
>
e
1
x_1\geq 0,e_0>e_1
x1≥0,e0>e1,有
y
1
<
0
y_1<0
y1<0 矛盾
因此最近的点为 ( 0 , e 1 ) (0,e_1) (0,e1),距离为 d = ∣ e 1 − y 1 ∣ d=|e_1-y_1| d=∣e1−y1∣
目标点在 x x x轴上
y 0 > 0 , y 1 = 0 y_0>0,y_1=0 y0>0,y1=0.式(6)化为 y 0 = x 0 ( 1 + t / e 0 2 ) , 0 = x 1 ( 1 + t / e 1 2 ) y_0=x_{0}\left(1+t / e_{0}^{2}\right),0=x_{1}\left(1+t/e_{1}^{2}\right) y0=x0(1+t/e02),0=x1(1+t/e12), 考虑2 个情况
- x 1 = 0 x_1=0 x1=0,为使其在椭圆上,这个点为 ( e 0 , 0 ) (e_0,0) (e0,0);距离的平方为
d 0 2 = ( y 0 − e 0 ) 2 (7) d_0^2=(y_0-e_0)^2 \tag{7} d02=(y0−e0)2(7)
- x 1 ≠ 0 x_1\ne0 x1=0,有 t = − e 1 2 t=-e_1^2 t=−e12,把 t t t代入可得 y 0 = x 0 ( 1 − e 1 2 / e 0 2 ) y_0=x_0(1-e_1^2/e_0^2) y0=x0(1−e12/e02).由于点 ( x 0 , x 1 ) (x_0,x_1) (x0,x1)在椭圆上, x 0 = e 0 2 y 0 / ( e 0 2 − e 1 2 ) ≤ e 0 x_0=e_0^2y_0/(e_0^2-e_1^2)\leq e_0 x0=e02y0/(e02−e12)≤e0,可知道 y 0 ≤ ( e 0 2 − e 1 2 ) / e 0 < e 0 . y_0\leq (e_0^2-e_1^2)/e_0<e_0. y0≤(e02−e12)/e0<e0.因此这个情况只包含了 ( y 0 , 0 ) (y_0,0) (y0,0)在椭圆中的情况.而当 y 0 ≥ ( e 0 2 − e 1 2 ) / e 0 y_0\geq (e_0^2-e_1^2)/e_0 y0≥(e02−e12)/e0时,最近的点一定为 ( e 0 , 0 ) (e_0,0) (e0,0).若 y 0 ≤ ( e 0 2 − e 1 2 ) / e 0 y_0\leq (e_0^2-e_1^2)/e_0 y0≤(e02−e12)/e0,解得点 x 1 = e 1 1 − ( x 0 / e 0 ) 2 x_1=e_1\sqrt{1-(x_0/e_0)^2} x1=e11−(x0/e0)2,距离的平方为
d 1 2 = ( x 0 − y 0 ) 2 + x 1 2 = e 1 2 ( 1 − y 0 2 e 0 2 − e 1 2 ) (8) d_{1}^{2}=\left(x_{0}-y_{0}\right)^{2}+x_{1}^{2}=e_{1}^{2}\left(1-\frac{y_{0}^{2}}{e_{0}^{2}-e_{1}^{2}}\right)\tag{8} d12=(x0−y0)2+x12=e12(1−e02−e12y02)(8)
两个候选点分别为 ( e 0 , 0 ) 和 ( x 0 , x 1 ) \left(e_{0}, 0\right) \text {和}\left(x_{0}, x_{1}\right) (e0,0)和(x0,x1),我们需要判别哪个更接近 ( y 0 , 0 ) (y_0,0) (y0,0).
d 0 2 − d 1 2 = ( e 0 y 0 + e 1 2 − e 0 2 ) 2 e 0 2 − e 1 2 ≥ 0 (9) d_{0}^{2}-d_{1}^{2}=\frac{\left(e_{0} y_{0}+e_{1}^{2}-e_{0}^{2}\right)^{2}}{e_{0}^{2}-e_{1}^{2}} \geq 0 \tag{9} d02−d12=e02−e12(e0y0+e12−e02)2≥0(9)
因此 ( x 0 , x 1 ) \left(x_{0}, x_{1}\right) (x0,x1)是更近的点.
总结:在第一象限中,距离 ( y 0 , 0 ) (y_0,0) (y0,0)最近的点需要分类讨论:
- 0 < y 0 < ( e 0 2 − e 1 2 ) / e 0 0<y_0<(e_0^2-e_1^2)/e_0 0<y0<(e02−e12)/e0,最近的点为 ( x 0 , x 1 ) (x_0,x_1) (x0,x1)其中 x 0 = e 0 2 y 0 / ( e 0 2 − e 1 2 ) , x 1 = e 1 1 − ( x 0 / e 0 ) 2 x_0=e_0^2y_0/(e_0^2-e_1^2),x_1=e_1\sqrt{1-(x_0/e_0)^2} x0=e02y0/(e02−e12),x1=e11−(x0/e0)2,距离为 d = ( x 0 − y 0 ) 2 + x 1 2 = e 1 2 ( 1 − y 0 2 e 0 2 − e 1 2 ) d=\sqrt{\left(x_{0}-y_{0}\right)^{2}+x_{1}^{2}}=\sqrt{e_{1}^{2}\left(1-\frac{y_{0}^{2}}{e_{0}^{2}-e_{1}^{2}}\right)} d=(x0−y0)2+x12=e12(1−e02−e12y02)
- y 0 ≥ ( e 0 2 − e 1 2 ) / e 0 y_0\geq(e_0^2-e_1^2)/e_0 y0≥(e02−e12)/e0,最近的点为 ( e 0 , 0 ) (e_0,0) (e0,0),距离为 d = ∣ y 0 − e 0 ∣ d=|y_0-e_0| d=∣y0−e0∣
目标点严格在第一象限
取 y 0 > 0 , y 1 > 0 y_0>0,y_1>0 y0>0,y1>0,则方程(6)的解为
x 0 = e 0 2 y 0 t + e 0 2 , x 1 = e 1 2 y 1 t + e 1 2 (10) x_{0}=\frac{e_{0}^{2} y_{0}}{t+e_{0}^{2}}, \quad x_{1}=\frac{e_{1}^{2} y_{1}}{t+e_{1}^{2}}\tag{10} x0=t+e02e02y0,x1=t+e12e12y1(10)
由于只考虑第一象限,则有
x
0
≥
0
,
x
1
≥
0
x_{0} \geq 0 , x_{1} \geq 0
x0≥0,x1≥0,也即
t
>
−
e
0
2
,
t
>
−
e
1
2
t>-e_{0}^{2} ,t>-e_{1}^{2}
t>−e02,t>−e12,又由于
e
0
>
e
1
e_0>e_1
e0>e1,则有
t
>
−
e
1
2
t>-e_{1}^{2}
t>−e12.
将等式(10)代回到(2)中有
F ( t ) = ( e 0 y 0 t + e 0 2 ) 2 + ( e 1 y 1 t + e 1 2 ) 2 − 1 = 0 (11) F(t)=\left(\frac{e_{0} y_{0}}{t+e_{0}^{2}}\right)^{2}+\left(\frac{e_{1} y_{1}}{t+e_{1}^{2}}\right)^{2}-1=0\tag{11} F(t)=(t+e02e0y0)2+(t+e12e1y1)2−1=0(11)
此函数的定义域为 t ∈ ( − e 1 2 , ∞ ) t\in(-e_1^2,\infty) t∈(−e12,∞),距离目标点最近的点由此等式的根定义.
一阶导、二阶导为
F ′ ( t ) = − 2 e 0 2 y 0 2 ( t + e 0 2 ) 3 − 2 e 1 2 y 1 2 ( t + e 1 2 ) 3 , F ′ ′ ( t ) = 6 e 0 2 y 0 2 ( t + e 0 2 ) 4 + 6 e 1 2 y 1 2 ( t + e 1 2 ) 4 (12) F^{\prime}(t)=-\frac{2 e_{0}^{2} y_{0}^{2}}{\left(t+e_{0}^{2}\right)^{3}}-\frac{2 e_{1}^{2} y_{1}^{2}}{\left(t+e_{1}^{2}\right)^{3}}, \quad F^{\prime \prime}(t)=\frac{6 e_{0}^{2} y_{0}^{2}}{\left(t+e_{0}^{2}\right)^{4}}+\frac{6 e_{1}^{2} y_{1}^{2}}{\left(t+e_{1}^{2}\right)^{4}}\tag{12} F′(t)=−(t+e02)32e02y02−(t+e12)32e12y12,F′′(t)=(t+e02)46e02y02+(t+e12)46e12y12(12)
在定义域上有 F ′ ( t ) < 0 , F ′ ′ ( t ) > 0 F^{\prime}(t)<0,F^{\prime \prime}(t)>0 F′(t)<0,F′′(t)>0,且
lim
t
→
−
e
1
2
+
F
(
t
)
=
+
∞
,
lim
t
→
∞
F
(
t
)
=
−
1
(13)
\lim _{t \rightarrow-e_{1}^{2}+} F(t)=+\infty, \lim _{t \rightarrow \infty} F(t)=-1\tag{13}
t→−e12+limF(t)=+∞,t→∞limF(t)=−1(13)
第一个表达式表示单侧极限(
t
→
−
e
1
2
,
且
t
>
−
e
1
2
t\rightarrow -e_1^2,\text{且}t>-e_1^2
t→−e12,且t>−e12)
F
(
t
)
F(t)
F(t)是一个关于
t
t
t的严格递减函数,函数值首先为正、然后变成负数,因此必定有唯一零点.
因此只需要解出来这样的一个
t
ˉ
\bar{t}
tˉ,代入到(6)中即可得出
(
x
0
,
x
1
)
(x_0,x_1)
(x0,x1),然后就可以求出来最小距离.
写在后面
要求点到椭球距离,需要先学习点到椭圆的距离,说实话,光打这篇文章就已经非常累了,还有些地方不是很能看得懂。
明天继续打后面的第二部分,也就是点到椭球面的距离。
而且在这里写博客的时候发现不会给方程标号,也不会引用。随后再研究研究,修改一下,尽量完善一下。