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



我在创建可以在 2D 像素数组中创建填充圆的方法时遇到问题。到目前为止,我创建的 Image 类可以创建像素的 2D 数组、更改单个像素值等。到目前为止,我能够完成的是使用 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)。

任何帮助将不胜感激。谢谢!

当你写的时候

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)

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

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

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]]