开发者社区> 问答> 正文

填充由中点算法产生的圆

在python中,我写了一些代码,使用Bresenham的中点算法生成一个圆:

from PIL import Image, ImageDraw
radius = 100 #radius of circle
xpts = [] #array to hold x pts
ypts = [] #array to hold y pts
img = Image.new('RGB', (1000, 1000))
draw = ImageDraw.Draw(img) #to use draw.line()
pixels = img.load()
d = (5/4) - radius
x = 0
y = radius
xpts.append(x) #initial x value
ypts.append(y) #initial y value

while x < y:
 if d < 0:
    d += (2*x + 3)
    x += 1
    xpts.append(x + 500) #translate points to center by 500px
    ypts.append(y - 500) 
 else:
    d += (2 * (x - y) + 5)
    x += 1
    y -= 1
    xpts.append(x + 500) #translate points to center by 500px
    ypts.append(y - 500)


for i in range(len(xpts)): #draw  initial and reflected octant points
   pixels[xpts[i] ,ypts[i]] = (255,255,0) #initial octant
   pixels[xpts[i],-ypts[i]] = (255,255,0)
   pixels[-xpts[i],ypts[i]] = (255,255,0)
   pixels[-xpts[i],-ypts[i]] = (255,255,0)
   pixels[ypts[i],xpts[i]] = (255,255,0)
   pixels[-ypts[i],xpts[i]] = (255,255,0)
   pixels[ypts[i],-xpts[i]] = (255,255,0)
   pixels[-ypts[i],-xpts[i]] = (255,255,0)




img.show()

为了填充它,我计划使用ImageDraw在圆中水平地画一条线,从使用draw.line()从初始八分仪生成的每个点开始。我将x和y坐标存储在数组中。但是,我无法解释每个点及其反射点,无法使用draw.line()来绘制水平线。有人能澄清一下吗? 问题来源StackOverflow 地址:/questions/59382988/filling-a-circle-produced-by-midpoint-algorithm

展开
收起
kun坤 2019-12-27 16:55:52 496 0
1 条回答
写回答
取消 提交回答
  • 您不需要绘制单独的像素,只需添加一条线来连接彼此对应的像素(-x和+x或-y和+y)。对于每一步,你画四条线(每条线连接两个八分区)。 下面是经过调整的示例代码。我放弃了点数组,而是直接画线。我还添加了定义圆中心的cx和cy变量。在代码中,有时会使用负索引。这只是巧合,因为圆在中间:

    from PIL import Image, ImageDraw
    
    radius = 100  # radius of circle
    xpts = []  # array to hold x pts
    ypts = []  # array to hold y pts
    img = Image.new('RGB', (1000, 1000))
    draw = ImageDraw.Draw(img)  # to use draw.line()
    pixels = img.load()
    d = (5 / 4) - radius
    x = 0
    y = radius
    
    cx = 500
    cy = 500
    
    
    def draw_scanlines(x, y):
        color = (255, 255, 0)
        draw.line((cx - x, cy + y, cx + x, cy + y), fill=color)
        draw.line((cx - x, cy - y, cx + x, cy - y), fill=color)
        draw.line((cx - y, cy + x, cx + y, cy + x), fill=color)
        draw.line((cx - y, cy - x, cx + y, cy - x), fill=color)
    
    
    draw_scanlines(x, y)
    
    while x < y:
        if d < 0:
            d += (2 * x + 3)
            x += 1
        else:
            d += (2 * (x - y) + 5)
            x += 1
            y -= 1
    
        draw_scanlines(x, y)
    
    img.show()
    
    2019-12-27 16:55:58
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
数据+算法定义新世界 立即下载
袋鼠云基于实时计算的反黄牛算法 立即下载
Alink:基于Apache Flink的算法平台 立即下载