【问题标题】:Calculating lines of best fit for an ellipse计算椭圆的最佳拟合线
【发布时间】:2012-04-03 01:07:44
【问题描述】:

我正在尝试计算最适合椭圆的线数;给定所需的误差范围(与边界的最小距离)。

我的单位圆解是这样的。

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| < error

然后只需将2^ii 是迭代次数)作为所需的段数。 这个算法可能是O(1),不适用于椭圆(这是我需要的)。

我该如何适应它? 或者更好的是,还有其他解决方案吗?

【问题讨论】:

    标签: python math geometry


    【解决方案1】:

    我无法给出一个很好的简洁答案 - 使用椭圆比使用圆圈更具挑战性 - 但这里是逐步进行的:

    首先 - 我会通过使用一点触发来加强圆的算法。如果通过单位圆绘制跨越角度angle 的弦(线段),则计算圆到弦的最大距离:

    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(angle),sin(angle)), cos(2*angle),sin(2*angle)), ... ]。你最终会得到一个正多边形。

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

    angle = 2 * math.acos( 1 - error/radius )
    angle = (2*math.pi) / math.ceil( (2*math.pi) / angle )
    

    并通过将 sin 和 cos 值乘以半径来计算弦端点。

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

    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)),
      ... ]
    

    这并不总是为您提供椭圆的最小多边形(它会在短轴附近有比必要更多的弦,特别是对于非常压扁的椭圆),但您只需要进行一次角度计算。如果你真的需要尽量减少和弦的数量,那么在画完每个弦之后,你需要重新计算每个弦后的角度,并且公式不是直截了当(其中“不是直截了当”=“难为我来弄清楚”)。

    【讨论】:

      【解决方案2】:

      圆有 O(1) 的解:你可以计算相等的段数来获得所需的sagitta。椭圆是更难的情况。最大矢状面将用于垂直于较大半轴(近焦点)的弦,因此选择较大半轴末端的线段连接点似乎是合理的(至少 - 作为第一个近似值)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-02
        • 2014-02-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多