You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()的截断,导致这些轴端点的像素从未被绘制,形成了四个象限的空白角。

快速修复方案

  1. 替换截断为四舍五入:把math.trunc()换成round(),让接近整数的坐标值自动四舍五入到正确整数,补上丢失的点:
x1 = round(r * math.cos(angle * math.pi / 180))
y1 = round(r * math.sin(angle * math.pi / 180))
  1. 手动补全轴端点:如果坚持用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 00:01:03