我无法给出一个很好的简洁答案 - 使用椭圆比使用圆圈更具挑战性 - 但这里是逐步进行的:
首先 - 我会通过使用一点触发来加强圆的算法。如果通过单位圆绘制跨越角度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 值乘以半径来计算弦端点。
第三个 - 对于具有最大和最小半径 major 和 minor 的椭圆,我将使用圆公式再次计算角度:
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)),
... ]
这并不总是为您提供椭圆的最小多边形(它会在短轴附近有比必要更多的弦,特别是对于非常压扁的椭圆),但您只需要进行一次角度计算。如果你真的需要尽量减少和弦的数量,那么在画完每个弦之后,你需要重新计算每个弦后的角度,并且公式不是直截了当(其中“不是直截了当”=“难为我来弄清楚”)。