modellazione tramite geometria frattale
TRANSCRIPT
Introduzione alla modellazione di forme naturali
tramite geometria frattaleCorso di Grafica 2014-2015
Facoltà di Informatica MagistraleUniversità di Bologna
a cura di Massimiliano Leone
[email protected]://plus.google.com/+MassimilianoLeone
2
Perché la geometria frattale?
● Le forme naturali non sono regolari
● È (quasi) impossibile modellarle con schemi predeterminati
– Geometria classica (euclidea)
– Algoritmi deterministici
3
Perché la geometria frattale?● Le forme naturali non sono regolari
● È (quasi) impossibile modellarle con schemi predeterminati
– Geometria classica (euclidea)
– Algoritmi deterministici● Occorre “irregolarità” → casualità
“Le nuvole non sono sfere, le montagne non sono coni, le coste non sono cerchi e la corteccia non è piana,
né un fulmine viaggia su una linea retta.” Benoit Mandelbrot
4
Geometria frattale (1)
“Frattale”: oggetto geometrico dotato di:
1.omotetia interna: si ripete nella sua forma similarmente su scale diverse→ ingrandendo una qualunque parte si ottiene una figura simile all'originale. Detta anche autosimilarità o autosomiglianza.
5
Geometria frattale (2)2.Dimensione topologica non intera (frazionaria)
“Delle grandezze, quella che ha una dimensione è linea, quella che ne ha due è superficie, quella che ne ha tre è corpo, e al di fuori di queste non si hanno altre grandezze.” - Aristotele
Ma la dimensione (topologica) dei frattali non è (sempre) intera; sia d la dimensione dell'oggetto, n il numero di ingradimenti (vedi pag. 4 e pag. 7):
f(n) = nd ↔ log[ f(n) ] = log(nd) ↔log[ f(n) ] = d*log(n) ↔d = log[ f(n) ] / log(n)
6
Geometria frattale (3)Esempi sulla dimensione frattale:
Di un segmento si raddoppi la lunghezza → due copie del segmento originale → 2=21. In generale: tante copie quanto è il numero di ingrandimenti, con f(n)=n e d=1. È facile dimostrare che per il piano d=2 e per il solido d=3 (vedere anche: http://www.vanderbilt.edu/AnS/psychology/cogsci/chaos/workshop/Fractals.html)
✔ La curva di Koch ha d=log(4)/log(3) ~ 1,26✔ Il frattale di Cantor ha d=log(2)/log(3) ~ 0.63✔ Il triangolo di Sierpinski ha d=log(3)/log(2) ~ 1.58✔ ...
7
La curva di Koch
Curva di Kochda un segmento di determinata lunghezza,
dividere il segmento in tre segmenti uguali; cancellare il segmento centrale, sostituendolo con due segmenti identici che costituiscono i due lati di un triangolo equilatero; tornare al punto 1 per ognuno degli attuali segmenti.`
Logo: Netlogo: http://ccl.northwestern.edu/netlogo/models/KochCurveKturtle: https://userbase.kde.org/KTurtle/Examples
Java (snowflake):http://sourcecodesforfree.blogspot.it/2013/05/32-koch-curve.html
8
La curva di Koch (2): Java
private void koch(double x1, double y1, double x2, double y2, int iteration, Graphics g) { if (iteration<=1) { // draw first line g.drawLine ((int )x1,(int )y1,(int )x2,(int )y2); } else { double x4=x1*2/3 + x2*1/3; double y4=y1*2/3 + y2*1/3; double x5=x1*1/3 + x2*2/3; double y5=y1*1/3 + y2*2/3; double x6=(int) (0.5 * (x1+x2) + Math.sqrt(3) * (y1-y2)/6); double y6=(int) (0.5 * (y1+y2) + Math.sqrt(3) * (x2-x1)/6); //call itself on intermediate points, until it reachs 0 koch(x1,y1,x4,y4,iteration-1,g); koch(x4,y4,x6,y6,iteration-1,g); koch(x6,y6,x5,y5,iteration-1,g); koch(x5,y5,x2,y2,iteration-1,g); } } Demo (Applet Java):
http://fractalandscapes.iubris.net/_web/kkoch.html
9
L-System● L-System è una tecnica che permette di ottenere alcuni tipi di
figure frattale, tra cui la curva di Koch
● È formalmente una grammatica costituita da simboli (arbitrari), un assioma (il punto di inizio) e un set di produzioni/regole: l'iterazione procede sostituendo l'output della produzione qualora si incontri un simbolo che fa match. Es: “axiom Y: Y → XYX”; su un XY a piacere, applicando l'assioma si avrà: XXYX.
● La curva di Koch può esser generata da un L-System dotato di 3 simboli:
✔ Alfabeto: F; Costanti: +, −; Assioma: F (con F++F++F
si ottiene il “fiocco di neve”); Regola: F → F−F++F−F✔ F → "disegna", + → "ruota a dx di 60°", − → "ruota a sx di 60°"
10
L-System (2) : la curva Koch in KTurtle (Logo)learn koch_rec $step, $distance{ assert $step >= 0 and $distance > 0
if $step != 0{ koch_rec $step -1, $distance/3 turnleft 60 koch_rec $step -1, $distance/3 turnright 120 koch_rec $step -1, $distance/3 turnleft 60 koch_rec $step -1, $distance/3 }else{ forward $distance turnleft 60 forward $distance turnright 120 forward $distance turnleft 60 forward $distance }}
resetcanvassize 400, 400go 30, 200direction 90koch_rec 5, 100go 0, 0
1. KTurtle Webpage
2. Demo: Snowflake Koch in Logo
11
Da L-System a IFS● L-System può essere utilizzato solo su modelli lineari (e dunque
deterministici)
● Un sistema che introduce aleatorietà è IFS (Iterated Function System):
– A partire da un punto iniziale, gli si applica una trasformazione geometrica scelta a caso da un insieme di predefinite; il punto ottenuto viene disegnato e, parimenti, costituisce il nuovo punto di partenza cui applicare il medesimo procedimento
– Il risultato dipende “solo” dalla famiglia di funzioni predefinite e dalla funzione di probabilità utilizzata per l'estrazione
12
IFS – Barnley Felt (Java)// http://introcs.cs.princeton.edu/java/22library/IFS.java.htmlfor (int t = 0; t < T; t++) { // pick a random rule according to the probability distribution int r = StdRandom.discrete(dist);
// do the update double x0 = cx[r][0]*x + cx[r][1]*y + cx[r][2]; double y0 = cy[r][0]*x + cy[r][1]*y + cy[r][2]; x = x0; y = y0;
// draw the resulting point StdDraw.point(x, y);
// for efficiency, display only every 100 iterations if (t % 100 == 0) StdDraw.show(10);}Demo1 (applet Java del codice illustrato):http://fractalandscapes.iubris.net/_web/ifs.htmlDemo2 (applet Java, con ulteriori esempi IFS): http://www.susqu.edu/brakke/ifs/ifs_applet.htm
13
IFS – Barnley Felt (Java)
14
Forme terrestri● Le forme terrestri (colline, montagne, fondali oceanici) sono
auto-similari. Es: la forma frastagliata di una catena montuosa appare tale per qualsiasi scala
● È dunque possibile usare un modello frattale per riprodurre la loro geometria
● Non sono “perfette”, ma sufficientemente irregolari=> occorre una componente casuale nel processo generatore
“Introduce a little anarchy, upset the established order, and everything becomes chaos, [...]
and you know the thing about chaos? It’s fair.” - The Joker
15
Algoritmo 1D
● Sia un segmento tra -x e x
● Si generi un triangolo utilizzando come vertici della base gli estremi del segmento originario, e come vertice in altezza il punto medio del segmento – il valore numerico dell'altezza sia un numero casuale
● Ripetere per tutti i nuovi segmenti generati
16
Algoritmo 1D - roughness● La “roughness” (“ruvidità”) è una caratteristica di cui
tener conto, se si vuole un profilo montuoso verosimile: ad ogni nuova iterazione occorre ridurre gli estremi dell'intervallo dal quale si estrae il numero casuale utilizzato per l'altezza
● Dato un intervallo iniziale tra 0.0 e 1.0, ad ogni iterazione il numero casuale è dato da una power-law c=2(-H) => 0.5<c<1.0 con 0<H<1 (c=0.5 per H → 1 e c=1.0 per H → 0)
● I valori ottenuti ad ogni nuova iterazione possono essere sostituiti come min e max degli estremi dell'insieme cui attingere il numero casuale
17
Algoritmo 2D: Diamond-Square (1)1. INIT:
Sia un quadrato a griglia - per convenzione: sul piano xy, di lato 1, il cui primo vertice coincide con l'origine degli assi. Assegnare un'altezza casuale ai quattro vertici della griglia.
2. DIAMOND: Ottenere la media delle quattro altezze e applicare al risulatato una perturbazione (un “rumore” casuale): il valore ottenuto è l'altezza del punto medio della griglia
18
Algoritmo 2D: Diamond-Square (2)
3. SQUARE: ai quattro quadrati formatisi si applicherà la procedura in 1 e 2, ottenendo nuovi punti intermedi; successivamente, la media delle altezze degli angoli, con l'aggiunta di una perturbazione, risulterà essere il valore del punto mediano del quadrato computato (in Diamond).
4. RECURSIVE: applichiamo nuovamente il passo 2 per ogni quadrato che si crea nella griglia, ed il passo 3 per ogni diamante che si crea nel Diamond step.
5. Procedere finchè la griglia non è sufficientemente densa.
19
Diamond-Square: wireframe 3D● Il wireframe con i 9 punti ottenuti
dalla prima iterazione
● Il wireframe con i 25 punti della seconda iterazione
● Il wireframe della quinta iterazione, con 128 punti
● Il numero dei punti è pari a 2(I+2), I = numero di iterazioni per ogni suddivisione
20
● La casualità introdotta per la generazione delle altezze determina una più “naturale” forma della montuosità.
● Il parametro è ottenuto a partire da unadistribuzione normale, e riscalato rispetto al valore della precedente iterazione.L'equazione è sempre una power-law.
Al passo 1: e al passo n:
Diamond-Square: roughness (1)
21
Diamond-Square: roughness (2)
H=0.5
H=0.75
H=1.25
H=1.0
https://plus.maths.org/content/modelling-nature-fractals
22
Demo: MtFractal (1)
http://www536.pair.com/bgw/applets/1.02/MtFractal/
// corecreateStartRectangles();while ( iterations-- > 0 ) {
try {_rectangles = subdivide();
} catch ( OutOfMemoryError e ) { /* yes, it's horrible*/ }}// ..FRectangleList subdivide() {
FRectangleList rectangles = new FrectangleList();Enumeration e = _rectangles.elements();FRectangle r;while ( e.hasMoreElements() ) {
r = (Frectangle)e.nextElement();r.subdivide( rectangles );
}return rectangles;
}
23
Demo: MtFractal (2)// Subdivide one FRectangle into four; add to the given listfinal void subdivide( FRectangleList rectangles ) {
FVertex mid1 = _edge1.subdivide(); // ← the chaos is here// … same code for edge2, edge3, edge4
// Calculate the center of the four midpoints - the center of the rectangle
int xc = (mid1._x + mid2._x + mid3._x + mid4._x) / 4;int yc = (mid1._y + mid2._y + mid3._y + mid4._y) / 4;int hc = (mid1._h + mid2._h + mid3._h + mid4._h) / 4;
FVertex mid5 = new FVertex( xc, yc, hc );
FEdge e5 = new FEdge( mid1, mid5 );// generate also e6, e7, e8 using mid2, mid3, mid4
// create new rectangles and add to input listrectangles.addElement( new FRectangle(_edge1._esub1, e5,
e8.reverse(), _edge4._esub2) );// … similar code using other FEdge
}
24
Demo: MtFractal (3)
Creating a new Fvertex we apply some noise:
class Fvertex {//...final void perturbHeight( FVertex v1, FVertex v2 ) {
float factor = _random.nextFloat();int xdiff = v1._x – v2._x;xdiff = (xdiff < 0) ? -xdiff : xdiff;int ydiff = v1._y – v2._y;ydiff = (ydiff < 0) ? -ydiff : ydiff;// The lower is H, the higher is the roughness_h = _h + (int)((xdiff + ydiff)*( Math.pow(0.5,
(factor) * MtFractal._H/ 2) )); // power law}//...
}
Demo (applet Java): http://fractalandscapes.iubris.net/_web/mtfractal.html
25
Demo: xmountainshttp://www2.epcc.ed.ac.uk/~spb/xmountains/about_xmountains.html
Porting (su applet) di xmountains:http://fractalandscapes.iubris.net/_web/xmountains.html
26
Demo: fracplanet● può esportare gli output come modelli per POV-Ray Blender, o
come texture maps generiche
● http://www.bottlenose.demon.co.uk/share/fracplanet/index.htm
● Java porting: http://terraj.sourceforge.net/
–Utilizza JOGL per il rendering nativo (tramite JNI):
✔ in Linux le schede Intel (i965) non hanno pieno supporto per il binding JOGL ↔ openGL 3.x
✔ Le schede nVidia funzionano 100%
27
Riferimenti/Bibliografia/LicenzaDemos at: http://fractalandscapes.iubris.netSource code at: http://github.com/k0smik0/fractalandscapes
Bibliography:✔ http://www.frattali.it/introduzioneaifrattali.htm✔ http://www.webfract.it/FRATTALI/dimFrattale.htm ✔ http://it.wikipedia.org/wiki/Curva_di_Koch ✔ http://www.gameprogrammer.com/fractal.html ✔ http://www.mat.unimi.it/users/alzati/Geometria_Computazionale_98-99/apps/Terreni/teoria.htm✔ https://plus.maths.org/content/modelling-nature-fractals ✔ Mandelbrot: “Gli oggetti frattali”; Aristotele: “Fisica”; Chris Nolan: “Il cavaliere oscuro”
Quest'opera è distribuita con Licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 4.0 Internazionale
28
29