RosettaCodeData/Task/Mandelbrot-set/Python/mandelbrot-set-5.py
2026-02-01 16:33:20 -08:00

50 lines
1.5 KiB
Python

import numpy as np
import matplotlib.pyplot as plt
d, h = 800, 500 # pixel density (= image width) and image height
n, r = 200, 500 # number of iterations and escape radius (r > 2)
x = np.linspace(0, 2, num=d+1)
y = np.linspace(0, 2 * h / d, num=h+1)
A, B = np.meshgrid(x - 1, y - h / d)
C = 2.0 * (A + B * 1j) - 0.5
def iteration(C):
S, T = np.zeros(C.shape), np.zeros(C.shape)
Z, dZ = np.zeros_like(C), np.zeros_like(C)
def iterate1(C, S, T, Z, dZ):
S, T = S + np.exp(- abs(Z)), T + 1
Z, dZ = Z * Z + C, 2 * Z * dZ + 1
return S, T, Z, dZ
for i in range(0, n, 1):
M = abs(Z) < r
S[M], T[M], Z[M], dZ[M] = iterate1(C[M], S[M], T[M], Z[M], dZ[M])
return S, T, Z, dZ
S, T, Z, dZ = iteration(C)
D = np.zeros(C.shape)
plt.imshow(S ** 0.1, cmap=plt.cm.twilight_shifted, origin="lower")
plt.savefig("Mandelbrot_set_1.png", dpi=200)
N = abs(Z) >= r # normalized iteration count
T[N] = T[N] - np.log2(np.log(abs(Z[N])) / np.log(r))
plt.imshow(T ** 0.1, cmap=plt.cm.twilight_shifted, origin="lower")
plt.savefig("Mandelbrot_set_2.png", dpi=200)
N = abs(Z) > 2 # exterior distance estimation
D[N] = np.log(abs(Z[N])) * abs(Z[N]) / abs(dZ[N])
plt.imshow(D ** 0.1, cmap=plt.cm.twilight_shifted, origin="lower")
plt.savefig("Mandelbrot_set_3.png", dpi=200)
N, thickness = D > 0, 0.01 # boundary detection
D[N] = np.maximum(1 - D[N] / thickness, 0)
plt.imshow(D ** 2.0, cmap=plt.cm.binary, origin="lower")
plt.savefig("Mandelbrot_set_4.png", dpi=200)