La rappresentazione dell’insieme di Mandelbrot, considerato uno dei frattali più popolari, è tra i miei algoritmi di prova preferiti quando studio un nuovo linguaggio di programmazione.
L’algoritmo di base è estremamente semplice e si presta facilmente ad esser parallelizzato.
Recentemente, all’interno dei Google Labs, è stata rilasciata un’applicazione Web che, sfruttando le API di Google Maps e canvas di HTML5, permette la navigazione all’interno dell’insieme di Mandelbrot o di altri frattali (es. Julia); vi consiglio di utilizzarla per un tour veloce.
Definizione formale
L’insieme di Mandelbrot è definito come il sottoinsime del piano complesso per cui la successione ricorsiva:
al tendere di n all’infinito, rimane limitata nel suo modulo, ovvero:
Sorgente perl
Ecco un sorgente perl che rappresenta l’insieme in modalità rigorosamente monocromatica:
#!/usr/bin/perl
##########################
# M A N D E L B R O T
# Luca Amore
##########################
use strict;
use warnings;
use GD;
my $FILENAME = 'mandelbrot.png';
my $ITERATIONS = 30;
my ($SIZEX, $SIZEY) = (700, 400);
my ($RE_MIN, $RE_MAX) = (-2.5, 1.0);
my ($IM_MIN, $IM_MAX) = (-1.0, 1.0);
my $re_factor = ($RE_MAX - $RE_MIN) / $SIZEX;
my $im_factor = ($IM_MAX - $IM_MIN) / $SIZEY;
my $img = new GD::Image->newTrueColor($SIZEX,$SIZEY)
or die "Can't create GD::Image";
# palette
my $cl_black = $img->colorAllocate( 0, 0, 0);
my $cl_white = $img->colorAllocate(255,255,255);
open(my $fh, '>', $FILENAME)
or die "Can't open $FILENAME: $!";
binmode $fh;
my $C_im = $IM_MIN;
YY: for (my $yy=0; $yy < $SIZEY; $yy++){
my $C_re = $RE_MIN;
XX: for (my $xx=0; $xx < $SIZEX; $xx++){
my ($Z_re, $Z_im, $i) = (0,0);
# Z0=0, Zn+1 = Zn^2 + C
ESCAPE_ITERATIONS: for ($i = 1; $i < $ITERATIONS; $i++){
my ($Z_re2, $Z_im2) = ($Z_re * $Z_re, $Z_im * $Z_im);
last ESCAPE_ITERATIONS unless ($Z_re2 + $Z_im2 < 4);
# (a+bi)^2 = a^2 + 2abi - b^2
$Z_im = 2 * $Z_re * $Z_im + $C_im;
$Z_re = $Z_re2 - $Z_im2 + $C_re;
} # end: ESCAPE_ITERATIONS
# draw pixel
$img->setPixel(
$xx, $yy, $i == $ITERATIONS ? $cl_black : $cl_white
);
$C_re += $re_factor;
} # end: XX
$C_im += $im_factor;
} # end: YY
# save image
print $fh $img->png(0);
close $fh;
Il codice è stato mantenuto semplice per facilitare le modifiche e la comprensione.
E’ richiesto il package GD per la produzione dell’immagine di output in formato PNG: “mandelbrot.png“.
Colori
Normalmente, per rendere tale frattale più gradevole, nella sua rappresentazione più semplice, si colorano i punti esterni all’insieme in funzione della velocità con la quale divergono a più infinito. Per la colorazione dei punti interni ed esterni esistono una miriade di algoritmi di complessità crescente; alcuni spunti interessanti.
Insieme di Julia
Una variante dell’insieme di Mandelbrot è l’insieme di Julia definito in questo modo:
Rispetto all’insieme di Mandelbrot cambia la successione ricorsiva ed è stata introdotta una costante complessa K.
Analogamente a Mandelbrot i punti appartenenti all’insieme di Julia sono quelli per cui il modulo della successione ricorsiva non diverge.
Alcuni valori di K che si consiglia di esplorare:
- K = 0.353+0.288i
- K = -0.70176-0.3842i
- K = -0.835-0.2321i
- K= -0.45+0.1428i
Dopo aver adeguato lo script perl, ho rappresentato questi insiemi di Julia:
Riferimenti
Mandelbrot Set – Wikipedia
Mu-Ency – The Encyclopedia of the Mandelbrot Set
The Mandelbrot Set (algoritmo tracciamento)
Julia Set – Wikipedia
Esplorazione
Visual Guide To Patterns In The Mandelbrot SetMandelbrot: World Map and Popular Tourist Areas