因此,任意椭圆似乎比圆圈具有两个自由度,因为除了圆的半径和中心之外,还有旋转角度以及长轴与短轴之比的缩放(其中圈子没有)。因此,我必须检查,但我相信它是唯一需要5个不同的点来唯一定义通过这些点的椭圆,可能受到点的一些限制,例如任何其他3的凸包中没有点无论如何,让我们说一般来说你需要一定数量的点来定义一个通过它们的独特椭圆(可能是4或5个点)。假设我们的分数超过了这个数。如果我们处理IEEE浮点,比如说64位,受尾数中的舍入误差影响,那么确定点是否位于一个公共椭圆上的稳健方法是什么,前提是这些点中的舍入误差'manitissas可以解释任何差异吗?理想情况下,我想避免使用扩展精度算法来得到答案,但如果需要,那么只要它的使用和增加的运行时间可以最小化。
答案 0 :(得分:0)
我会将最佳椭圆拟合到您的点集,然后计算点位置的误差。
查找/拟合椭圆:
如果你有很多分散在整个圆周
计算中间点C
(边界框的中间),找到距离最近的B
和最远A
点。
C
- 是中心CA
是主轴CB
是半长轴如果您只有几点或不覆盖整个圆周
使用基矢a,b
的椭圆方程:
x(t)=x0+ax*cos(t)+bx*sin(t);
y(t)=y0+ay*cos(t)+by*sin(t);
a=(ax,ay)
是主轴向量b=(bx,by)
是半长轴矢量(x0,y0)
是中心点t=<0,2.0*PI>
是角度参数(x(t),y(t))
是圆周上的点我们知道a,b
彼此垂直,因此在2D中:
bx= ay*|b|/|a|;
by=-ax*|b|/|a|;
在这种情况下,我们至少需要5分。在3D的情况下,我们需要6点或以某种方式利用跨产品。无论如何,这个方程组很可能会导致超越方程,所以我甚至不会尝试用代数方法求解,而是用近似搜索看看:
所以只需嵌套x0,y0,ax,ay,|b|/|a|
的近似值并计算bx,by
,然后计算累积误差e=(sum of distances of points to ellipse)
即可。
计算点和椭圆的距离可能很棘手
我将构造代表椭圆坐标系的homogenous transform matrix:
a
将是x轴b
将是y轴 (x0,y0)
将成为原点
然后如果你需要计算点(xi,yi)
和椭圆变换(xi,yi)
之间的最小距离到椭圆坐标系(乘以逆矩阵)并调用结果(Xi,Yi)
这可以做到也可以用点积而不是逆矩阵...
然后在圆t=atan2(Yi*|a|/|b|,Xi)=M
然后在实际椭圆x(t),y(t)
中计算该角度的点,然后距离为d=|(xi-x(t),yi-y(t))|
现在您的错误评估
在近似搜索后发现最佳拟合椭圆计算每个点的最小距离并记住/计算min,max,average
距离。从那以后,您现在可以估计所需的错误属性,例如if (max<=round_error) ...
<强> [注释] 强>
O(log^6(n))
,因此请尝试尽可能接近地设置解决方案边界。不要使用太多的递归层。(ax,ay),(bx,by)
|a|,|b|,angle
答案 1 :(得分:0)
这是一项非常重要的任务,过去已经研究了许多方法。该主题称为“椭圆拟合”或“鲁棒椭圆拟合”。在第二种情况下,您希望一部分点在椭圆上没有对齐(它们被称为异常值),并且您不希望它们影响拟合。
对于第一种方法,我建议您使用RANSAC方法:
随机选择五个点;这确实是你需要定义一个椭圆
通过插入五个给定点的坐标加上一个未知点形成一个6x6矩阵,行(x²,xy,y²,x,y,1)
开发该矩阵的行列式(6个辅助因子),你会发现椭圆的隐式方程,
a x² + b xy + c y² + d x + e y + f = 0.
椭圆的欧几里德距离是一个不安的问题,因为它涉及一个四次方程。通过在隐式方程的LHS中插入点坐标并将绝对值除以梯度的范数来获得合理的近似值。
使用多个点集重复此过程并保留最小的全局残差,这是您的健康契合。
您现在可以查看个别残留物。