【问题标题】:How to create a filled in circle within an array of pixels如何在像素数组中创建一个实心圆
【发布时间】:2019-07-21 01:12:04
【问题描述】:

我无法创建一种可以在二维像素数组中创建 FILLED IN 圆的方法。到目前为止,我创建的 Image 类可以创建一个二维像素数组,更改单个像素值等。到目前为止,我能够完成的是使用 Bresenham 的圆算法创建一个围绕任何给定点的任何半径的空心圆在数组中。但是,我不知道如何使这个圆圈填满

我愿意接受任何解决方案!我尝试过创建“洪水填充”方法,但遇到了各种递归错误。我也尝试过多次使用递减半径调用 circleBres 方法,但这也不起作用。限于篇幅,假设 writePixel 方法有效。

class Image:

    def drawCircle(self, centerX, centerY, x, y):
    self.writePixel(centerX + x, centerY + y, 50.0)
    self.writePixel(centerX - x, centerY + y, 50.0)
    self.writePixel(centerX + x, centerY - y, 50.0)
    self.writePixel(centerX - x, centerY - y, 50.0)
    self.writePixel(centerX + y, centerY + x, 50.0)
    self.writePixel(centerX - y, centerY + x, 50.0)
    self.writePixel(centerX + y, centerY - x, 50.0)
    self.writePixel(centerX - y, centerY - x, 50.0)

    def circleBres(self, xc, yc, r):
        x = 0
        y = r
        d = 3 - (2*r)
        self.drawCircle(xc, yc, x, y)
        while(y>=x):
            x+=1
            if(d>0):
                y-=1
                d = d+4*(x-y)+10
            else:
                d = d + 4 * x + 6
            self.drawCircle(xc, yc, x, y)
            time.sleep(.06)

obj = Image(50, 50, 51.0)
obj.circleBres(35, 35, 10)

Image构造函数的第三个参数是所有像素在创建时分配的值(51.0),writePixel方法的第三个参数是像素被更改为的值(50.0)。

非常感谢任何帮助。谢谢!

【问题讨论】:

    标签: python python-3.x geometry


    【解决方案1】:

    当你写作时

    self.writePixel(centerX + x, centerY + y, 50.0)
    self.writePixel(centerX - x, centerY + y, 50.0)
    

    你画了一些扫描线的最左边和最右边的像素。

    要填充它,只需使用 for 循环而不是这 8 行:

    for xx in range(centerX - x, centerX + x + 1):
        self.writePixel(xx, centerY + y, 50.0)
        self.writePixel(xx, centerY - y, 50.0)
    for xx in range(centerX - y, centerX + y):
        self.writePixel(centerX + y, centerY + x, 50.0)
        self.writePixel(centerX - y, centerY - x, 50.0)
    

    【讨论】:

    • 哇,不可思议!非常感谢。
    【解决方案2】:

    以下是我如何处理此类问题的示例:

    假设您有正确的圆形轮廓,只需遍历行并填充圆形边缘之间的所有像素。

    grid = [
        [0,0,0,1,1,1,0,0,0],
        [0,0,1,0,0,0,1,0,0],
        [0,1,0,0,0,0,0,1,0],
        [0,1,0,0,0,0,0,1,0], 
        [0,0,1,0,0,0,1,0,0],
        [0,0,0,1,1,1,0,0,0],  
    ]
    
    def fill_circle(grid):
        for r in grid:  # For each row
            j1 = None  # left endpoint
            j2 = None  # right endpoint
            for j, v in enumerate(r):
                if v == 1 and j1 is None:
                    j1 = j
                    continue
                if v == 1 and j2 is None:
                    j2 = j
                    break
            else:  # Did not find j1 AND j2
                continue
            for j in range(j1, j2):  # Fill all points between
                r[j] = 1
    
    fill_circle(grid)
    grid
    
    [[0,0,0,1,1,1,0,0,0],
     [0,0,1,1,1,1,1,0,0],
     [0,1,1,1,1,1,1,1,0],
     [0,1,1,1,1,1,1,1,0], 
     [0,0,1,1,1,1,1,0,0],
     [0,0,0,1,1,1,0,0,0]]
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      • 2020-10-05
      • 2014-11-16
      • 2012-05-24
      相关资源
      最近更新 更多