任意椭圆的外凸包矩形算法

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=xcosθysinθ+h,y=xsinθ+ycosθ+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 Ax2+2Bxy+Cy2+2Dx+2Ey+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θ(AC)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=HB2AC=B2AC=δABDBCEDEF=ABDBCEDEF=Δ

二次曲线方程系数之间的三个基本不变量。

二次曲线分类定理

  1. Δ = 0 \Delta = 0 Δ=0 时, 二次曲线蜕化
    1. δ < 0 \delta < 0 δ<0 时,点椭圆
    2. δ > 0 \delta > 0 δ>0 时,相交两直线
    3. δ = 0 \delta = 0 δ=0 时,平行两直线(包括相重)
  2. Δ ≠ 0 \Delta \ne 0 Δ=0
    1. δ < 0 \delta < 0 δ<0 时,二次曲线为椭圆(有可能为虚椭圆)。
    2. δ > 0 \delta > 0 δ>0 时,二次曲线为双曲线。
    3. δ = 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)2A(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 (B2AC)y2+2(BDAE)y+(D2AF)=0

δ = B 2 − A C ,    β = B D − A E ,    γ = D 2 − A F \delta=B^2-AC, \;\beta=BD-AE, \;\gamma=D^2-AF δ=B2AC,β=BDAE,γ=D2AF

则可以求得到:
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)2C(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 (B2AC)x2+2(BECD)x+(E2CF)=0

δ = B 2 − A C ,    α = B E − C D ,    λ = E 2 − C F \delta=B^2-AC, \;\alpha=BE-CD, \;\lambda=E^2-CF δ=B2AC,α=BECD,λ=E2CF

则可以求得:
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

Geogebra中实现的凸包矩形

离心率

到定点(焦点)的距离与到定直线(准线)的距离的商是常数 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=a2b2,a2+b2=2a2c2=a2(2e2)

蒙日圆

蒙日圆上任一点到圆锥曲线的两条切线是相互垂直的。
蒙日圆
椭圆的蒙日圆的圆心就是椭圆的中心,半径就是 r = a 2 + b 2 = a 2 − e 2 r=\sqrt{a^2+b^2}=a\sqrt{2-e^2} r=a2+b2 =a2e2

利用蒙日圆得到椭圆外凸包矩形

参见 GeoGebra网站
蒙日圆求椭圆的凸包矩形

面积差值对比

与最小凸包矩形的面积差值

参考文献

  1. 如何计算包围倾斜椭圆的最小矩形

  2. How to get the limits of rotated ellipse?

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值