Skip to main content
 首页 » 编程设计

python之如何更快地渲染 Mandelbrot 集

2025年05月04日10hnrainll

我目前正在使用 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