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
Brown mozgás alkalmazása
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 iterációk
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 dinamikus rendszer: nyulak közepes C értékre
Kaotikus dinamikus rendszer: nyulak nagy C értékre
Kaotikus rendszerek a síkon F z = x + jy
z z2 z = r e i r r 2 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 ???
Julia halmaz: z z2 + c
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 END Re z
Kitöltött Julia halmaz: kép
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; };
Julia shader
Távolság becslés színezés a pont halmaztól vett távolsága alapján zo pont 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 shader DE
Julia 3D komplex → kvaternió
Sphere tracing
Julia halmaz nem összefüggő, Cantor féle halmaz összefüggő
Julia halmaz összefüggősége H-c 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 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
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); };
Mandelbrot shader DE
Inverz feladat: IFS modellezés 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)
Egyszerű IFS-ek