我们应该盲目地使用360个顶点吗?720似乎效果更好,但我们该在哪里停止呢?
A = (r, 0)
B = (r . cos(th), r . sin(th))
其中r
为圆的半径,th
为每条线段所覆盖的角度(例如,如果我们有720个点,则每条线段覆盖0.5度,因此th
将为0.5度)。
该线段的中点位于
M = A + (B - A) / 2
= (r, 0) + (r (cos(th) - 1) / 2, r . sin(th) / 2)
= (r / 2) . (1 + cos(th), sin(th))
并且从原点到该点的距离为
l = (r / 2) . sqrt((1 + cos(th))^2 + (sin(th))^2)
= (r / 2) . sqrt(2) . sqrt(1 + cos(th))
如果我们的线段表示完美无缺,那么这个长度应该等于半径(线段的中点应该落在圆上)。通常会存在一些误差,这个点会略小于半径。误差为
e = r - l
= r . (1 - sqrt(2) . sqrt(1 + cos(th)) / 2)
重新排列,使得我们可以用e
和r
表示th
2 . e / r = 2 - sqrt(2) . sqrt(1 + cos(th))
sqrt(2) . sqrt(1 + cos(th)) = 2 . (1 - e / r)
1 + cos(th) = 2 . (1 - e / r)^2
th = arccos(2 . (1 - e / r)^2 - 1)
这使我们可以计算出每个点之间可实现特定误差的最大角度。例如,假设我们用100像素的半径绘制一个圆,希望最大误差为0.5像素,我们可以计算:
th = arccos(2 . (1 - 0.5 / 100)^2 - 1))
= 11.46 degrees
这相当于使用 ceil(360 / 11.46) = 32
个点绘制一个半径为100的圆,最差的像素位置误差小于一半,这意味着我们绘制的每个像素都将在正确的位置(忽略混叠现象)。
这种分析方法同样适用于椭圆,但是按照数学精神,这留给读者作为练习;)(唯一的区别是确定最大误差发生的位置)。