modellazione tramite geometria frattale

29
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 [email protected] http://plus.google.com/+MassimilianoLeone

Upload: massimiliano-leone

Post on 28-Jul-2015

63 views

Category:

Software


0 download

TRANSCRIPT

Page 1: Modellazione tramite geometria frattale

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

Page 2: Modellazione tramite geometria frattale

2

Perché la geometria frattale?

● Le forme naturali non sono regolari

● È (quasi) impossibile modellarle con schemi predeterminati

– Geometria classica (euclidea)

– Algoritmi deterministici

Page 3: Modellazione tramite geometria frattale

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

Page 4: Modellazione tramite geometria frattale

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.

Page 5: Modellazione tramite geometria frattale

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)

Page 6: Modellazione tramite geometria frattale

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✔ ...

Page 7: Modellazione tramite geometria frattale

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

Page 8: Modellazione tramite geometria frattale

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

Page 9: Modellazione tramite geometria frattale

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°"

Page 10: Modellazione tramite geometria frattale

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

Page 11: Modellazione tramite geometria frattale

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

Page 12: Modellazione tramite geometria frattale

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

Page 13: Modellazione tramite geometria frattale

13

IFS – Barnley Felt (Java)

Page 14: Modellazione tramite geometria frattale

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

Page 15: Modellazione tramite geometria frattale

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

Page 16: Modellazione tramite geometria frattale

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

Page 17: Modellazione tramite geometria frattale

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

Page 18: Modellazione tramite geometria frattale

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.

Page 19: Modellazione tramite geometria frattale

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

Page 20: Modellazione tramite geometria frattale

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)

Page 21: Modellazione tramite geometria frattale

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

Page 22: Modellazione tramite geometria frattale

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;

}

Page 23: Modellazione tramite geometria frattale

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

}

Page 24: Modellazione tramite geometria frattale

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

Page 25: Modellazione tramite geometria frattale

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

Page 26: Modellazione tramite geometria frattale

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%

Page 27: Modellazione tramite geometria frattale

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

Page 28: Modellazione tramite geometria frattale

28

Page 29: Modellazione tramite geometria frattale

29