Python 计算椭圆的最佳拟合直线

Python 计算椭圆的最佳拟合直线,python,math,geometry,Python,Math,Geometry,我试图计算椭圆的最佳拟合线数;给定所需的误差裕度(与边界的最小距离) 因此,我对单位圆的解是 def f(u, v, r): mid_uv = (u + v) * 0.5 N = normalized(mid_uv) return N * r 重复v=f(u,v,r),直到radius-|v |

我试图计算椭圆的最佳拟合线数;给定所需的误差裕度(与边界的最小距离)

因此,我对单位圆的解是

def f(u, v, r):
    mid_uv = (u + v) * 0.5
    N = normalized(mid_uv)

    return N * r
重复
v=f(u,v,r)
,直到
radius-|v |

然后简单地将
2^i
i
是迭代次数)作为所需的段数。 这个算法可能是
O(1)
,对椭圆不起作用(这就是我需要它的原因)

我怎样才能适应它?
或者更好的是,还有其他解决方案吗?

圆有O(1)个解决方案:您可以计算相等的线段数以获得所需的线段数。椭圆是比较硬的情况。对于垂直于较大半轴(靠近焦点)的弦,最大矢状线是合适的,因此选择较大半轴末端的节段连接点似乎是合理的(至少作为第一近似值)

我无法给出一个好的简洁的答案-使用省略号比使用圆圈更具挑战性-但以下是步骤:

首先,我将通过使用一点trig来收紧圆的算法。如果绘制的弦(线段)跨越单位圆的角度<代码>角度,则从圆到弦的最大距离计算如下:

error = 1 - math.cos( angle / 2 )
(如果用圆、弦和弦的平分线绘制图表,可以看到这一点。)将此公式反转,可以计算给定容许误差的角度。第一行代码给出了精确的角度;第二条直线根据需要缩小角度,使其成为整个圆的精确分数

angle = 2 * math.acos( 1 - error )
angle = (2*math.pi) / math.ceil( (2*math.pi) / angle )
一旦有了角度,就可以简单地计算单位圆周围的点作为和弦端点:
[(1,0),(cos(角度),sin(角度)),cos(2*角度),sin(2*角度)),…]
。您将得到一个正多边形

第二-对于半径为
半径为
的圆,运行上述公式,调整如下:

angle = 2 * math.acos( 1 - error/radius )
angle = (2*math.pi) / math.ceil( (2*math.pi) / angle )
并通过将正弦和余弦值乘以半径来计算弦端点

第三,对于具有最大和最小半径的椭圆,我将使用圆公式再次计算角度:

radius = max( major, minor )
angle = 2 * math.acos( 1 - error/radius )
angle = (2*math.pi) / math.ceil( (2*math.pi) / angle )
如果大半径在x方向,小半径在y方向,则可以按如下方式计算弦端点:

[ (major, 0),
  (major*cos(angle), minor*sin(angle)),
  (major*cos(2*angle), minor*sin(2*angle)),
  ... ]
这并不总是为椭圆提供最小多边形(它在短轴附近的和弦比必要的多,特别是对于非常挤压的椭圆),但只需进行一次角度计算。如果您确实需要最小化和弦的数量,那么在绘制每个和弦后,您需要重新计算每个和弦后的角度,并且公式不是直截了当的(其中“not straight forward”=“难以计算”)