400 likes | 527 Views
Frakt álok és csempézések. Szécsi László. Fraktálok. Hausdorff dimenzió. D= (logN) / (log 1/r). N= 1/r D. Koch görbe. D= (log4) / (log 3) = 1.26. N = 4, r = 1/3. Nem önhasonló objektumok dimenziója. Vonalzó ( l ) db l 1 r =1/3 N = 4 r 2 N 2 r m N m.
E N D
Fraktálok és csempézések Szécsi László
Fraktálok Hausdorff dimenzió D= (logN) / (log 1/r) N= 1/rD
Koch görbe D= (log4) / (log 3) = 1.26 N = 4, r = 1/3
Nem önhasonló objektumok dimenziója Vonalzó ( l ) db l 1 r =1/3 N = 4 r2 N2 rm Nm Hossz( l )= l db = l Nm = l (1/r D) m = = l (1/r m) D = 1/ l D -1 D = - log Hossz( l ) / log l + 1
Dimenziómérés = hosszmérés log Hossz( l ) D-1 log l
Fraktálok előállítása • Matematikai gépek: • Brown mozgás • Kaotikus dinamikus rendszerek
Brown mozgás - Wiener féle sztochasztikus folyamat • Sztochasztikus folyamat (véletlen függvény) • Trajektóriák folytonosak • Független növekményű folyamat • Növekmények 0 várható értékű normális eloszlás: • a független növekményűségből, a szórás az intervallum hosszával arányos
Terep generálás 1.5D + random() + H random() + H2 random() H ≠ ½ → más fraktális dimenziójú görbe
Terep generálás 2.5D • középpont elmozdítás ötlete marad • diamond-square módszer átlók metszépontjában csúcsok átlaga + random ugyanez tovább H ×random-mal rombusz közepére csúcsok átlaga + random
Terep generálás a GPUn • véletlenszámok zajtextúrában • magasságmező-textúra a render target • for(int i=0; i<n; i++) • full screen quad rajzolás • pixel shaderben • freki skálázás: tex *= 2i • zaj textúra olvasása: height = tex2d(noise, tex) • amplitúdó skálázás: height *= Hi
Kaotikus dinamikus rendszer: nyulak kis C értékre S n+1= C Sn (1-Sn)
Kaotikus rendszerek a síkon F z = x + jy
z z2 z = r e i r r2 2 divergens konvergens 1 Attraktor: H = F(H)
Attraktor előállítása • Attraktor a labilis és a stabilis tartomány határa: kitöltött attraktor = amely nem divergens • z n+1= z n2 : ha z < akkor fekete • Attraktorhoz konvergálunk, ha az stabil • z n+1= z n2 attraktora labilis
Inverz iterációs módszer H = F(H) H = F-1 (H) z n+1= z n2 z n+1= z n r n+1= r n n+1= n/2 + {0,1}· r n 1 n {0,1}.{0,1}{0,1}... · 1 n n-1 n-2 Nem lehet csak egy értékkel dolgozni ???
Kitöltött Julia halmaz: algoritmus Im z (X,Y) FilledJuliaDraw ( ) FOR Y = 0 TO Ymax DO FOR X = 0 TO Xmax DO ViewportWindow(X,Y x, y) z = x + j y FOR i = 0 TO n DO z = z2 + c IF |z| > “infinity” THEN WRITE(X,Y, white) ELSE WRITE(X,Y, black) ENDFOR ENDFOR END Re z
Julia shader float2 juliac = float2(-0.65, 0.5); float4 psJuliaFill(vsQuadOutput input) : COLOR0 { float2 c = juliac; float2 z = input.worldPos.xy; bool divergent = false; for(int i=0; i<30; i++) { float2 z2 = float2(z.x * z.x - z.y * z.y, 2 * z.x * z.y) + c; z = z2; if(length(z) > 100.0) { divergent = true; break; } } return divergent; };
Távolság becslés • színezés a pont halmaztól vett távolsága alapján zopont távolsága a Julia halmaztól |G|/|G'|G(zo) = lim k→∞ log|zk|/nk |G'(zo)| = lim k→∞ |dzk/dzo| / (nk|zk|) . a dzk/dzo is iteratívan számolható dzk/dzo = 2kzk-1 ... zo
Julia shader DE float2 juliac = float2(-0.65, 0.5); float4 psJuliaDistanceEstimator(vsQuadOutput input) : COLOR0 { float2 c = juliac; float2 z = input.worldPos.xy; float2 dz = float2(1, 0); while(length(dz) > 0.01) { float2 z2 = float2(z.x * z.x - z.y * z.y, 2 * z.x * z.y) + c; dz = 2 * float2(z.x * dz.x - z.y * dz.y, z.x * dz.y + dz.x * z.y); z = z2; if(length(z) > 100.0) break; } return pow(log(dot(z, z)) * length(z) / length(dz), 0.2); };
Julia 3D • komplex → kvaternió
Julia halmaz nem összefüggő, Cantor féle halmaz összefüggő
Julia halmaz összefüggősége H-c H c H-c H c z n+1= z n-c
Mandelbrot halmaz Azon c komplex számok, amelyekre a z z2 + c Julia halmaza összefüggő
Mandelbrot halmaz, algoritmus MandelbrotDraw ( ) FOR Y = 0 TO Ymax DO FOR X = 0 TO Xmax DO ViewportWindow(X,Y x, y) c = x + j y z = 0 FOR i = 0 TO n DO z = z2 + c IF |z| > “infinity” THEN WRITE(X,Y, white) ELSE WRITE(X,Y, black) ENDFOR ENDFOR END
Mandelbrot shader float4 psMandelbrotFill(vsQuadOutput input) : COLOR0{ float2 c = input.worldPos.xy; float2 z = c; bool divergent = false; for(int i=0; i<30; i++) { float2 z2 = float2(z.x * z.x - z.y * z.y, 2 * z.x * z.y) + c; z = z2; if(length(z) > 100.0){ divergent = true; break; } } return divergent; };
Mandelbrot shader DE float4 psMandelbrotDE(vsQuadOutput input) : COLOR0{ float2 c = input.worldPos.xy; float2 z = c; float2 dz = 0; while(length(z) < 8.0){ float2 z2 = float2(z.x * z.x - z.y * z.y, 2 * z.x * z.y) + c; dz = 2 * float2(z.x * dz.x - z.y * dz.y, z.x * dz.y + dz.x * z.y) + float2(1, 0); z = z2; if(length(z) > 100.0)break; } return pow(log(dot(z, z)) * length(z) / length(dz), 0.1); };
Inverz feladat: IFS modellezés F x, y H F Attraktor: H = F(H) F: szabadon vezérelhető, legyen stabilis attraktora
F: többértékű lineáris leképzés F = W1 W2 … Wn W(x,y) = [ax + by + c, dx + ey + f] H = W1(H) W2 (H) … Wn (H) Stabilitás = kontrakció H = F(H)