点到椭圆的距离
平面内任意一点P到椭圆E的最短与最长距离,其实质是以点P为圆心,与E相切的两个圆的半径。具体的求解过程利用如下事实,假设椭圆与圆的切点为Q,构造直线PQ,PQ与Q点在椭圆的切向量垂直,再联立椭圆方程,便可求出直线PQ与椭圆的交点。通过化简最后得到一个一元四次方程,所以其精确解是求一元四次方程的根,可以分解为如下形式去求解
x
4
+
a
x
3
+
b
x
2
+
c
x
+
d
=
(
x
2
+
p
1
x
+
q
1
)
(
x
2
+
p
2
x
+
q
2
)
x^4+ax^3+bx^2+cx+d=(x^2+p_1x+q_1)(x^2+p_2x+q_2)
x4+ax3+bx2+cx+d=(x2+p1x+q1)(x2+p2x+q2)
关于最短距离,也可以用其他方法去近似,毕竟求解一元四次方程的代价是昂贵的,大概有两个办法去近似,这在halcon中的dist_ellipse_contour_xld 算子1也有提到,一种是使用PF1+PF2-2a代替;一种是使用点P与点Q的距离代替,Q为PF1、PF2的角平分线与椭圆交点。其中F1、F2是椭圆的两个焦点。此外还有一种办法,就是Sampson Error,定义如下
椭圆周长
椭圆周长公式如下,实际上是一个定积分计算,不会计算的可以使用boost库, 除了能够得到椭圆周长的精确值,定积分的计算也可以解决椭圆等分问题,等分之后,椭圆每一段的弧长都相等,这在建立椭圆卡尺时很有用。
C
=
4
∫
0
π
2
a
2
s
i
n
2
(
θ
)
+
b
2
c
o
s
2
(
θ
)
d
θ
=
4
∫
0
π
2
a
2
(
1
−
c
o
s
2
(
θ
)
)
+
b
2
c
o
s
2
(
θ
)
d
θ
=
4
∫
0
π
2
1
−
e
2
c
o
s
2
(
θ
)
d
θ
=
4
∫
0
π
2
1
−
e
2
s
i
n
2
(
θ
)
d
θ
\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\\ &=4\int_{0}^{\frac{\pi}{2}}\sqrt{1-e^2cos^{2}(\theta)}d\theta \\ &=4\int_{0}^{\frac{\pi}{2}}\sqrt{1-e^2sin^{2}(\theta)}d\theta\end{align}
C=4∫02πa2sin2(θ)+b2cos2(θ)dθ=4∫02πa2(1−cos2(θ))+b2cos2(θ)dθ=4∫02π1−e2cos2(θ)dθ=4∫02π1−e2sin2(θ)dθ
椭圆拟合
opencv里的椭圆拟合函数并不是很好使,参照文献2实现会好很多,该方法是数值稳定的,对于只占椭圆很小一段比例的圆弧效果很好。