venerdì 5 dicembre 2025

Slideshow Mandelbrot

 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

Slideshow Mandelbrot

 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 ...