You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: docs/notes/sem4/computer_graphics/12.md
+87-33Lines changed: 87 additions & 33 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -594,29 +594,30 @@ Mivel minden lépésben a $+$-os és a $-$-os ágat is végrehajtjuk, ezért az
594
594
595
595
Fontos még kiemelni, hogy a káosz egyik tulajdonságát nagyon jól szemlélteti ez a példa, mégpedig a kezdőfeltételek információjának eltűnését. Hiszen nagy $n$ esetén bármely $r_0$-ra $\sqrt[2^n]{r_0} \approx 1$ és bármely $\theta_0$-ra $\theta_0/2^n \approx 0$, tehát ha mondjuk $n = 10^100$, akkor $r_n$-ből és $\theta_n$-ből lehetetlen kitalálni, hogy mi volt $r_0$ és $\theta_0$.
596
596
597
-
$H=F(H) \Rightarrow H=F^{-1}(H)$
597
+
Ezt a folyamatot algoritmikus szemptonból is megközelíthetjük. A $z_0$ kezdeti pontra ha alkalmazzuk a kétértékű leképezésünk, akkor két pontot kapunk, a $+\sqrt{}$ és a $-\sqrt{}$ irányba egyet-egyet. Ezekre ismételten a leképezésünket alkalmazva további pontokat kapunk, egy bináris fa struktúrában.
Az exponenciális növekedés miatt ha ezt meg akarnánk programozni, akkor nagyon hamar elfogyna a gépünk memóriája, tehát felmerülhet a kérdés, hogy ahelyett, hogy szélességi bejárást folytatunk, és a teljes fát ábrázolni akarjuk, nem tudjuk valahogy ezt lecserélni valamilyen mélységi bejárásra?
600
600
601
-
$r_{n+1} = \sqrt{r_n}$
601
+
Ez annak felelne meg, mintha a bináris fa tetejéről kiindulva mindig csak az egyik élen mennénk le, azaz mindig vagy $+\sqrt{}$ vagy $-\sqrt{}$-el képeznénk új pontokat. Ezt a választást úgy kéne meghoznunk, hogy a mélységi bejárás által meglátogatott pontok is elég sűrűn lefedjék az attraktort, ami közel sem triviális. Ha mindig csak $+\sqrt{}$ vagy $-\sqrt{}$ irányba megyünk, akkor a $\theta_n$ fázisszög $0$ és $2\pi \equiv 0$ marad végig, tehát nem fedjük le az attraktort.
602
602
603
-
$\varphi_{n+1} = \varphi_n/2 + \pi\{0|1\}$ (azaz $\pi ~\cdot$ vagy $0$ vagy $1$, mert 2 gyök van)
603
+
Próbáljunk meg mondjuk felváltva választani, ekkor:
azaz vagyis tehát a körön lesz előbb vagy utóbb de leginkább csak közelíti
612
+
Sajnos láthatjuk, hogy még így is csak két különböző pontot sikerült elérnünk, és ez általánosítható: ha egy $n$ hosszú periódussal haladunk, akkor $n$ darab pontot fogunk lefedni csak. Ez azt jelenti, hogy semmilyen periodikus sorozattal nem tudjuk elérni, hogy lefedjük a teljes attraktort.
610
613
611
-
- függvény attraktora (ha van neki) megegyezik az inverzével, de stabilitása ellentétes lesz (stabil $\rightleftarrows$ labilis)
612
-
- $z^2$-nél távolabb visz (labilis), inverzénél ($\sqrt{z_n}$) közelebb visz (stabil) az iteráció az attraktorhoz
613
-
A továbbiakban az lesz a célunk, hogy különböző tetszőleges $F$ függvények attraktorait felrajzoljuk.
614
+
A megoldást azt fogja jelenteni, hogy _véletlenszerűen_ választunk a leképzés két eredménye közül. Ekkor pozitív valószínűsége van bármely pontnak arra, hogy kiválassza az algoritmusunk. Ezzel tehát megoldottuk a kezdeti problémánkat: nem kell szélességi bejárást csinálni, ami az összes erőforrásunkat megenné, hanem szimplán minden leképezés után csak az egyik ággal dolgozunk tovább, amit véletlenszerűen döntünk el.
614
615
615
616
### Attraktorok felrajzolása
616
617
617
-
Az egyik megközelítés az lehet, hogy felismerjük, hogy az attraktor az divergens és konvergens régiókat választ el egymástól. Ha az összes konvergens pontot feketére színezzük, és a divergenseket fehéren hagyjuk, akkor a keletkező fekete alakzatoknak a határavonalai lesznek a függvény attraktorai.
618
+
Mielőtt elkezdünk programokat írni, ki kell találnunk, hogy egyáltalán hogyan tudjuk vizualizálni az attraktorainkat. Az egyik megközelítés az lehet, hogy felismerjük, hogy az attraktor az divergens és konvergens régiókat választ el egymástól. Ha az összes konvergens pontot feketére színezzük, és a divergenseket fehéren hagyjuk, akkor a keletkező fekete alakzatoknak a határavonalai lesznek a függvény attraktorai.
618
619
619
-
Hogyan tudjuk eldönteni, hogy egy pont divergens-e vagy sem? Tudjuk, hogy például $F$ esetében
620
+
Hogyan tudjuk eldönteni, hogy egy pont divergens-e vagy sem? Tudjuk, hogy például $F \colon z \mapsto z^2$ esetében
620
621
621
622
$$
622
623
z_{n+1}=z_{n}^2
@@ -630,46 +631,98 @@ $$
630
631
631
632
akkor nem divergens. Persze amikor programozunk, akkor közelítenünk kell, általában jó nagy $n$-ig elmegyünk, és megnézzük, hogy meghalad-e egy bizonyos távolságot a $|z_n|$.
632
633
633
-
## Többértékű leképzés: bolyongás
634
+
??? example "Fekete-fehér az unalmas"
635
+
Későbbi diákon, illetve az interneten is sok helyen színekkel ábrázolják a Julia halmazokat.
636
+
637
+
Ne jöjjünk zavarba, az alap logika ugyan az, annyi változtatást tehetünk, hogy a divergáló pontoknál megnézzük a küszöböt elérve, hogy milyen távol kerültek az origótól. A "leggyorsabban" divergáló ponthoz ha hozzárendelünk egy sötétkéket, a "leglassabban" konvergálóhoz pedig egy pirosat, és közöttük pedig lineárisan interpolálunk, akkor máris megkaphattuk azokat a szép színes Julia halmazokat amik fel-fel bukkannak az interneten.
638
+
639
+
### Julia halmaz
640
+
641
+
Így, hogy minden eszközünk meg van rá, próbáljunk meg felrajzolni pár attraktort! Ahogy korábban is láttuk, az $F \colon z \mapsto z^2$ függvény attraktora az egységkör. Lássuk tehát!
Hát... ennél azért könnyebb algoritmusaink is vannak körök felrajzolására...
646
+
647
+
Próbáljunk kicsit módosítani $F$-en, hogy érdekesebb alakzatokat kapjunk. Nézzük például az
648
+
649
+
$$
650
+
F': z \mapsto z^2 + c
651
+
$$
652
+
653
+
függvényt, ahol $c \in \cnums$. Ekkor ha variáljuk $c$ értékét, rettenetesen sok érdekes attraktort kapunk:
654
+
655
+

