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:
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.
Sono arrivato alla convinzione che un abbonamento per tutti i miei software gestionali sia il…
MerciGest è un software per la gestione del magazzino completamente gratuito. Continua a leggere→
In ufficio può capitare di doversi allontanare dal proprio posto di lavoro, ecco che allora…
In questo articolo vedremo quando è più o meno utile togliere la corrente ad un…
Dopo la pausa invernale dovuta al lavoro che devo fare per sostentarmi, eccomi di nuovo…
Vediamo come eliminare i files direttamente da Windows senza utilizzare il cestino. Continua a leggere→