Python逐像素绘制圆形时四角出现空白的问题求助
问题:圆形绘制出现象限空白点的原因?
我之前在平台上看过相关问题但方法不同,知道中点算法、Bresenham算法这些更高效的圆绘制算法,但当前场景下传统简单方法更合适。于是写了一段Python实验代码,验证通过递减半径绘制圆形能否覆盖对应区域——最终需要的是圆形所有(x,y)像素点列表,先通过可视化观察效果。
代码如下:
from PIL import Image import math import numpy as np img = Image.new('RGB', (800, 800), color = (255, 255, 255)) x = 400 y = 400 for r in range(0, 300, 1): for i in np.arange(0, 361, 0.1): angle = i x1 = math.trunc(r * math.cos(angle * math.pi / 180)) y1 = math.trunc(r * math.sin(angle * math.pi / 180)) img.putpixel((x + x1, y + y1), (0, 0, 0, 255)) img.show()
但运行后发现四个象限各有一个空白点,形状近似正方形的四个角,想请教这一现象的原因是什么?
解答
核心原因
math.trunc()的截断逻辑缺陷:trunc()直接舍弃小数部分,只保留整数位。当计算出的坐标值接近整数(比如299.9999999),截断后会变成299,而非我们需要的300;负数场景下,-299.9999999会被截断为-299,而非-300,直接漏掉了轴端点的像素。- 浮点数精度+角度步长的双重盲区:用
0.1度步长遍历角度时,在0°、90°、180°、270°这些轴方向,受浮点数精度限制,r*cos(angle)或r*sin(angle)永远无法精确等于r或-r,再加上trunc()的截断,导致这些轴端点的像素从未被绘制,形成了四个象限的空白角。
快速修复方案
- 替换截断为四舍五入:把
math.trunc()换成round(),让接近整数的坐标值自动四舍五入到正确整数,补上丢失的点:
x1 = round(r * math.cos(angle * math.pi / 180)) y1 = round(r * math.sin(angle * math.pi / 180))
- 手动补全轴端点:如果坚持用
trunc(),可以在循环结束后手动补上四个方向的所有轴端点:
for r in range(0, 300): img.putpixel((x + r, y), (0, 0, 0)) img.putpixel((x - r, y), (0, 0, 0)) img.putpixel((x, y + r), (0, 0, 0)) img.putpixel((x, y - r), (0, 0, 0))
内容的提问来源于stack exchange,提问作者Nevermnd
相关产品推荐
相关产品推荐