656
+
657
+
Az $F'$ összes attraktorának halmazát _Julia halmaznak_ nevezik (ejtsd: \[zsúlia\]).
634
658
635
-
- $\varphi_{n+1} = \varphi_n/2 + \pi\{0|1\}$
636
-
azaz
637
-
- a pozitív gyök esetén $\varphi \to 0$
638
-
- a negatív gyök esetén $\varphi \to 1$
639
-
- ha mindig csak egy irányba megyünk az nem lesz jó, véletlenszerűen bolyongunk benne
659
+
#### Implementáció
640
660
641
-
## Julia halmaz
642
-
$F: z \mapsto z^2 + c$
643
-
Kölönböző $c$-k esetén:
644
-

661
+
Nézzük meg a kitöltött Julia halmaz implementációját. Pszeudokód szinten relatívan egyszerű: a kamerának kiválasztjuk egy pixelét (pontosabban egy olyan tartományt a virtuális világban ami egy pixelnek felel meg), és megnézzük, hogy az a pont divergál-e vagy sem. Ehhez választunk egy jó nagy küszöböt, és alkalmazzuk rá az $F'$ függvényt. A konvergenciájától függően vagy feketére vagy fehérre színezzük, és megyünk tovább (ehhez a megközelítéshez kódot az előadásdiákon találtok).
645
662
646
-
### Implementáció
647
-
> 2 féle megközelítés:
663
+
Érezhető viszont, hogy ez picit lassú. Nagyon sok időt töltünk el olyan pontokkal is, amik már pár iteráció után divergálnak, és ha nagyon hatékonyak akarunk lenni, akkor a divergens pontokkal még csak foglalkoznunk se kéne. Másrészt pedig pixelvezérelt, ami a modern, nagy felbontású képernyők esetében nem hatékony.
648
664
649
-
> - "gyökvezérelt": számoljuk a gyököket egy bizonyos mélységig, és az érintett pixeleket átszínezzük
650
-
> - pixelvezérelt: minden pixelre a függvény inverzén iterálunk, az alapján színezünk
651
-
> *(elég gettó megfogalmazás de nekem ez jött át, kódot nem kaptok \:P)*
665
+
Próbáljuk meg implementálni a fentebbi véletlenszerűségre alapuló algoritmust. Csak az attraktor pontjait (a konvergens pontok nélkül) előállíthatjuk az inverz iteráció módszerével is. Ez egy "gyökvezérelt" megközelítés, és sokkal hatékonyabb lesz. Az alapjait már fentebb tárgyaltuk: az attraktor egy pontjából elindítjuk az iterációt és minden lépésben alkalmazzuk $F^{-1}$-et a pontunkra, és véletlenszerűen választunk a $\pm$ előjelek között. Ezt elég nagy küszöbig ismételve, ha az összes pontot amit bejártunk kiszínezünk feketére, akkor megkapjuk az attraktort.
652
666
667
+
Stabil attraktorok esetén könnyű meghatározni az attraktor egy pontját (elindítunk egy sorozatot az attraktor közeléből, és ami után elértük, azokat a pontokat amikkel csak megközelítettük eldobjuk), viszont labilis attraktorok esetén muszáj az attraktor egy pontját, azaz $F$ vagy $F^{-1}$ egy fixpontját kiválasztanunk.
668
+
669
+
```cpp
670
+
const int DEPTH = 100;
671
+
672
+
void generate_attractor(Complex c) {
673
+
// z = z^2 + c másodfokú egyenlet valamelyik gyöke
674
+
Complex z = get_starting_value(c);
675
+
676
+
for(n = 0; n < DEPTH; n++) {
677
+
if(VisibleInWindow(z)) {
678
+
pixel = WindowViewport(z);
679
+
image[pixel] = black;
680
+
}
681
+
// z = sqrt(z - c)
682
+
z = F_inverse(z, c);
683
+
684
+
// randomly choose pos or neg root
685
+
if (get_random_number(0, 1) > 0.5) z = -z;
686
+
}
687
+
}
688
+
```
689
+
690
+
Részletesebb magyarázathoz ajánlom az [előadásvideó ezen részét](https://youtu.be/4-5_UzT6SFQ?si=9OIrHGFQrlBpCLUV&t=2317).
653
691
654
692
## Mandelbrot halmaz
655
-
Azon c komplex számok, amelyekre a $z \mapsto z^2 + c$ Julia halmaza összefüggő.
656
693
657
-
Egy videó, ami ugyan kicsit szájbarágósan de szerintem élvezhetően elmagyarázza a komplex számokat és a Mandelbrot halmazt: [The Mandelbrot Set (Vsauce)](https://youtu.be/MwjsO6aniig?t=71)
694
+
Mandelbrot arra volt kíváncsi, hogy miért van az, hogy a Julia halmazok néhány $c$-re összefüggőek, bizonyos esetekben viszont meg különálló ponthalmazok. Definiált egy halmazt, ami azon $c$ komplex számokból áll, amelyekre az ahhoz tartozó Julia halmaz összefüggő.
658
695
659
-
Isten létezésének bizonyítása a Mandelbrot halmazzal (ennek mégkevesebb köze van az anyaghoz): [Proving God exists using Math](https://www.youtube.com/watch?v=z0hxb5UVaNE)
696
+
Ha a Mandelbrot halmazt ábrázoljuk a síkon, akkor több dolgot is tapasztalhatunk:
660
697
661
-
A 3D változata Mandelbulb néven ismert.
698
+
- az alakzat fraktális, tehát bármennyire is ráközelítünk nem egyszerűsödik le, végtelenségig új alakzatok és komplexitások tűnnek fel.
699
+
- nem önhasonló, tehát a végtelen komplexitás soha sem ismétlődik
662
700
701
+
Ha egy pontra "végtelenségig" rá tudnánk közelíteni, akkor a közvetlen környezetében a hozzá tartozó Julia halmaz jelenne meg. A Mandelbrot halmazt az emberiség által ismert legbonyolultabb geometriai alakzatnak tartják.
702
+
703
+
!!! info Érdekességek
704
+
Egy videó, ami ugyan kicsit szájbarágósan, de élvezhetően elmagyarázza a komplex számokat és a Mandelbrot halmazt: [The Mandelbrot Set (VSauce)](https://youtu.be/MwjsO6aniig?t=71)
705
+
706
+
Isten létezésének bizonyítása a Mandelbrot halmazzal (ennek még kevesebb köze van az anyaghoz): [Proving God exists using Math](https://www.youtube.com/watch?v=z0hxb5UVaNE)
707
+
708
+
A 3D változata "Mandelbulb" néven ismert.
709
+
710
+
Hogyan tudnánk mégis ábrázolni? Hát ha pusztán a definícióból indulunk ki, akkor elég nehezen. Szerencsére vannak egyszerűbb módszerek.
711
+
712
+
### Julia halmazok összefüggése
713
+
714
+
<!--
663
715
## ISF
664
716
665
717
ISF = Iterált Funkciós Rendszer
666
718
667
719
### Inverz feladat
720
+
668
721

669
722
670
723
Inverz feladat, tehát $H$ ismert és $F$-et szeretnénk.
0 commit comments