Mandelbrotova množina
Na mandelbrotova množina narazil Benoid Mandelbrot v 70. rokoch minulého storočia, pri skúmaní Juliových množín. Pokúšal sa zostaviť akýsi ich katalóg. Ale rozhodne nebol jej objaviteľom. V rovnakej dobe (kúsok pred Mandelbrot) bol na matematickej konveci predstavený článok od Brooksa a Matelskiho, ktorý tiež obsahoval obrázky mandelbrotova množina. Mandelbrot ju však dôkladne opísal a prvenstvo pripadlo jemu. Niektorí z vás možno začuli správy o starodávnej rytine prisudzované starodávnemu umelci Udo von Aachen, ktorá údajne obsahovala mandelbrotova množina, schovanú v obrazu. Tie ale bohužiaľ musím sklamať - jedná sa samozrejme o hoax
Ale teraz k tomu, čo to Mandelbrot množina vlastne je. Je to fraktál ležiace v komplexnej rovine a to v rozmedzí [-2; -2] do [2; 2] (hranatými zátvorkami značím komplexné číslo). Je to zrejme Najznámejšie fraktál vôbec. Je vyjadrená vzorcom Z = Z 2 + C, kde Z a C sú komplexné čísla. C je konštantná a je pozíciou bodu, pre ktorý koeficient Z počítame. Z je na začiatku [0; 0]. Z budeme počítať iteračné, to znamená, že budeme výpočet Z = Z 2 + C vykonávať tak dlho, kým nám nedôjde nami stanovený počet pokusov (napríklad 20) alebo sa splní podmienka, že skúšaný bod neleží v množine. Táto podmienka znie: | Z | > 2 (absolútna hodnota Z je väčšia ako 2). Ak nám dôjdu pokusy a podmienka sa nesplnila, vyfarbíme bod čierno (bod do množiny patrí). Ak dôjde k tomu, že | Z | > 2, bod zafarbíme. Pre začiatok ho môžeme zafarbiť treba bielo. Ak by sme chceli krajšie obrázok, môžeme bod vyfarbiť napríklad modro a odtieň určiť podľa toho, koľko pokusov bolo potrebné k tomu, aby sme zistili, že v množine neleží. Tejto variácie som využil ja. Potom tu je ešte rad paliet (vzorcov), pre ešte zaujímavejšie zafarbenie.
Postup pri vykreslenie
Vzorec Z = Z 2 + C musíme aplikovať na všetky body v množine. Tá je v rozsahu X od -2 do 2 a Y tiež od -2 do 2. Budeme teda potrebovať 2 do seba vnorené cykly a 2 celočíselné premenné X a Y, ktore nám tieto body "prejdú" (podľa veľkosti výrezu, napr 0. .799 a 0..599).
Určíme si nejaký počet pokusov (iterácií) na vyskúšanie, či práve testovaný bod do množiny patrí alebo nie. Vytvoríme teda premennú alebo konštantu maxiter, ktoré priradíme 20. Ďalej nejaké počítadlo pokusov, ktoré si nazveme iter. K samotnému testu bodu budeme potrebovať komplexné číslo Z, ktoré pred každým pokusom vynulujeme, komplex. číslo C (reálna a imaginárna časť budú premenné X a Y, pretože C je pozícia bodu v množine) a ďalej absolútnu hodnotu Z a Z 2.
Absolútnu hodnotu komplexného čísla spočítame použitím Pytagorovej vety,
pretože absolútna hodnota vzdialenosť čísla od nuly.
čiže:
Z | ^ 2 = Zr 2 + Zi 2 |
Z | = Odmocnina (Zr 2 + Zi 2) |
(A + Bi) * (C + Di)
AC + BCI + ADi + BDI 2 (i 2 = -1)
Re = AC - BD (reálna časť násobku)
Im = BCI + ADi (imaginárna časť násobku)
V našom prípade sú hodnoty:
A = Zr
B = Zi
C = Zr
D = Zi
A po dosadení:
Re = Zr 2 - Zi 2
Im = Zi * Zr + Zi * Zr = 2 * Zi * Zr
Takže cykly X a Y prejdeme všetky body množiny. Pre každý bod vynulujeme číslo Z, do C dosadíme [X; Y] a počítadlo iterácií tiež vynulujeme. Spočítame si Z 2 (pozri vyššie) a do Z dosadíme [Z 2 + C]. Spočítame si absolútnu hodnotu Z a ak je väčší ako 2, skončíme a bod zafarbíme príslušnou farbou. Ak nie, zvýšime iter o jedna a ideme znovu. Ak vyplytváme všetky pokusy a podmienka sa stále nesplní, zafarbíme bod čierno.
Výsledok sa základným sfarbením vyzerá asi takto:
Zdrojový kód a ukážkový program
Môžete sa pozrieť na ukážkový program Mandelbroth vrátane zdrojového kódu