Skip to content

Commit 40d246a

Browse files
committed
feat: continue work on chapter 12
1 parent 3a6c767 commit 40d246a

2 files changed

Lines changed: 87 additions & 33 deletions

File tree

docs/notes/sem4/computer_graphics/12.md

Lines changed: 87 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -594,29 +594,30 @@ Mivel minden lépésben a $+$-os és a $-$-os ágat is végrehajtjuk, ezért az
594594
595595
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$.
596596
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.
598598
599-
$z_{n+1} = z_n^2 ~~\Rightarrow z_{n+1} = \pm \sqrt{z_n}$
599+
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?
600600
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.
602602
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:
604604
605-
Midőn $n \to \infin$:
606-
607-
$r_{n} = \sqrt[2^n]{r_0} \to 1$
605+
$$
606+
\begin{align}
607+
\theta_{2n} \approx 1.010 \ldots \cdot \pi = \frac{4 \pi}{3} \\
608+
\theta_{2n + 1} \approx 0.101 \ldots \cdot \pi = \frac{2 \pi}{3}
609+
\end{align}
610+
$$
608611
609-
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.
610613
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.
614615
615616
### Attraktorok felrajzolása
616617
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.
618619
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
620621
621622
$$
622623
z_{n+1}=z_{n}^2
@@ -630,46 +631,98 @@ $$
630631
631632
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|$.
632633
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!
642+
643+
![very_simple_julia](img/chapter_12/12_julia_very_simple.png)
644+
645+
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+
![julia halmaz](./img/chapter_12/12_julia.png)
656+
657+
Az $F'$ összes attraktorának halmazát _Julia halmaznak_ nevezik (ejtsd: \[zsúlia\]).
634658
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ó
640660
641-
## Julia halmaz
642-
$F: z \mapsto z^2 + c$
643-
Kölönböző $c$-k esetén:
644-
![](./img/chapter_12/12_julia.png)
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).
645662
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.
648664
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.
652666
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).
653691

654692
## Mandelbrot halmaz
655-
Azon c komplex számok, amelyekre a $z \mapsto z^2 + c$ Julia halmaza összefüggő.
656693

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ő.
658695

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:
660697

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
662700

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+
<!--
663715
## ISF
664716
665717
ISF = Iterált Funkciós Rendszer
666718
667719
### Inverz feladat
720+
668721
![alt text](./img/chapter_12/12_inverse_isf.png)
669722
670723
Inverz feladat, tehát $H$ ismert és $F$-et szeretnénk.
671724
672-
$F$ szabadon vezérelt, legyen stabil attraktora:
725+
$F$ szabadon vezérelt, legyen stabil attraktora:
673726
674727
$H = F(H) = W_1(H) \cup W_2(H) \cup W_3(H) \cup W_4(H)$
675728
@@ -687,6 +740,7 @@ Nem csak önhasonló objektumokhoz használjuk.
687740
688741
![alt text](./img/chapter_12/12_whatthefuckever.png)
689742
743+
-->
690744
---
691745

692746
!!! quote ""
47.6 KB
Loading

0 commit comments

Comments
 (0)