Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Introduzione alla modellazione
di forme naturali
tramite geometria frattale
Corso di Grafica 2014-2015
Facoltà di Informat...
2
Perché la geometria frattale?
● Le forme naturali non sono regolari
● È (quasi) impossibile modellarle con schemi
predet...
3
Perché la geometria frattale?
● Le forme naturali non sono regolari
● È (quasi) impossibile modellarle con schemi
predet...
4
Geometria frattale (1)
“Frattale”: oggetto geometrico dotato di:
1.omotetia interna: si ripete nella sua forma
similarme...
5
Geometria frattale (2)
2.Dimensione topologica non intera (frazionaria)
“Delle grandezze, quella che ha una dimensione è...
6
Geometria frattale (3)
Esempi sulla dimensione frattale:
Di un segmento si raddoppi la lunghezza
→ due copie del segment...
7
La curva di Koch
Curva di Koch
da un segmento di determinata lunghezza,
dividere il segmento in tre segmenti uguali;
can...
8
La curva di Koch (2): Java
private void koch(double x1, double y1, double x2, double y2,
int iteration, Graphics g) {
if...
9
L-System
● L-System è una tecnica che permette di ottenere alcuni tipi di
figure frattale, tra cui la curva di Koch
● È ...
10
L-System (2) : la curva Koch in KTurtle (Logo)
learn koch_rec $step, $distance{
assert $step >= 0 and $distance > 0
if ...
11
Da L-System a IFS
● L-System può essere utilizzato solo su modelli lineari (e dunque
deterministici)
● Un sistema che i...
12
IFS – Barnley Felt (Java)
// http://introcs.cs.princeton.edu/java/22library/IFS.java.html
for (int t = 0; t < T; t++) {...
13
IFS – Barnley Felt (Java)
14
Forme terrestri
● Le forme terrestri (colline, montagne, fondali oceanici) sono
auto-similari.
Es: la forma frastagliat...
15
Algoritmo 1D
● Sia un segmento tra -x e x
● Si generi un triangolo utilizzando come vertici della base gli
estremi del ...
16
Algoritmo 1D - roughness
● La “roughness” (“ruvidità”) è una caratteristica di cui
tener conto, se si vuole un profilo ...
17
Algoritmo 2D: Diamond-Square (1)
1.INIT:
Sia un quadrato a griglia - per convenzione: sul
piano xy, di lato 1, il cui p...
18
Algoritmo 2D: Diamond-Square (2)
3. SQUARE:
ai quattro quadrati formatisi si applicherà la procedura in 1
e 2, ottenend...
19
Diamond-Square: wireframe 3D
● Il wireframe con i 9 punti ottenuti
dalla prima iterazione
● Il wireframe con i 25 punti...
20
● La casualità introdotta per la generazione
delle altezze determina una più “naturale”
forma della montuosità.
● Il pa...
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/
// core
createStartRectangles();
while ( iterati...
23
Demo: MtFractal (2)
// Subdivide one FRectangle into four; add to the given list
final void subdivide( FRectangleList r...
24
Demo: MtFractal (3)
Creating a new Fvertex we apply some noise:
class Fvertex {
//...
final void perturbHeight( FVertex...
25
Demo: xmountains
http://www2.epcc.ed.ac.uk/~spb/xmountains/about_xmountains.html
Porting (su applet) di xmountains:
htt...
26
Demo: fracplanet
● può esportare gli output come modelli per POV-Ray Blender, o
come texture maps generiche
● http://ww...
27
Riferimenti/Bibliografia/Licenza
Demos at: http://fractalandscapes.iubris.net
Source code at: http://github.com/k0smik0...
28
29
Upcoming SlideShare
Loading in …5
×

Modellazione tramite geometria frattale

835 views

Published on

Published in: Software
  • Be the first to comment

Modellazione tramite geometria frattale

  1. 1. Introduzione alla modellazione di forme naturali tramite geometria frattale Corso di Grafica 2014-2015 Facoltà di Informatica Magistrale Università di Bologna a cura di Massimiliano Leone massimiliano.leone@iubris.net http://plus.google.com/+MassimilianoLeone
  2. 2. 2 Perché la geometria frattale? ● Le forme naturali non sono regolari ● È (quasi) impossibile modellarle con schemi predeterminati – Geometria classica (euclidea) – Algoritmi deterministici
  3. 3. 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. 4. 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. 5. 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. 6. 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. 7. 7 La curva di Koch Curva di Koch da 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/KochCurve Kturtle: https://userbase.kde.org/KTurtle/Examples Java (snowflake): http://sourcecodesforfree.blogspot.it/2013/05/32-koch-curve.html
  8. 8. 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. 9. 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. 10. 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 } } reset canvassize 400, 400 go 30, 200 direction 90 koch_rec 5, 100 go 0, 0 1. KTurtle Webpage 2. Demo: Snowflake Koch in Logo
  11. 11. 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): – Apartire 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. 12. 12 IFS – Barnley Felt (Java) // http://introcs.cs.princeton.edu/java/22library/IFS.java.html for (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.html Demo2 (applet Java, con ulteriori esempi IFS): http://www.susqu.edu/brakke/ifs/ifs_applet.htm
  13. 13. 13 IFS – Barnley Felt (Java)
  14. 14. 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. 15. 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. 16. 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. 17. 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. 18. 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. 19. 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. 20. 20 ● La casualità introdotta per la generazione delle altezze determina una più “naturale” forma della montuosità. ● Il parametro è ottenuto a partire da una distribuzione 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. 21. 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. 22. 22 Demo: MtFractal (1) http://www536.pair.com/bgw/applets/1.02/MtFractal/ // core createStartRectangles(); 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. 23. 23 Demo: MtFractal (2) // Subdivide one FRectangle into four; add to the given list final 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 list rectangles.addElement( new FRectangle(_edge1._esub1, e5, e8.reverse(), _edge4._esub2) ); // … similar code using other FEdge }
  24. 24. 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. 25. 25 Demo: xmountains http://www2.epcc.ed.ac.uk/~spb/xmountains/about_xmountains.html Porting (su applet) di xmountains: http://fractalandscapes.iubris.net/_web/xmountains.html
  26. 26. 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. 27. 27 Riferimenti/Bibliografia/Licenza Demos at: http://fractalandscapes.iubris.net Source 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. 28. 28
  29. 29. 29

×