I Frattali e gli Insiemi di Julia

Nello scorso articolo sui frattali ci siamo soffermati a dare un’introduzione a questo argomento molto vasto, questa volta faremo pratica in codice C e cercheremo di creare ed animare i nostri frattali. In particolare disegneremo a colori gli insiemi di Julia ed i frattali di Mandelbrot. Le sole due operazioni matematiche che useremo saranno l’addizione e la moltiplicazione, ma non quelle che siamo abituati ad usare normalmente in matematica, comunque niente di eccessivamente complicato, in pratica stiamo parlando di numeri complessi. Un punto di un insieme frattale è definito dalle coordinate X ed Y del piano cartesiano, quindi dati due punti:

P = (X1, Y1)
Q = (X2, Y2)

P + Q = (X1 + X2, Y1 + Y2)

Il prodotto è leggermente più complicato:

  • il prodotto di 2 ascisse è l’ascissa (X1 * X2)
  • il prodotto di 2 ordinate è l’ascissa (-Y1 * Y2)
  • il prodotto di un’ascissa ed un’ordinata è l’ordinata che vale, a seconda (X1 * Y2) e (Y1 * X2)

quindi

P * Q = (X1 * X2 – Y1 * Y2, X1 * Y2 + Y1 * X2)

Facciamo degli esempi concreti:

P(1, 2)
Q(3, 4)

P + Q = (1+3, 2+4) = (4, 6)
P * Q = (1*3-2*4, 1*4+2*3) = (-5, 10)

Ovviamente dovete sempre fare prima le moltiplicazioni delle somme. Lo strumento di sviluppo che utilizzerò per scrivere il codice per generare i frattali sarà il Visual C/C++ di Microsoft e disegnerò i frattali in una semplice finestra utilizzando le MFC.
Iniziamo con l’insieme di Julia, prendiamo tutti i punti su un piano con ascisse ed ordinate della larghezza della nostra finestra con centro in mezzo alla finestra stessa. Ogni punto della finestra lo moltiplicheremo per se stesso e gli sommeremo un punto scelto a caso. Il risultato è ancora un punto compreso nel piano XY, da verificare se rientra all’interno della nostra finestra. Man mano che continuiamo a fare queste operazioni con i risultati che via via si ottengono, abbiamo ciò che si chiama iterazione. Ecco il codice che dobbiamo inserire nell’evento OnPaint della finestra per disegnare questa prima iterazione:


int a = 0;
int b = 0;
int l = rc.Width() / 2;
int h = rc.Height() / 2;
int n = 150;

dc.SetViewportOrg(l, h);

for (int xs = 0; xs <= l * 2; xs++)
{
   for (int ys = 0; ys <= h * 2; ys++)
   {
        int x = xs * xs – ys * ys + a;
        int y = xs * ys + xs * ys + b;

        x /= n;
        y /= n;

        if (x >= -l && x <= l && y >= -h && y <= h)
        {
              dc.SetPixel(x, y, RGB(255, 255, 255));
              dc.SetPixel(-x, -y, RGB(255, 255, 255));
        }
   }
}

Come ultimo ritocco possiamo modificare i colori in base alla distanza dal centro, in particolare il rosso ed il verde in base alla larghezza ed il blu in base all’altezza, vediamo come fare:


int rg = 255 – (int)((255.0 / abs((double)l)) * abs((double)x));
int b = 255 – (int)((255.0 / abs((double)h)) * abs((double)y));

dc.SetPixel(x, y, RGB(rg, rg, b));
dc.SetPixel(-x, -y, RGB(rg, rg, b));

Ovviamente questi sono solo degli esempi, ma rendono bene l’idea di cosa siano gli insiemi di Julia. L’insieme di Mandelbrot rappresenta tutti i valori di a e b che possono essere utilizzati per ottenere un insieme di Julia, sono infiniti, ma delimitati alla superficie della finestra.

Informazioni su Giampaolo Rossi

Sviluppatore di software gestionale da oltre 28 anni.
Questa voce è stata pubblicata in Grafica. Contrassegna il permalink.