Ho trovato a questo indirizzo un file csv in cui sono riportate le coordinate di finestre di zoom per l'insieme di Mandelbrot in zone interessanti (sono oltre 105.000 righe)
Quale migliore occasione per creare uno slideshow di immagini dell'insieme di Mandelbrot
import csv
import numpy as np
from PIL import Image
import matplotlib.cm as cm
# Parametri
width, height = 640, 480
max_iter = 1000
colormap = cm.turbo # puoi cambiare: viridis, inferno, magma...
def mandelbrot_vectorized(re_min, re_max, im_min, im_max, width, height, max_iter):
# Griglia complessa
real = np.linspace(re_min, re_max, width)
imag = np.linspace(im_max, im_min, height) # y invertito
C = real[np.newaxis, :] + 1j * imag[:, np.newaxis]
Z = np.zeros(C.shape, dtype=np.complex64)
escape_iter = np.zeros(C.shape, dtype=np.float32)
mask = np.ones(C.shape, dtype=bool) # punti ancora in evoluzione
for n in range(max_iter):
Z[mask] = Z[mask]**2 + C[mask]
escaped = np.abs(Z) > 2
newly_escaped = escaped & mask
if np.any(newly_escaped):
# escape velocity continua
escape_iter[newly_escaped] = n + 1 - np.log2(np.log2(np.abs(Z[newly_escaped])))
mask &= ~escaped # aggiorna mask
# punti che non fuggono restano max_iter
escape_iter[mask] = max_iter
return escape_iter
# Leggi CSV e genera immagini
with open("windows.csv", newline='', encoding='utf-8') as csvfile:
reader = csv.DictReader(csvfile)
for idx, row in enumerate(reader):
row = {k.strip(): v for k, v in row.items()}
re_min = float(row['re_min'])
re_max = float(row['re_max'])
im_min = float(row['im_min'])
im_max = float(row['im_max'])
M = mandelbrot_vectorized(re_min, re_max, im_min, im_max, width, height, max_iter)
# Normalizza escape velocity su 0-1
M_norm = M / M.max()
# Applica colormap
M_color = (colormap(M_norm)[:, :, :3] * 1000).astype(np.uint8)
interior_mask = (M == max_iter)
M_color[interior_mask] = [0, 0, 0]
img = Image.fromarray(M_color)
img.save(f"mandelbrot_escape_vectorized_{idx+1}.png")
print(f"Saved mandelbrot_escape_vectorized_{idx+1}.png")

Nessun commento:
Posta un commento