📜  Python的Mandelbrot分形集可视化

📅  最后修改于: 2021-04-16 09:23:41             🧑  作者: Mango

分形:
分形是曲线或几何图形,其每个部分都具有整体相同的统计字符。它们可用于对结构(例如雪花)进行建模,在该结构中类似的图案以较小的比例逐渐出现,并用于描述部分随机或混乱的现象,例如晶体生长和星系形成。

用简单的话来说,分形是永无止境的模式。分形是无限复杂的模式,它们在不同尺度上是自相似的。通过在不断进行的反馈循环中反复重复一个简单的过程来创建它们。分形是递归驱动的,是动态系统的图像-混沌的图像。
从几何上讲,它们存在于我们熟悉的尺寸之间。由于自然界中充满了分形,所以分形图案是非常熟悉的。例如:树木,河流,海岸线,山脉,云层,贝壳,飓风等。抽象分形(例如Mandelbrot集)可以通过计算机反复计算一个简单方程来生成。

Mandelbrot套装:
Mandelbrot集是函数的复数c的函数 f_c(z) = z^2 + cz = 0迭代时不发散,即序列 f_c(0), f_c(f_c(0))等等,仍然以绝对值为界。简单来说,Mandelbrot集是特定的复数集,在绘制时其分形边界非常复杂。

安装所需的Python模块:

pip install pillow
pip install numpy

代码1:

# Python code for Mandelbrot Fractal
  
# Import necessary libraries
from PIL import Image
from numpy import complex, array
import colorsys
  
# setting the width of the output image as 1024
WIDTH = 1024
  
# a function to return a tuple of colors
# as integer value of rgb
def rgb_conv(i):
    color = 255 * array(colorsys.hsv_to_rgb(i / 255.0, 1.0, 0.5))
    return tuple(color.astype(int))
  
# function defining a mandelbrot
def mandelbrot(x, y):
    c0 = complex(x, y)
    c = 0
    for i in range(1, 1000):
        if abs(c) > 2:
            return rgb_conv(i)
        c = c * c + c0
    return (0, 0, 0)
  
# creating the new image in RGB mode
img = Image.new('RGB', (WIDTH, int(WIDTH / 2)))
pixels = img.load()
  
for x in range(img.size[0]):
  
    # displaying the progress as percentage
    print("%.2f %%" % (x / WIDTH * 100.0)) 
    for y in range(img.size[1]):
        pixels[x, y] = mandelbrot((x - (0.75 * WIDTH)) / (WIDTH / 4),
                                      (y - (WIDTH / 4)) / (WIDTH / 4))
  
# to display the created fractal after 
# completing the given number of iterations
img.show()

输出:

代码2:

# Mandelbrot fractal
# FB - 201003254
from PIL import Image
  
# drawing area
xa = -2.0
xb = 1.0
ya = -1.5
yb = 1.5
  
# max iterations allowed
maxIt = 255 
  
# image size
imgx = 512
imgy = 512
image = Image.new("RGB", (imgx, imgy))
  
for y in range(imgy):
    zy = y * (yb - ya) / (imgy - 1)  + ya
    for x in range(imgx):
        zx = x * (xb - xa) / (imgx - 1)  + xa
        z = zx + zy * 1j
        c = z
        for i in range(maxIt):
            if abs(z) > 2.0: break
            z = z * z + c
        image.putpixel((x, y), (i % 4 * 64, i % 8 * 32, i % 16 * 16))
  
image.show()

输出: