IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

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útna hodnota komplexného čísla - Grafické algoritmy
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)
S výpočtom druhej mocniny Z je to málinko zložitejšie. Z 2 môžeme vyjadriť ako súčin Z * Z, čiže súčin dvoch komplexných čísel, pre ktorý platí všeobecný vzorec:

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

mandelbrotova množina - Grafické algoritmy

Zdrojový kód a ukážkový program

Môžete sa pozrieť na ukážkový program Mandelbroth vrátane zdrojového kódu


 

Všetky články v sekcii
Grafické algoritmy
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity