python - 如何更快地渲染 Mandelbrot 集?

标签 python tkinter mandelbrot

我目前正在使用 PhotoImage 和 tkinter 逐像素绘制 Mandelbrot 集。我基本上是直接使用算法,没有修改。有什么方法可以加快计算速度吗?也许快速填充大面积颜色,或者预先计算常量?

部分代码:

ITERATIONS = 50
WIDTH, HEIGHT = 600, 600
CENTER = (-.5, 0)
DIAMETER = 2.5

def mandel(c):
    z = 0
    for i in range(ITERATIONS):
        z = z**2 + c
        if abs(z) > 2:
            return i     
    return ITERATIONS

root = Tk()
canvas = Canvas(root, width=WIDTH,height=HEIGHT)
canvas.pack()
img = PhotoImage(width=WIDTH, height=HEIGHT)
canvas.create_image((WIDTH/2, HEIGHT/2), image=img, state="normal")


real = CENTER[0] - 0.5 * DIAMETER
imag = CENTER[1] - 0.5 * DIAMETER

def color(i):
    colors = ("#0000AA", "#88DDFF", "#FF8800", "#000000")
    if i == ITERATIONS:
        return colors[-1]
    else:
        choice = (i//2) % len(colors)
    return colors[choice]

for x in range(WIDTH):
    for y in range(HEIGHT):
        i = mandel(complex(real, imag))

        img.put(color(i), (x, HEIGHT-y))

        imag += DIAMETER / HEIGHT
    imag = CENTER[1] - 0.5 * DIAMETER
    real += DIAMETER / WIDTH

mainloop()

最佳答案

一次设置一个像素可能是减速的主要原因。不是为每个像素调用 put,而是计算整行像素或整个像素矩阵,然后在循环结束时调用一次 put。

您可以在此处和其他地方找到示例:https://web.archive.org/web/20170512214049/http://tkinter.unpythonic.net:80/wiki/PhotoImage#Fill_Many_Pixels_at_Once

关于python - 如何更快地渲染 Mandelbrot 集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26447915/

相关文章:

python - 使用 pickle 在 postgres 表中保存 python 对象

python - 按下按钮后多次更改 tkinter 输入小部件

javascript - 实现 Mandelbrot 集的平滑着色

python - 如何在新数据框中保留原始索引

python - "import time"和 "from datetime import time"在一起?

python - 单选按钮修改spinbox Python中的增量值

python - 取消用户窗口大小调整

java - 如何平滑这个 Java Mandelbrot 算法?

windows - .bmp 文件格式的最大分辨率

python - 带有 'with' 语句的非阻塞锁