How to get the limits of rotated ellipse?
任意椭圆的外凸包矩形算法
问题来源:人脸检测数据集FDDB,涉及到将原标签中的椭圆形状转化为矩形框用于人脸检测,其中就有生成斜椭圆的外接包围矩形的方法,结果如下图。
注意:不是下图的最小面积矩形,最小面积矩形指两对边分别与主轴和副轴平行的斜矩形,参见下图。
二次曲线的方程表达式
首先从二次曲线的方程式入手,它可以写成以下形式:
A
x
2
+
2
B
x
y
+
C
y
2
+
2
D
x
+
2
E
y
+
F
=
0
Ax^2+2Bxy+Cy^2+2Dx+2Ey+F=0
Ax2+2Bxy+Cy2+2Dx+2Ey+F=0
其中针对椭圆的标准方程:
x
2
a
2
+
y
2
b
2
=
1
\dfrac{x^2}{a^2}+\dfrac{y^2}{b^2} = 1
a2x2+b2y2=1
如果 a = b a=b a=b 上述方程就是半径为 a a a 的圆,所以椭圆有时候称为变形的圆。
标准椭圆通过平移和旋转等几何变换后,
x = x ′ cos θ − y ′ sin θ + h , y = x ′ sin θ + y ′ cos θ + k x=x'\cos\theta-y'\sin\theta+h,\\ y=x'\sin\theta+y'\cos\theta+k\; x=x′cosθ−y′sinθ+h,y=x′sinθ+y′cosθ+k
此标准方程变形为:
A
′
x
′
2
+
2
B
′
x
′
y
′
+
C
′
y
′
2
+
2
D
′
x
′
+
2
E
′
y
′
+
F
′
=
0
A'x'^2 + 2B'x'y'+C'y'^2+2D'x'+2E'y'+F'=0
A′x′2+2B′x′y′+C′y′2+2D′x′+2E′y′+F′=0
其中
A
′
=
A
cos
2
θ
+
2
B
cos
θ
sin
θ
+
C
sin
2
θ
A'=A\cos^2\theta+2B\cos\theta\sin\theta+C\sin^2\theta
A′=Acos2θ+2Bcosθsinθ+Csin2θ
2
B
′
=
2
B
cos
2
θ
−
(
A
−
C
)
sin
2
θ
2B'=2B\cos2\theta-(A-C)\sin2\theta
2B′=2Bcos2θ−(A−C)sin2θ
C
′
=
A
sin
2
θ
−
2
B
cos
θ
sin
θ
+
C
cos
2
θ
C'=A\sin^2\theta-2B\cos\theta\sin\theta+C\cos^2\theta
C′=Asin2θ−2Bcosθsinθ+Ccos2θ
2
D
′
=
2
A
h
cos
θ
+
2
B
(
k
cos
θ
+
h
sin
θ
)
+
2
C
k
sin
θ
+
2
D
cos
θ
+
2
E
sin
θ
2D'=2Ah\cos\theta+2B(k\cos\theta+h\sin\theta)+2Ck\sin\theta+2D\cos\theta+2E\sin\theta
2D′=2Ahcosθ+2B(kcosθ+hsinθ)+2Cksinθ+2Dcosθ+2Esinθ
2
E
′
=
−
2
A
h
sin
θ
+
2
B
(
h
cos
θ
−
k
sin
θ
)
+
2
C
k
cos
θ
−
2
D
sin
θ
+
2
E
cos
θ
2E'=-2Ah\sin\theta+2B(h\cos\theta-k\sin\theta)+2Ck\cos\theta-2D\sin\theta+2E\cos\theta
2E′=−2Ahsinθ+2B(hcosθ−ksinθ)+2Ckcosθ−2Dsinθ+2Ecosθ
F
′
=
A
h
2
+
2
B
h
k
+
C
k
2
+
2
D
h
+
2
E
k
+
F
F'=Ah^2+2Bhk+Ck^2+2Dh+2Ek+F
F′=Ah2+2Bhk+Ck2+2Dh+2Ek+F
二次曲线方程的系数关系
记录
A + C = A ′ + C ′ = H B 2 − A C = B ′ 2 − A ′ C ′ = δ ∣ A B D B C E D E F ∣ = ∣ A ′ B ′ D ′ B ′ C ′ E ′ D ′ E ′ F ′ ∣ = Δ A+C=A'+C'=H \\ B^2-AC=B'^2-A'C'=\delta \\ \left |\begin{array}{cccc} A &B &D \\ B &C &E \\ D &E &F \\ \end{array}\right|= \left |\begin{array}{cccc} A' &B' &D' \\ B' &C' &E' \\ D' &E' &F' \\ \end{array}\right|=\Delta A+C=A′+C′=HB2−AC=B′2−A′C′=δ∣∣∣∣∣∣ABDBCEDEF∣∣∣∣∣∣=∣∣∣∣∣∣A′B′D′B′C′E′D′E′F′∣∣∣∣∣∣=Δ
是二次曲线方程系数之间的三个基本不变量。
二次曲线分类定理
- 当
Δ
=
0
\Delta = 0
Δ=0 时, 二次曲线蜕化
- δ < 0 \delta < 0 δ<0 时,点椭圆
- δ > 0 \delta > 0 δ>0 时,相交两直线
- δ = 0 \delta = 0 δ=0 时,平行两直线(包括相重)
- 当
Δ
≠
0
\Delta \ne 0
Δ=0 时
- 当 δ < 0 \delta < 0 δ<0 时,二次曲线为椭圆(有可能为虚椭圆)。
- 当 δ > 0 \delta > 0 δ>0 时,二次曲线为双曲线。
- 当 δ = 0 \delta = 0 δ=0 时,二次曲线为抛物线。
在Geogebra中,如何获取二次曲线方程或多项式系数
Coefficients(conic)
Coefficients command, that displays the coefficients of the conic, using the form
a x 2 + b y 2 + c + d x y + e x + f y = 0 ax^2 + by^2 + c +dxy + ex + fy = 0 ax2+by2+c+dxy+ex+fy=0
A = a , B = d / 2.0 , C = b , D = e / 2.0 , E = f / 2.0 , F = c A=a, \;B=d/2.0, \;C=b, \;D=e/2.0, \;E=f/2.0, \;F=c A=a,B=d/2.0,C=b,D=e/2.0,E=f/2.0,F=c
针对一般方程计算椭圆的边界
假设 二次曲线的方程为
A x 2 + 2 B x y + C y 2 + 2 D x + 2 E y + F = 0 Ax^2+2Bxy+Cy^2+2Dx+2Ey+F=0 Ax2+2Bxy+Cy2+2Dx+2Ey+F=0
题目要求:该椭圆的最小包围矩形(凸包矩形)
思考路径:求出斜椭圆的 x m i n , x m a x , y m i n , y m a x x_{min}, x_{max}, y_{min}, y_{max} xmin,xmax,ymin,ymax
(1) 用直线
y
=
k
y=k
y=k 去截椭圆, 相交就是两个交点,相切就是一个交点,不相交就是无解。
故可以通过一元二次方程判别式来求解。
显然,我们要求相切的情形。
椭圆方程可以看成关于
x
x
x的一元二次方程:
A
x
2
+
2
(
B
y
+
D
)
x
+
(
C
y
2
+
2
E
y
+
F
)
=
0
Ax^2+2(By+D)x+(Cy^2+2Ey+F)=0
Ax2+2(By+D)x+(Cy2+2Ey+F)=0
由判别式
Δ
=
0
\Delta=0
Δ=0, 我们得到:
(
B
y
+
D
)
2
−
A
(
C
y
2
+
2
E
y
+
F
)
=
0
(By+D)^2-A(Cy^2+2Ey+F)=0
(By+D)2−A(Cy2+2Ey+F)=0
整理得到:
(
B
2
−
A
C
)
y
2
+
2
(
B
D
−
A
E
)
y
+
(
D
2
−
A
F
)
=
0
(B^2-AC)y^2+2(BD-AE)y+(D^2-AF)=0
(B2−AC)y2+2(BD−AE)y+(D2−AF)=0
记 δ = B 2 − A C , β = B D − A E , γ = D 2 − A F \delta=B^2-AC, \;\beta=BD-AE, \;\gamma=D^2-AF δ=B2−AC,β=BD−AE,γ=D2−AF
则可以求得到:
y
m
a
x
=
−
β
+
β
2
−
δ
γ
δ
y_{max} = \frac{-\beta+\sqrt{\beta^2-\delta\gamma}}{\delta}
ymax=δ−β+β2−δγ
y
m
i
n
=
−
β
−
β
2
−
δ
γ
δ
y_{min} = \frac{-\beta-\sqrt{\beta^2-\delta\gamma}}{\delta}
ymin=δ−β−β2−δγ
(2) 同理,用直线
x
=
h
x=h
x=h 去截椭圆, 相交就是两个交点,相切就是一个交点,不相交就是无解。
椭圆方程可以看成关于
y
y
y的一元二次方程:
C
y
2
+
2
(
B
x
+
E
)
x
+
(
A
x
2
+
2
D
y
+
F
)
=
0
Cy^2+2(Bx+E)x+(Ax^2+2Dy+F)=0
Cy2+2(Bx+E)x+(Ax2+2Dy+F)=0
由判别式
Δ
=
0
\Delta=0
Δ=0, 我们得到:
(
B
x
+
E
)
2
−
C
(
A
x
2
+
2
D
x
+
F
)
=
0
(Bx+E)^2-C(Ax^2+2Dx+F)=0
(Bx+E)2−C(Ax2+2Dx+F)=0
整理得到:
(
B
2
−
A
C
)
x
2
+
2
(
B
E
−
C
D
)
x
+
(
E
2
−
C
F
)
=
0
(B^2-AC)x^2+2(BE-CD)x+(E^2-CF)=0
(B2−AC)x2+2(BE−CD)x+(E2−CF)=0
记 δ = B 2 − A C , α = B E − C D , λ = E 2 − C F \delta=B^2-AC, \;\alpha=BE-CD, \;\lambda=E^2-CF δ=B2−AC,α=BE−CD,λ=E2−CF
则可以求得:
x
m
a
x
=
−
α
+
α
2
−
δ
λ
δ
x_{max} = \frac{-\alpha+\sqrt{\alpha^2-\delta\lambda}}{\delta}
xmax=δ−α+α2−δλ
x
m
i
n
=
−
α
−
α
2
−
δ
λ
δ
x_{min} = \frac{-\alpha-\sqrt{\alpha^2-\delta\lambda}}{\delta}
xmin=δ−α−α2−δλ
(3) 最后得到矩形的四个顶点为 ( x m i n , y m i n ) , ( x m a x , y m i n ) , ( x m a x , y m a x ) , ( x m i n , y m a x ) (x_{min}, y_{min}), (x_{max}, y_{min}), (x_{max}, y_{max}), (x_{min}, y_{max}) (xmin,ymin),(xmax,ymin),(xmax,ymax),(xmin,ymax)
用 Geogebra 得到的结果
利用函数 Coefficients(conic) 得到系数
转换后,直接计算即可得到包围倾斜椭圆的正矩形。
命令 Coefficients(椭圆ellipse):得到列表 { a , b , c , d , e , f } \{a,b,c,d,e,f\} {a,b,c,d,e,f}, 代表椭圆方程为 a x 2 + b y 2 + c + d x y + e x + f y = 0 ax^2+by^2+c+dxy+ex+fy=0 ax2+by2+c+dxy+ex+fy=0
离心率
到定点(焦点)的距离与到定直线(准线)的距离的商是常数 e(离心率)的点的轨迹。
- 当e>1时,为双曲线的一支,
- 当e=1时,为抛物线,
- 当 0< e <1 时,为椭圆,
- 当e=0时,为一点或一个圆。
离心率求法 e = c a e=\dfrac{c}{a} e=ac
在Geogebra软件中,还可以用命令 e=Eccentricity( 圆锥曲线 ) 得到圆锥曲线的离心率。
从而得到:圆锥曲线上一点的焦半径长度等于该点到相应准线的距离乘以离心率,
c
=
a
e
c=ae
c=ae。
在椭圆中有
c
2
=
a
2
−
b
2
,
a
2
+
b
2
=
2
a
2
−
c
2
=
a
2
(
2
−
e
2
)
c^2=a^2-b^2, a^2+b^2=2a^2-c^2=a^2(2-e^2)
c2=a2−b2,a2+b2=2a2−c2=a2(2−e2)
蒙日圆
蒙日圆上任一点到圆锥曲线的两条切线是相互垂直的。
椭圆的蒙日圆的圆心就是椭圆的中心,半径就是
r
=
a
2
+
b
2
=
a
2
−
e
2
r=\sqrt{a^2+b^2}=a\sqrt{2-e^2}
r=a2+b2=a2−e2
利用蒙日圆得到椭圆外凸包矩形
参见 GeoGebra网站