Animare il Buddhabrot
17 December 2008 da Francesco
In un precedente articolo abbiamo visto come sia possibile renderizzare immagini dell’insieme di Mandelbrot ottenendo il cosiddetto Buddhabrot. Oggi mostrerò come si possano renderizzare, invece, delle animazioni del Buddhabrot sfruttando il fatto che questo frattale puo’ essere “interpretato” come un oggetto in quattro dimensioni. Spiegare cio’ non e’ molto facile, per il semplice motivo che non ci e’ possibile visualizzare un oggetto in 4 dimensioni e che dobbiamo accontentarci di una approssimazione creata dalla nostra immaginazione, ma faro’ del mio meglio per rendere l’articolo il piu’ chiaro possibile.
Il concetto di base e’ questo: quando utilizziamo la formula di Mandelbrot e cioe’ Zn+1=Zn2 + C i valori che entrano in gioco sono 4 e sono le parti reali di Z e C e le loro parti immaginarie (d’ora in poi saranno indicate con Z.r, C.r, Z.i, C.i); per ogni possibile combinazione di questi quattro valori avremo un solo valore in uscita, diverso per ogni combinazione. Visto pero’, che non possiamo visualizzare un oggetto in quattro dimensioni, l’unica cosa che possiamo fare e’ visualizzare una sezione bidimensionale dell’oggetto, ed e’ questo quello che accade quando poniamo Z=0 nel renderizzare l’insieme di Mandelbrot. Gli insieme di Julia non sono altro che sezioni dello stesso oggetto ma su piani diversi (che corrispondono ad una diversa scelta del valore iniziale di Z).
In un ambiente tridimensionale abbiamo 3 piani perpendicolari tra di loro; in 4 dimensioni invece, questi piani diventano 6 e sono rappresentati appunto dalle varie coppie possibili dei 4 valori in entrata: [Z.r, Z.i], [Z.r, C.r], [Z.r, C.i], [Z.i, C.r], [Z.i, C.i], [C.r, C.i]. Questi piani sono tutti perpendicolari tra di loro e sono i piani che si riconoscono a prima vista, ma ovviamente il numero di piani su cui potremmo effettuare delle sezioni da visualizzare e’ infinito. Questo e’ il punto che ci permette di renderizzare delle vere e proprie animazioni che includono delle rotazioni del Buddhabrot. Prima di parlare di questo, pero’, vediamo quali sono le modifiche da effettuare al file sorgente che ho distribuito nel precedente articolo per renderizzare sezioni di piani diverse.
In realta’, la modifica da fare e’ una sola ed e’ questa: nella funzione escape() si trova questa parte:
zz[(int)N].r = ZOOM*(Z.r+OFFSET_X)*(WIDTH/2); zz[(int)N].i = ZOOM*(Z.i)*(HEIGHT/2) + HEIGHT/2;
Come vedete, le coordinate che prendiamo in considerazione sono Z.r e Z.i. Basta cambiare questi valori per renderizzare un’altra sezione del frattale. Se al posto di Z.i mettiamo, per esempio, C.r, visualizzeremo l’oggetto visto dal piano [Z.r, C.r].
Vediamo ora come realizzare una rotazione del frattale. Quello che vogliamo fare e’, in poche parole, passare gradualmente dall’immagine di un piano, diciamo [Z.r, Z.i] a quella di un’altro, per esempio, [Z.i, C.r]. Per fare cio’ dobbiamo modificare sempre la formula precedente, nella seguente maniera:
zz[(int)N].r = ZOOM*(rot*Z.r+Z.i*(1-rot)+OFFSET_X)*(WIDTH/2); zz[(int)N].i = ZOOM*(rot*Z.i+C.r*(1-rot))*(HEIGHT/2) + HEIGHT/2;
E’ apparso un nuovo coefficiente, rot. Questo, come potete immaginare, e’ un coefficiente che rappresenta, se vogliamo, l’angolo di rotazione. Per un valore di rot pari a 1, verra’ renderizzato il piano [Z.r, Z.i] poiche’ 1-rot = 0 e quindi le parti Z.i e C.r si annullano. Per rot = 0, avverra’ il contrario. Ovviamente per valori di rot che variano tra 0 e 1 otteremo immagini diverse, per esempio, visto che la rotazione complessiva e’ di 90° (da rot = 0 a rot = 1), rot=0.5 dovrebbe corrispondere ad una rotazione di 45°. Se si renderizzano varie immagini per valori di rot che aumentano progressivamente da 0 a 1, si otterra’ una vera e propria animazione del Buddhabrot rotante.
Ora, se non volete mettervi a modificare manualmente ogni volta il valore di rot, vi conviene aggiungere un paio di cicli for al codice e fare in modo che, ad ogni ciclo, il valore di rot venga modificato per renderizzare un’immagine diversa. Ecco un esempio di “rotazione”, anche se non appare affatto come tale:
Vi lascio un ultimo link alla pagina originale creata da chi ha scoperto questa tecnica (e’ in inglese): http://www.superliminal.com/fractals/bgram/ZrZiOut.htm
Tags: Buddhabrot, C++, Frattali
Pubblicato in Informatica | Commenti (0)
No comments yet
