使用Python逐像素绘制圆形

3

嘿,大家好,我有一个问题。我想在 Python 中像素点一点一点地画一个圆形,但似乎做不到。

这是我的编程课上讨论的一个问题,我的老师说可以使用距离公式来查找窗口中心和圆周上的点之间的距离,然后如果符合条件就告诉程序来填充它。

所以这不是作业,纯粹出于我的好奇心。我已经花了几个小时的时间去研究它,感觉离成功很近,但还是缺少关键要素。

我的目标是在窗口中央放置一个红色圆圈,其宽度和高度在 300 和 400 之间。

我说中心点等于 (w/2, h/2),并且我想填充每个与该点相隔固定距离的点。

我选择 (100,50) 作为一个随机点,在使用那两个点之前,将变量距离 = 距离公式进行设定。

两个 for 循环用于迭代窗口中的每个像素。我能够创建一个正好位于圆形中心的框……但是我似乎无法得到任何接近圆形的东西。

这是我的代码,我将我的函数命名为日本国旗,因为似乎很合适:

import cImage
import math


def japanese_flag(w, h):
    newimg = EmptyImage(w, h)
    distance = int(math.sqrt((50 - h / 2) ** 2 + (100 - w / 2) ** 2))

    for col in range(w):
        for row in range(h):
            if h/2 - distance < row < (h/2 + distance) and w / 2 - distance < col < (w / 2 + distance):
                    newpixel = Pixel(255, 0, 0) # this denotes the color red
                    newimg.setPixel(col, row, newpixel)
    return newimg

def show_one_flag(func_name):
    import random
    width = random.randint(300, 400)
    height = random.randint(200, 300)
    win = ImageWin(str(func_name),width,height)
    newimg = func_name(width, height)
    newimg.draw(win)

show_one_flag(japanese_flag)
1个回答

4
使用平方半径进行简单比较。
SqDist = (50 - h / 2) ** 2 + (100 - w / 2) ** 2

只绘制圆周时,需与某个容差水平进行比较

Eps = 1
...
if (Math.Abs((h/2 - row) ** 2 + (w/2 - col) ** 2 - SqDist) < Eps)
     draw pixel

绘制实心圆形的方法如下:
if ((h/2 - row) ** 2 + (w/2 - col) ** 2 < SqDist)
     draw pixel

MBo,你说得一点也没错。非常感谢你的帮助。我现在明白了,距离公式需要随着行和列的填充而不断变化。我的方法产生了一个正方形,因为没有动态性。 - Garrett1021
如果您对更高级的圆形绘制算法感兴趣,而不是检查所有可能的像素,请考虑使用中点和Bresenham的圆形算法。https://en.wikipedia.org/wiki/Midpoint_circle_algorithm - MBo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接