我需要使用像素绘制圆,具有以下限制条件:
我遇到了实现该算法的困难。我使用Python语法(为了便于可视化)在Processing中复制了该算法:
下面是我得到的半径在1像素和20像素之间的结果: 如你所见,圆之间有空隙,而R = 3 的圆与给出的示例不同(请参见下图)。此外,与中点算法相比,圆形并不真正圆润。
我该如何获得正确的结果?
原始的Eric Andres算法:
- 直径上的总像素数是偶数
- 半径为R和R+1 (R是整数)的两个圆之间没有空像素。
我遇到了实现该算法的困难。我使用Python语法(为了便于可视化)在Processing中复制了该算法:
def half_integer_centered_circle(xc, yc, R):
x = 1
y = R
d = R
while y >= x:
point(xc + x, yc + y)
point(xc + x, yc - y + 1)
point(xc - x + 1, yc + y)
point(xc - x + 1, yc - y + 1)
point(xc + y, yc + x)
point(xc + y, yc - x + 1)
point(xc - y + 1, yc + x)
point(xc - y + 1, yc - x + 1)
if d > x:
d = d - x
x = x + 1
elif d < R + 1 - y:
d = d + y - 1
y = y - 1
else:
d = d + y - x - 1
x = x + 1
y = y - 1
point()
函数只是在给定的坐标处绘制像素点。此外,请注意,在本文中,x
被初始化为S
,这很奇怪,因为其他地方没有S
(根本没有解释),但是文章中说圆从(x,y)=(1,R)开始,所以我写了x = 1
。下面是我得到的半径在1像素和20像素之间的结果: 如你所见,圆之间有空隙,而R = 3 的圆与给出的示例不同(请参见下图)。此外,与中点算法相比,圆形并不真正圆润。
我该如何获得正确的结果?
原始的Eric Andres算法:
d
的定义有问题,但是我认为理解算法会更容易,而不是弄清楚纸上的错误或者我们误解了什么。 - Bill