c++中计算2得n次方_斜椭圆外接正矩形计算方法

fcafdec9f0db4804ccd94dd37a9e0457.png

椭圆外接正矩形计算公式

How to get the bounding box for an ellipse?

人脸检测数据集FDDB,涉及到将原标签中的椭圆形状转化为矩形框用于人脸检测,所以整理其中生成椭圆外接矩形的方法与代码。

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

Explanation here: https://math.stackexchange.com/questions/91132/how-to-get-the-limits-of-rotated-ellipse

二次曲线的二次方程

二次曲线的二次方程可以写成以下形式: $$Ax^2+2Bxy+Cy^2+2Dx+2Ey+F=0$$

椭圆标准方程: $$frac{x^2}{a^2}+frac{y^2}{b^2} = 1$$

通过平移和旋转,

$$x=x'costheta-y'sintheta+h,y=x'sintheta+y'costheta+k$$

此方程可以变形为: $$A'x'^2 + 2B'x'y'+C'y'^2+2D'x'+2E'y'+F'=0$$

其中

$A'=Acos^2theta+2Bcosthetasintheta+Csin^2theta$
$2B'=2Bcos2theta-(A-C)sin2theta$
$C'=Asin^2theta-2Bcosthetasintheta+Ccos^2theta$
$D'=2Ahcostheta+2B(kcostheta+hsintheta)+2Cksintheta+2Dcostheta+2Esintheta$
$E'=-2Ahsintheta+2B(hcostheta-ksintheta)+2Ckcostheta-2Dsintheta+2Ecostheta$
$F'=Ah^2+2Bhk+Ck^2+2Dh+2Ek+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 $$

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

二次曲线分类定理

  1. 当$Delta = 0$时, 二次曲线蜕化
  2. $delta < 0$时,点椭圆
  3. $delta > 0$时,相交两直线
  4. $delta = 0$时,平行两直线(包括相重)
  5. 当$Delta ne 0$时
  6. 当 $delta < 0$ 时,二次曲线为椭圆(有可能为虚椭圆)。
  7. 当 $delta > 0$ 时,二次曲线为双曲线。
  8. 当 $delta = 0$ 时,二次曲线为抛物线。

在Geogebra中,如何获取二次曲线方程或多项式系数

Coefficients(conic)

Coefficients command, that displays the coefficients of the conic, using the form

$$ax^2 + by^2 + c +dxy + ex + fy = 0$$

$A=a, B=d/2.0, C=b, D=e/2.0, E=f/2.0, F=c$

针对一般方程计算椭圆的边界

假设 二次曲线的二次方程为

$$Ax^2+2Bxy+Cy^2+2Dx+2Ey+F=0$$

求:该椭圆的最小包围正矩形(斜的包围矩形)

路径:就是要求出斜椭圆的 $x_{min}, x_{max}, y_{min}, y_{max}$

(1)用直线 $y=k$ 去截椭圆, 相交就是两个交点,相切就是一个交点,不相交就是无解。

故可以通过一元二次方程判别式来求解。

显然,我们要求相切的情形。

椭圆方程可以看成关于$x$的一元二次方程:

$$Ax^2+2(By+D)x+(Cy^2+2Ey+F)=0$$

由判别式 $Delta=0$, 我们得到:

$$(By+D)^2-A(Cy^2+2Ey+F)=0$$

整理得到:

$$(B^2-AC)y^2+2(BD-AE)y+(D^2-AF)=0$$

记 $delta=B^2-AC, beta=BD-AE, gamma=D^2-AF$

则可以求得: $$y_{max} = frac{-beta+sqrt{beta^2-deltagamma}}{delta}$$ $$y_{min} = frac{-beta-sqrt{beta^2-deltagamma}}{delta}$$

(2)同理,用直线 $x=h$ 去截椭圆, 相交就是两个交点,相切就是一个交点,不相交就是无解。

椭圆方程可以看成关于$y$的一元二次方程:

$$Cy^2+2(Bx+E)x+(Ax^2+2Dy+F)=0$$

由判别式 $Delta=0$, 我们得到:

$$(Bx+E)^2-C(Ax^2+2Dx+F)=0$$

整理得到:

$$(B^2-AC)x^2+2(BE-CD)x+(E^2-CF)=0$$

记 $delta=B^2-AC, alpha=BE-CD, lambda=E^2-CF$

则可以求得: $$x_{max} = frac{-alpha+sqrt{alpha^2-deltalambda}}{delta}$$ $$x_{min} = frac{-alpha-sqrt{alpha^2-deltalambda}}{delta}$$

(3)最后得到矩形的四个顶点为$(-x_{min}, -y_{min}), (x_{max}, -y_{min}), (x_{max}, y_{max}), (-x_{min}, y_{max})$

(4)用Geogebra得到的结果

利用函数 Coefficients(conic) 得到系数 转换后,直接计算即可得到椭圆的最小包围正矩形。

8127018469dda592427f8e65a03a0d6d.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值