如何在像素数组中创建填充圆

2024-10-01 07:10:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我很难创建一个方法,可以创建一个二维像素数组填充圆。到目前为止,我创建的图像类可以创建一个二维像素数组,更改单个像素值,等等。到目前为止,我能够完成的是使用Bresenham的圆算法在数组中的任意给定点周围创建一个任意半径的空心圆。但是,我想不出如何填写这个圆。你知道吗

我愿意接受任何解决办法!我尝试过创建一个“flood-fill”方法,但是遇到了各种递归错误。我也尝试过多次使用递减半径调用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)

图像构造器的第三个参数是创建时分配给所有像素的值(51.0),writePixel方法的第三个参数是将像素更改为的值(50.0)。你知道吗

非常感谢您的帮助。谢谢!你知道吗


Tags: 方法图像imageselfdef半径像素数组
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]]

当你写作的时候

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)

相关问题 更多 >