如何使用Pygame快速渲染Julia Set?

问题描述

目前,我正在玩一个脚本,该脚本生成Julia集和Mandelbrot集,然后使用pygame渲染这些点。

本质上,屏幕被映射到一个较小的坐标系,在该坐标系中,屏幕由x轴上的-2.5,2.5和y轴上的-1,1界定。然后,将此映射范围内的每个像素传递给函数,以检查其复数等效项是否在给定集中。此函数返回计算迭代次数是否在集合中(或最大迭代次数)的迭代次数。

然后,对于每个像素,我都知道根据此迭代得分为它着色的颜色,并逐个渲染每个像素。该过程的这一部分确实很费力,渲染大约需要30秒,但取决于设置的复杂性,可以花更多的时间。

这里是用于确定传递的复数和复数坐标是否在Julia集中的代码,在检查1920 * 1080像素时,这根本不需要很长时间来计算:

max_iter = 45


def julia(z,c):
    n = 0
    while abs(z) <= 2 and n < max_iter:
        z = z * z + c
        n += 1
    return n

这是我用于pygame渲染的代码,这绝对是问题所在:

size_ = 1920,1080
re_ = -2.5,2.5
im_ = -1,1
surf = pygame.Surface(size)
colour_gradient1 = [c,c1,c2,c3,...] # This is some list of colours generated by a gradient function

for x in range(0,size_[0]):
    for y in range(0,size_[1]):
        z = complex(re_[0] + (x / size_[0]) * (re_[1] - re_[0]),im_[0] + (y / size_[1]) * (im_[1] - im_[0]))
        m = julia(z,c)
        colour = colour_gradient1[m]
        pygame.draw.rect(surf,colour,(x,y,1,1))

我想我理解为什么这是性能密集型的,因为pygame和python并没有针对将内容渲染到这样的屏幕进行真正的优化。我目前正在尝试学习C ++,对于这样的东西我了解得更多。

我还尝试了缩放功能,可以用鼠标选择一个框,脚本将渲染该选定区域,但是实施此功能后问题就一直存在。随着放大分形变得越来越复杂,该脚本花了太长时间才能使用此功能。

所以我的问题是,有没有更好的方法可以使用python和pygame实时渲染类似这样的内容?我愿意使用其他程序包,但如果可以通过pygame进行安装,那将是理想的选择。

下面是生成的集合的几张图片:

This is an example of one of the fractals generated.

This is an example of one of the fractals generated.

This is an example of one of the fractals generated.

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)