不使用create_oval在tkinter中绘制实心圆的参数逻辑疑问
问题原因解释
首先你的第一版代码出现点状轮廓的推测是对的:整数坐标下,绝大多数整数i对应的i²无法被两个整数的平方和恰好匹配,所以==的判断条件会漏掉大量应该被填充的像素,只会保留刚好满足等式的零散点。
为什么增大a不会让图形变方
你外层遍历的x、y范围确实是边长为2i的正方形,但实际填充的判断逻辑和正方形边界无关,只和到圆心的距离有关:
- 正方形四个角的像素到圆心的距离平方为
i² + i² = 2i²,远大于i² + a的范围(只要a不超过i²的合理区间),根本不会被条件选中 - 你放宽
a的取值,本质是补上了原来==条件漏掉的、距离中心的平方刚好落在i²附近的像素,这些像素本身就属于圆形的组成部分,自然会让圆形越来越完整
当a的取值刚好覆盖相邻两个半径的差值区间时,所有距离圆心≤目标半径的像素都会被选中,就能得到完整的实心圆。
代码优化建议
你现在的三重循环逻辑冗余,其实不需要分层遍历i,直接判断所有遍历范围内的像素到圆心的距离平方是否小于等于半径平方即可,优化后代码如下:
def circle(img, color, radius, center): x0, y0 = center radius_sq = radius ** 2 # 遍历覆盖整个圆的外接正方形内的所有像素 for x in range(x0 - radius, x0 + radius + 1): for y in range(y0 - radius, y0 + radius + 1): if (x - x0) ** 2 + (y - y0) ** 2 <= radius_sq: img.put(color, (x, y))
这个实现逻辑更简洁,也不会出现点状缺失的问题。
内容的提问来源于stack exchange,提问作者TripleEmu
相关产品推荐
相关产品推荐

