关于椭圆的研究
点到椭圆的距离
平面内任意一点P到椭圆E的最短与最长距离,其实质是以点P为圆心,与E相切的两个圆的半径。具体的求解过程利用如下事实,假设椭圆与圆的切点为Q,构造直线PQ,PQ与Q点在椭圆的切向量垂直,再联立椭圆方程,便可求出直线PQ与椭圆的交点。通过化简最后得到一个一元四次方程,所以其精确解是求一元四次方程的根,可以分解为如下形式去求解
$$
\begin{align}x^4+ax^3+bx^2+cx+d=(x^2+p_1x+q_1)(x^2+p_2x+q_2)\end{align}
$$

关于最短距离,也可以用其他方法去近似,毕竟求解一元四次方程的代价是昂贵的,大概有两个办法去近似,这在halcon中的dist_ellipse_contour_xld 算子也有提到,一种是使用PF1+PF2-2a代替;一种是使用点P与点Q的距离代替,Q为PF1、PF2的角平分线与椭圆交点。其中F1、F2是椭圆的两个焦点。此外还有一种办法,就是Sampson Error,定义如下

椭圆周长
椭圆周长公式如下,实际上是一个定积分计算,不会计算的可以使用boost库, 除了能够得到椭圆周长的精确值,定积分的计算也可以解决椭圆等分问题,等分之后,椭圆每一段的弧长都相等,这在建立椭圆卡尺时很有用。
$$
\begin{align} C&=4\int_{0}^{\frac{\pi}{2}}\sqrt{a^2sin^{2}(\theta)+b^2cos^{2}(\theta)}d\theta\\ &=4\int_{0}^{\frac{\pi}{2}}\sqrt{a^2(1-cos^{2}(\theta))+b^2cos^{2}(\theta)}d\theta\\ &=4a\int_{0}^{\frac{\pi}{2}}\sqrt{1-e^2cos^{2}(\theta)}d\theta \\
&=4a\int_{0}^{\frac{\pi}{2}}\sqrt{1-e^2sin^{2}(\theta)}d\theta\end{align}
$$

椭圆拟合
opencv里的椭圆拟合函数并不是很好使,参照文献Numerically Stable Direct Least Squares Fitting of Ellipses实现会好很多,该方法是数值稳定的,对于只占椭圆很小一段比例的圆弧效果很好。

