Python实现Bresenham画圆算法仅生成矩形的问题求解
问题原因
你的代码运行后输出全填充矩形、无法生成圆形,核心是两个问题:
- 二维数组初始化存在浅拷贝bug
你使用的self.data = [[False] * self.data_size] * self.data_size是Python的典型语法误区:这种写法生成的二维列表中,所有行都指向同一个内存地址的列表对象,修改任意一行的某个元素值时,所有行的对应位置都会被同步修改。只要你给任意一个像素赋值True,整列像素都会被同步设为True,多轮赋值后整个画布就会全为True,呈现填充矩形效果。
正确的初始化需要通过列表推导式为每一行生成独立的列表对象:self.data = [[False for _ in range(self.data_size)] for _ in range(self.data_size)] - 初始点绘制逻辑冗余
你当前在循环外单独绘制初始点(0, radius)的写法不会直接导致结果错误,但重复的点调用在小半径场景下容易引发布尔值覆盖的异常,统一放到循环内处理逻辑更简洁。
修正后可运行代码
class bresenham_circle: def __init__(self, radius): self.radius = int(radius) self.xc = self.radius self.yc = self.radius self.data_size = self.radius * 2 + 1 # 修正二维列表初始化问题 self.data = [[False for _ in range(self.data_size)] for _ in range(self.data_size)] self.print_data() self.draw_circle() self.print_data() def print_data(self): print() for y in range(0, self.data_size): print(self.data[y]) print() def draw_circle(self): x = 0 y = self.radius d = 3 - 2 * self.radius while y >= x: # 统一在循环内绘制当前点,移除循环外冗余调用 self.put_pixel(x, y) x += 1 if d > 0: y -= 1 d = d + 4 * (x - y) + 10 else: d = d + 4 * x + 6 def put_pixel(self, x, y): self.data[self.yc + y][self.xc + x] = True self.data[self.yc + y][self.xc - x] = True self.data[self.yc - y][self.xc + x] = True self.data[self.yc - y][self.xc - x] = True self.data[self.yc + x][self.xc + y] = True self.data[self.yc + x][self.xc - y] = True self.data[self.yc - x][self.xc + y] = True self.data[self.yc - x][self.xc - y] = True # 功能测试 if __name__ == "__main__": bresenham_circle(5)
运行修正后的代码,即可正确生成圆形轮廓的像素标记,不会再出现全填充矩形的异常。
内容的提问来源于stack exchange,提问作者so_many_questions
相关产品推荐
相关产品推荐

