Grafica

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.

Share
Giampaolo Rossi

Sviluppatore di software gestionale da oltre 28 anni.

Published by
Giampaolo Rossi

Recent Posts

Un Abbonamento per Tutti i Software

Sono arrivato alla convinzione che un abbonamento per tutti i miei software gestionali sia il…

10 mesi ago

Software di Magazzino Gratuito

MerciGest è un software per la gestione del magazzino completamente gratuito. Continua a leggere→

11 mesi ago

Mettere il PC in Lock Screen

In ufficio può capitare di doversi allontanare dal proprio posto di lavoro, ecco che allora…

3 anni ago

Fare il reset togliendo la corrente

In questo articolo vedremo quando è più o meno utile togliere la corrente ad un…

3 anni ago

Prossimi Aggiornamenti Software

Dopo la pausa invernale dovuta al lavoro che devo fare per sostentarmi, eccomi di nuovo…

3 anni ago

Come Eliminare i Files in Windows

Vediamo come eliminare i files direttamente da Windows senza utilizzare il cestino. Continua a leggere→

3 anni ago