Obsah
1. Praktické ukázky možností aplikace Mandelbulber při tvorbě 3D fraktálů
2. Algoritmy použité při vykreslování trojrozměrných scén s fraktály a multifraktály
5. Fraktály bez spojitého povrchu versus klasický raytracing?
6. Distance estimation a algoritmus ray matchingu
7. Nastavení kamery při konfiguraci trojrozměrné scény
8. Vliv parametru „smoothness“ na výsledný vzhled vykreslovaného fraktálu
9. Změna tvaru fraktálu při změně počtu iterací (IFS apod.)
12. Animace založená na klíčových snímcích (keyframes)
13. Animace postupných změn dalších parametrů fraktálů
14. Převod jednotlivých snímků do souboru s animací
15. Vykreslení fraktálu typu Mandelbox v rovině (vylepšený příklad)
16. Repositář s demonstračními příklady
1. Praktické ukázky možností aplikace Mandelbulber při tvorbě 3D fraktálů
Na úvodní článek o aplikaci Mandelbulber navážeme článkem dnešním, v němž si popíšeme některé praktické způsoby použití této aplikace, a to jak při renderingu statických obrázků s trojrozměrnými fraktály, tak i při tvorbě jednoduchých animací, v nichž se mění jak pohled na fraktál, tak i popř. některé jeho parametry. Na rozdíl od předchozího článku, který byl v úvodní části pojat více teoreticky, se dnes zaměříme na ukázky grafického uživatelského rozhraní Mandelbulberu i na způsob jeho použití (zejména tvorba animací může být zpočátku poněkud matoucí).

Obrázek 1: Základní rozložení okna s grafickým uživatelským rozhraním programu Mandelbulber.
Nejprve si však vysvětlíme, jakými prostředky se vůbec trojrozměrné modely fraktálů vykreslují, protože vlastní algoritmy vykreslování se zcela odlišují od algoritmů, které známe z klasických dvourozměrných fraktálů, ať již se jedná o fraktály vykreslované v komplexní rovině, L-systémy či o systémy iterovaných funkcí (IFS). Problematika trojrozměrných fraktálů je v tomto ohledu poměrně rozsáhlá a navíc se ještě postupně vyvíjí, neboť vlastnosti 3D fraktálů jsou značně odlišné od běžných „spojitých“ trojrozměrných těles, s nimiž se běžně v počítačové grafice setkáváme.

Obrázek 2: Běžný fraktál vykreslený v komplexní rovině.
2. Algoritmy použité při vykreslování trojrozměrných scén s fraktály a multifraktály
Při vykreslování trojrozměrných fraktálů lze použít hned několik technik, které se od sebe liší kvalitou výsledku, rychlostí (resp. spíše pomalostí) vykreslování a taktéž nabídkou či naopak absencí dalších možností, například vytvoření řezu fraktálem, aplikací Booleovských operací na dvojici či trojici těles atd. atd. Dnes si popíšeme zejména metodu nazvanou integrace (barvy, průhlednosti) podél paprsku a samozřejmě i klasické renderovací metody raycastingu a raytracingu. Již na tomto místě je vhodné poznamenat, že Mandelbulber sice obě metody dokáže využít, ovšem navíc nabízí uživatelům i velké množství dalších voleb ovlivňujících vykreslování. O některých těchto volbách se zmíníme v dalším textu.

Obrázek 3: Další fraktál vykreslený v komplexní rovině.
3. Integrace podél paprsku
První důležitou a relativně často používanou metodou je metoda nazvaná integrace podél paprsku. Jedná se o v principu vlastně velmi jednoduše pochopitelnou metodu vycházející z rastrové objemové reprezentace prostorových objektů. Tento způsob reprezentace těles vznikl jednoduchým a přímočarým rozšířením dvourozměrných rastrových obrazů (bitmap resp. pixmap) do třech rozměrů. Část trojrozměrného prostoru je rozdělena na množství pravidelných elementárních objemových jednotek, které se nazývají voxely. Termín voxel přitom vznikl zkrácením anglického termínu Volume Element. Svou (na první pohled nelogickou) zkratkou – písmeno X ve slovním základu – ukazuje na svou podobnost s pixelem, což je zkratka termínu Picture Element. Původně spojitý trojrozměrný prostor se tedy diskretizuje na jednotlivé mikroobjemy, podobně jako je tomu v případě bitmap a pixmap u dvourozměrných obrazů, kde je původně spojitá plocha rozdělena na dále nedělitelné plošky (pixely).

Obrázek 4: Výsledek simulace vykreslený metodou integrace podél paprsku.
Pro účely zde popisovaných algoritmů můžeme za voxely poněkud nepřesně považovat osově orientované krychličky nebo kvádry, ve skutečnosti se však jedná o pouhé navzorkované bezrozměrné body, stejně jako pixely. V základní podobě, kdy potřebujeme pouze vyjádřit, zda daná část v prostoru náleží či nenáleží do tělesa, mohou voxely nabývat pouze dvou stavů – obsazeno, neobsazeno. Pro každý voxel tedy v tomto případě stačí zaznamenat pouze jeden bit, jehož hodnota signalizuje obsazenost či neobsazenost voxelu tělesem. Druhá možnost spočívá v záznamu počtu provedených iterací. To je právě případ zde popisované metody integrace podél paprsku. Jak tedy můžeme tuto metodu použít? Celý postup si můžeme shrnout do několika bodů:
- Nejprve je zapotřebí zvolit jednu dimenzi, která bude při vykreslování konstantní. Typicky se za konstantu volí poslední dimenze vztažená k jednotkovému vektoru k, není to však podmínkou (v Mandelbulberu je možné celým tělesem otočit, takže nejsme vázáni na osy souřadného systému).
- Vlastní vykreslování probíhá ve čtyřech do sebe vnořených smyčkách. V prvních třech vnějších smyčkách se postupně mění hodnoty čtyřrozměrné konstanty c=cx+cyi+czj+cwk. Postačují nám pouze tři smyčky, protože čtvrtá hodnota je zvolena v prvním bodu zpracování jako konstantní.
- Nejvnitřnější smyčka vykonává vlastní iterační výpočet. Výsledkem tohoto výpočtu je celočíselná hodnota říkající, kolik iterací bylo zapotřebí provést, aby se dosáhlo podmínky |z|>bailout. Pokud této podmínky nebylo dosaženo, tj. došlo k divergenci orbitu, je výsledkem nejvnitřnější smyčky hodnota odpovídající maximálnímu počtu iterací.
- Hodnota vrácená z iterační smyčky je vložena do trojrozměrného voxelového pole, které uchovává hustoty jednotlivých voxelů. Čím vyšší je uložená hodnota (vyšší počet iterací), tím větší je hustota v okolí daného voxelu.
- Výsledné zobrazení scény probíhá tak, že se zvolí souřadnice pozorovatele a promítací roviny. Posléze se od pozorovatele do scény vrhají paprsky (podobně jako u raytracingu popsaného v navazující kapitole). Na rozdíl od raytracingu se však nehledá průsečík s nějakým povrchem, ale sčítají se hustoty voxelů, které paprsek protne při svém průletu scénou. Rychlým algoritmem výpočtu průsečíků paprsku s voxely je například algoritmus DDA či Bresenhamův algoritmus pro 3D úsečku. Existují však i vylepšené metody, které dokážou spočítat délku paprsku při průletu jednotlivými voxel a výsledek je váhován touto (normalizovanou) délkou.
- Na základě vypočtené sumy hustot je obarven příslušný pixel na obrazovce. Výsledkem je tedy obrázek podobný rentgenovému či ultrazvukovému snímku. Předností tohoto postupu je, že se zobrazí i odlehlé části fraktálního objektu, nevýhodou pak fakt, že není zvýrazněn povrch a nelze zde použít klasické osvětlovací modely.
Nevýhodou tohoto postupu je fakt, že se vůbec nepočítají normály povrchu (žádný povrch se neuvažuje, pouze voxely s různou hustotou), takže není možné přímočaře použít osvětlovací modely.

Obrázek 5: Tepelné proudění, opět vykresleno metodou integrace podél paprsku.
4. Raytracing či raycasting
Mnohem častěji používanou vykreslovací metodou, která je sice mnohem pomalejší, ale vede ke kvalitnějším výsledkům, je metoda nazvaná raycasting popř. její jednodušší varianta pojmenovaná raycasting.
Raycasting neboli vrhání paprsků je často užívanou metodou pro vykreslení prostorových scén v případě, kdy nemáme k dispozici hardwarový akcelerátor nebo je scéna složená z těles, která se složitě převádí na polygony (může se jednat o implicitní plochy, uložení objemu ve formě voxelů atd.). Nejčastěji se můžeme s raycastingem setkat v různých programech typu CAD, které důsledně využívají CSG (Constructive Solid Geometry), neboli konstruktivní geometrii těles, což je způsob vytváření složitějších těles pomocí jednoduchých základních trojrozměrných tvarů (typicky koule, kužele, válce, toroidu a roviny/poloprostoru), které jsou navzájem kombinovány pomocí operací sjednocení, průniku a rozdílu.
Princip metody raycastingu je poměrně jednoduchý: představme si pozorovatele, který stojí před stínítkem představovaným plochou (rastrového) displeje, za kterým je umístěna celá sledovaná scéna, včetně světelných zdrojů. Jakým způsobem je možné scénu vykreslit tak, aby se zobrazila na stínítku ve formě různě obarvených pixelů? Způsobů je samozřejmě více, ovšem raycasting je postavený na jednoduché myšlence. Z pozice pozorovatele budeme do scény vysílat pomyslné paprsky a zjišťovat, která tělesa tyto paprsky protnou.
Pokud nebudeme brát v úvahu průhlednost těles, bude nás zajímat ten průsečík, který se nachází nejblíže k pozorovateli, protože ostatní průsečíky nejsou z jeho pozice viditelné (jsou skryté dalšími tělesy). Kolik paprsků se však má vysílat a jakým směrem? Základním principem (ne nutně s nejkvalitnějšími výsledky) je vyslat jeden paprsek pro každý pixel displeje, čímž je automaticky určen i jeho směr. Ovšem jsou možné i jiné způsoby, kterými se nyní nebudeme zabývat, abychom se nevěnovali nyní nepodstatným detailům.

Obrázek 6: Termín „fotorealistická grafika“ nevznikl náhodou…
Po výpočtu průsečíku paprsku s nejbližším povrchem je ještě nutné provést výpočet světelných poměrů v místě průsečíku. Vytvoří se tedy další pomyslné paprsky, které směřují k jednotlivým světelným zdrojům a zjišťuje se odchylka těchto paprsků od normálového vektoru popř. od odraženého paprsku (tvorba odlesků – „prasátek“). Také se zjišťuje, zda jsou vůbec světelné zdroje z daného místa viditelné, čímž se ve vykreslované scéně automaticky vytváří stíny. Může samozřejmě nastat situace, že primární paprsek neprotne žádné těleso – v tomto případě je příslušný pixel obarven nastavenou barvou pozadí.
Ukažme si na jednoduchém příkladu, jak výpočet průsečíku probíhá. Předpokládejme, že se ve scéně nachází jedna koule popsaná rovnicí:
(x-x0)2+(y-y0)2+(z-z0)2-r2=0
kde [x0, y0, z0] je souřadnice středu koule a r je její poloměr.
Výpočet průsečíku paprsku s koulí je poměrně snadný, což mimochodem výrazně urychlí všechny výpočty a tím i dobu zobrazování scény (proto byly obrázky s koulemi při prezentaci možností raytracingu velmi často používány). Pro zjištění, zda paprsek protíná kouli je potřeba zjistit přesnou pozici průsečíku paprsku s jejím povrchem. V rovnici paprsku:
R(t)=A+tq
- dva kořeny – paprsek kouli protíná, samozřejmě ve dvou místech
- jeden kořen – paprsek se koule pouze dotkl, tj. je tečný k povrchu
- žádný reálný kořen – paprsek kouli zcela minul
Velkým problémem zůstává potažení koule či jiného obecného tvaru texturou. Pro běžná tělesa se používá promítání textury z vhodně zvoleného tělesa. U koule není zcela zřejmé, které promítací těleso se má použít. Kvůli topologicky „nekompatibilnímu“ tvaru povrchu koule s tvarem plošné textury je však zřejmé, že textura bude nanesena s velkou chybou, především na vzniklých pólech. Tento problém nastává pouze u dvoudimenzionálních textur nanášených na povrch tělesa. U třídimenzionálních textur tento problém není zřetelný, což je jeden z důvodů, proč se například v POV-Rayi často pracuje s třídimenzionálními procedurálními texturami (v Mandelbulberu jsou použity oba typy textur).

Obrázek 7: Odlesky na kovu a skleněné povrchy byly vždy doménou raytracerů.
Raytracing, neboli zpětné sledování paprsku vznikl jednoduchým a přitom z hlediska vizuálních výsledků významným rozšířením předchozí metody. Sledování paprsku vrhaného od pozorovatele do scény totiž nekončí už po nalezení průsečíku s nejbližším tělesem, ale pokračuje sledováním dalších paprsků, odvozených podle odrazivosti a průhlednosti (přesněji řečeno lomových vlastností) nalezeného tělesa. Na barvě tělesa se tedy podílejí světelné příspěvky vypočtené s pomocí obecně většího počtu paprsků.
První test průsečíku (primárního) paprsku s plochou tělesa je proveden stejným způsobem jako u raycastingu. Jediný rozdíl spočívá v tom, že je po výpočtu průsečíku spočítán odraz a lom paprsku na povrchu tělesa a výpočet probíhá rekurzivně s dále vzniklými paprsky, které se nazývají sekundární paprsky. Hloubka rekurze musí být omezena, aby výpočet skončil v konečném čase. Pro reálné scény většinou postačí volit tři až čtyři odrazy. Už při této hloubce rekurze lze docílit fotorealistického zobrazení celé scény.
Při výpočtu světelných poměrů na povrchu tělesa potřebujeme znát orientaci normálového vektoru v místě průsečíku paprsku s povrchem. Problém potažení povrchu texturou je stejně složitý jako v metodě vrhání paprsku.
5. Fraktály bez spojitého povrchu versus klasický raytracing?
Výše zmíněné algoritmy raycastingu a raytracingu byly primárně vyvinuty pro ty trojrozměrné scény, v nichž jsou tělesa popsána nějakou implicitní funkcí, která by měla být v ideálním případě spojitá. Pouze při zajištění této podmínky je totiž možné zaručit, že bude možné vypočítat průnik paprsku s povrchem tělesa a navíc i určit normálový vektor v místě tohoto průniku. A znalost normálového vektoru je důležitá pro to, aby bylo možné vypočítat barvu plošky tělesa na základě nějakého osvětlovacího modelu (těch existuje větší množství typů, klasický osvětlovací model je založen na vyjádření světla na základě ambientní složky, difúzní složky a odlesků). Ovšem základní vlastností trojrozměrných fraktálů a multifraktálů je fakt, že jejich povrch vůbec spojitý není. Je tomu ve skutečnosti přesně naopak – na některých místech povrchu je zcela nespojitý, protože samotný povrch má větší dimenzi než 2.
Základní otázkou, kterou museli tvůrci programu Mandelbulber vyřešit je tedy určení, jakým způsobem se má reálný povrch fraktálu nahradit ve chvíli, kdy se počítá (renderuje) 3D scéna a jak vlastně určit průsečík paprsku s takovým složitým povrchem. Pro tento účel byly vyvinuty algoritmy nazvané Distance estimation (DE) a ray-matching.

Obrázek 8: Nástrojový pruh s výběrem typů fraktálů, které aplikace Mandelbulber dokáže vykreslit.
6. Distance estimation a algoritmus ray matchingu
Tyto metody se snaží zjistit průsečík paprsku s (mnohdy nekonečně komplikovaným) povrchem tak, že se na stopě paprsku tvoří pomyslné koule a zjišťuje se, zda tato koule protne alespoň určitou část prostoru či nikoli. Pokud k protnutí dojde, koule se zmenší a celý proces se iterativně opakuje. Nakonec se dojde do situace, kdy je koule dostatečně malá na to, aby se dalo prohlásit, že její průsečík s paprskem je současně i průsečíkem s „reálným“ povrchem fraktálu. Nevýhodou této metody je její časová náročnost a velká závislost na požadované přesnosti výpočtu.

Obrázek 9: Tento fraktál (zobecněný trojrozměrný IFS) budeme používat v dalším textu.
7. Nastavení kamery při konfiguraci trojrozměrné scény
Při tvorbě jakýchkoli trojrozměrných scén je klíčovým prvkem správné nastavení kamery takovým způsobem, aby se dívala na zajímavou oblast 3D prostoru. Nastavení kamery lze samozřejmě provést i v programu Mandelbulber a to několika způsoby. Základem je následující nemodální dialog:

Obrázek 10: Dialog, ve kterém je možné nastavit všechny základní parametry kamery, kromě její ohniskové vzdálenosti.
Další možnost spočívá v použití myši, kterou je možné ukázat na zajímavou oblast ve scéně. Myš pracuje v několika různým režimech – posun kamery (beze změny její orientace v prostoru), otočení kamery či přiblížení popř. naopak vzdálení kamery od scény. Implicitní volbou je první režim, ovšem velmi snadno můžeme kameru zamířit na oblast zvýrazněnou mřížkou:

Obrázek 11: Interaktivní nastavení kamery na zajímavou oblast ve scéně s využitím myši. Mřížka naznačuje vypočtený povrch fraktálu.

Obrázek 12: Po kliknutí se fraktál přiblíží a jsou vidět jeho další detaily.

Obrázek 13: Další detaily soběpodobného IFS systému.
8. Vliv parametru „smoothness“ na vzhled vykreslovaného fraktálu
Na výsledný vzhled vykreslovaného fraktálu má velký vliv parametr „smoothness“, který ovlivňuje algoritmus DE a ray matchingu. Po vypočtení průsečíku paprsku s povrchem se totiž určuje normálový vektor, a to s využitím okolního povrchu (fraktál není reprezentován implicitní plochou, kde je výpočet analytický, takže se používá numerický výpočet):

Obrázek 14: Zvýrazněné vstupní pole, v němž se parametr „smoothness“ může měnit.
Čím vyšší je hodnota tohoto parametru, tím „zakulacenější“ bude povrch fraktálu, ovšem tím méně detailů bude zvýrazněno (můžeme si představit i 2D analogii tohoto parametru – rozmazání obrázku).

Obrázek 15: Parametr smoothness je nastavený na implicitní hodnotu 1.

Obrázek 16: Parametr smoothness je nastavený na implicitní hodnotu 16.
U dalších obrázků je výhodnější si je zobrazit v jejich původní velikosti, aby byly jednotlivé rozdíly dobře patrné:

Obrázek 17: Parametr smoothness je nastavený na implicitní hodnotu 1.

Obrázek 18: Parametr smoothness je nastavený na implicitní hodnotu 2.

Obrázek 19: Parametr smoothness je nastavený na implicitní hodnotu 4.

Obrázek 20: Parametr smoothness je nastavený na implicitní hodnotu 8.

Obrázek 21: Parametr smoothness je nastavený na implicitní hodnotu 0,625.
9. Změna tvaru fraktálu při změně počtu iterací (IFS apod.)
Velký vliv na tvar a vzhled fraktálu má i změna počtu iterací, což se týká především zobecněných trojrozměrných systémů iterovaných funkcí (IFS). Čím menší je totiž počet iterací, tím menší počet bodů v 3D prostoru je vypočten a algoritmus konstrukce fraktálu tedy ideální geometrické body zvětší takovým způsobem, aby se z nich staly koule, které se překrývají. To znamená, že velký počet iterací zvýší počet bodů, které budou velmi malé a fraktál se začne podobat své ideální podobě:

Obrázek 22: Počet iterací je nastaven na hodnotu 6.

Obrázek 23: Počet iterací je nastaven na hodnotu 7.

Obrázek 24: Počet iterací je nastaven na hodnotu 8.

Obrázek 25: Počet iterací je nastaven na hodnotu 9.

Obrázek 26: Počet iterací je nastaven na hodnotu 10.
10. Editor materiálů
Zapomenout nesmíme na velmi důležitou součást aplikace Mandelbulber. Jedná se o editor materiálů. Vzhledem k tomu, že se díky rayracingu kombinovaného s metodami DE a ray matchingu při vykreslování vypočte i normálový vektor k povrchu fraktálu (jakkoli je to matematický nesmysl), je možné využít klasické osvětlovací modely a tím pádem i určovat ambientní, difúzní a odrazovou složku materiálu. Bližší informace o takto pojatých materiálech a osvětlovacím modelu jsme si vysvětlili v seriálu o raytraceru POVRay.

Obrázek 27: Základní materiál s několika (konkrétně šesti) gradientními barvovými přechody.

Obrázek 28: Materiál připomínající plast (velký vliv difúzní složky, málo odlesků).

Obrázek 29: Toto má být napodobenina bronzu (i když to tak zdálky nemusí vypadat).

Obrázek 30: Další materiál s několika gradientními barvovými přechody.
11. Tvorba animací
Již v úvodním článku o aplikaci Mandelbulber jsme si řekli, že kromě statických snímků je možné vytvářet i animace. Existují přitom dva způsoby tvorby animací. První z nich, který se jmenuje Flight Mode, spočívá v tom, že se myš použije pro okamžitou změnu souřadnic kamery, podobně jako v některých počítačových hrách při řízení letadla (FPS). Mandelbulber se v tomto případě snaží o rychlé (resp. většinou pouze „rychlé“) vygenerování snímků tak, aby vznikla plynulá animace. Ovšem výpočetní výkon současných strojů dostačuje pouze pro vyrendrování animací s velmi nízkým rozlišením, například jen 320×240 pixelů nebo dokonce pouze 160×120 pixelů.
Při zapnutí flight režimu se směr letu řídí posunem myši (bez tlačítek), ovšem kurzorovými šipkami je navíc možné posunovat vlastní pozici kamery. Levé a pravé tlačítko myši v tomto režimu slouží k urychlení popř. naopak ke zpomalení letu. Jiné parametry není možné změnit – jinými slovy se flight režimu používá skutečně pro animaci průletu okolo fraktálu nebo do jeho vnitřních struktur.
12. Animace založená na klíčových snímcích (keyframes)
Druhý režim tvorby animací je již mnohem pokročilejší. Je založen na vytvoření takzvaných klíčových snímků (keyframes), mezi nimiž jsou automaticky dopočítány parametry mezisnímků, kterých může být libovolný počet (například třicet mezisnímků mezi každým klíčovým snímkem). Tento typ animací lze vytvářet velmi precizním způsobem, protože pozice kamery a její orientaci, stejně jako další parametry vykreslovaného fraktálu, je možné nastavit bez nutnosti sledovat neustále se překreslující snímky, jak je tomu ve flight režimu. Ve výchozím stavu se zaznamenává pozice a orientace kamery, tj. i tento typ animace se používá pro podobné účely jako režim flight. Takto byla vytvořena následující animace ze čtyř klíčových snímků:

Obrázek 31: Dialog s jednotlivými mezisnímky a jejich vlastnostmi.
13. Animace postupných změn dalších parametrů fraktálů
Ve skutečnosti je ovšem možné animaci vytvořit změnou prakticky jakéhokoli číselného parametru, ať již se jedná o nastavení rendereru nebo parametrů fraktálu. Nelze měnit, resp. nemá to význam, například typ fraktálu nebo ty parametry, které mají pouze předem známý počet stavů.

Obrázek 32: Animace IFS systému založená na pouhých dvou mezisnímcích, mezi nimiž se provádí lineární interpolace.
14. Převod jednotlivých snímků do souboru s animací
Mandelbulber při počítání animací tvoří jednotlivé snímky, které mohou být uloženy v několika různých rastrových formátech. Typicky se používají formáty JPEG nebo PNG. Tyto statické snímky je nutné složit do výsledné animace, k čemuž je možné použít hned několika různých nástrojů ovládaných jak z příkazové řádky, tak i z grafického uživatelského rozhraní. Mezi nejpoužívanější nástroje ovládané z CLI patří ffmpeg a mencoder.
Převod do formátu MPEG4 s využitím nástroje MEncoder (součást nástrojů MPlayeru):
mencoder mf://*.png -mf w=320:h=240:fps=10:type=png -ovc lavc \ -lavcopts vcodec=mpeg4:mbd=2:trell -oac copy -o output.avi
Použití nástroje ffmpeg:
ffmpeg -r 60 -f image2 -s 320x200 -i frame%04d.png -vcodec libx264 -crf 25 -pix_fmt yuv420p test.mp4
Výsledek je možné publikovat například na https://www.youtube.com/. Právě tímto způsobem budou prezentovány výsledky Mandelbulberu ve třetí a současně i poslední části tohoto článku.
15. Vykreslení fraktálu typu Mandelbox v rovině (vylepšený příklad)
Vzhledem k zaměření Rootu mj. i na programátory se v dnešním článku podíváme ještě na jednoduchý prográmek, který po svém překladu a spuštění vykreslí 2D fraktál typu Mandelbox, přičemž výsledný obrázek je reprezentován ve formátu PGM. Jednotlivé parametry fraktálu je pochopitelně možné změnit a prvním vylepšením pravděpodobně bude podpora pro barovou paletu:
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #define WIDTH 400 #define HEIGHT 400 void writeImage(const int width, const int height, const unsigned char *image) { int i; puts("P2"); printf("%d %d\n", width, height); puts("255"); for (i=0; i<width*height; i++) { printf("%d ", image[i]); } } void toLogarithmicScale(const int width, const int height, unsigned char *pixels, const float *floatPixels, const float max) { int i; for (i = 0; i < WIDTH*HEIGHT; i++) { if (floatPixels[i] == -1) { pixels[i] = 0x00; } else { int val = (int)(log(floatPixels[i])/log(max)*255); pixels[i] = val; } } } void calcMandelbox(const int width, const int height, float *floatPixels, const int maxiter, float *max) { float cx, cy; float zx, zy; float magnitude, squared; int i, j, n; cy = -4.0; for (j = 0; j < height; j++) { cx = -4.0; for (i = 0; i < width; i++) { float zx = 0, zy = 0; for (n = 0; n < maxiter; n++) { if (zx>1.0) { zx = 2.0-zx; } else if (zx<-1.0) { zx = -2.0-zx; } if (zy>1.0) { zy = 2.0-zy; } else if (zy<-1.0) { zy = -2.0-zy; } float zx2 = zx * zx; float zy2 = zy * zy; squared = zx2 + zy2; magnitude = sqrt(squared); if (squared > 256.0) { break; } if (magnitude < 0.5) { zx = zx * 8.0 * magnitude; zy = zy * 8.0 * magnitude; } else if (magnitude < 1.0) { zx = zx * 2.0 / (magnitude*magnitude); zy = zy * 2.0 / (magnitude*magnitude); } else { zx = zx * 2.0 * magnitude; zy = zy * 2.0 * magnitude; } zx += cx; zy += cy; zx2 = zx * zx; zy2 = zy * zy; squared = zx2 + zy2; } if (squared > *max) { *max = squared; } if (n == maxiter) { floatPixels[i+j*WIDTH] = squared; } else { floatPixels[i+j*WIDTH] = -1; } cx += 8.0 / WIDTH; } cy += 8.0 / HEIGHT; } } int main(int argc, char **argv) { char pixels[WIDTH * HEIGHT]; float floatPixels[WIDTH * HEIGHT]; float max = 0; calcMandelbox(WIDTH, HEIGHT, floatPixels, 4, &max); toLogarithmicScale(WIDTH, HEIGHT, pixels, floatPixels, max); writeImage(WIDTH, HEIGHT, pixels); return 0; }

Obrázek 33: Obrázek vykreslený předchozím příkladem při použití standardních parametrů.

Obrázek 34: Obrázek vykreslený předchozím příkladem při úpravě parametrů výpočtu.
16. Repositář s demonstračními příklady
Zdrojové kódy dvoudimenzionálních variant fraktálů typu MandelBox a MandelBulb naprogramované v jazyce C byly uloženy do Git repositáře, který je dostupný na adrese https://github.com/tisnik/fractals.git (stále na GitHubu :-). V případě, že nebudete chtít klonovat celý repositář (ten je ovšem – alespoň prozatím – velmi malý, můžete namísto toho použít odkazy na jednotlivé příklady, které naleznete v následující tabulce:
# | Příklad | Popis příkladu | Cesta |
---|---|---|---|
1 | mandelbox.c | 2D varianta fraktálu typu MandelBox | https://github.com/tisnik/fractals/blob/master/3d_fractals/mandelbox.c |
2 | mandelbox2.c | vylepšení předchozího příkladu | https://github.com/tisnik/fractals/blob/master/3d_fractals/mandelbox2.c |
3 | mandelbox3.c | předchozí příklad, ovšem s odlišnými parametry | https://github.com/tisnik/fractals/blob/master/3d_fractals/mandelbox3.c |
4 | mandelbulb_2d.c | 2D varianta fraktálu typu MandelBulb | https://github.com/tisnik/fractals/blob/master/3d_fractals/mandelbulb_2d.c |
5 | mandelbulb_anim.c | vytvoření animace fraktálu typu MandelBulb | https://github.com/tisnik/fractals/blob/master/3d_fractals/mandelbulb_anim.c |
17. Literatura
Klasické knihy i vybrané články o fraktálech:
- Barnsley Michael: „Fractals Everywhere“,
Academic Press Inc., 1988, ISBN 0–12–079062–9 - Barnsley Michael, Devaney R. L., Mandelbrot Benoit B., Peitgenn Heinz-Otto, Saupe Dietmar, Voss Richard: „The Science of Fractal Images“,
Springer-Verlag, New York, 1988 - Barnsley Michael, Hurd Lyman P.: „Fractal Image Compression“,
A. K. Peters, 1993 - Bowman Richard L.: „Fractal Metamorfosis: A Brief Student Tutorial“
Computer and Graphics, 19, strany 157–164, 1995 - Bulín Jan: „Vykreslování výškových map“,
Ročníkový projekt, VUT Brno, FEI, 1998 - Cahalan R. F. a Joseph J. H.: „Fractal statistics of cloud fields“,
Mon. Wea.Rev. 117, 261–272, 1989 - Cahalan R. F., W. Ridgway, W. J. Wiscombe, T. L. Bell and J. B. Snider: „The albedo of fractal stratocumulus clouds“,
Atmos. Sci. 51, 2434–2455, 1994 - Devaney Robert L.: „A First Course In Chaotic Dynamical Systems“,
Addison-Wesley, Reading, MA, 1992 - Dewdney A. K: „Computer Recreations“,
časopis Scientific American - Douady, A., Hubbard, J.: „Itération des polynomes quadratiques complexes“,
C. R. Acad. Sci., Paris 1982
- Etienne Martineau: „On a Bicomplex Distance Estimation for the Tetrabrot“
June, 2004 - Ewing, J. H., Schober, G.: „The area of the Mandelbrot Set“,
Numer. Math. 1992 - Fischer Yuval (editor): „Fractal Image Compression: Theory and Application“,
Springer-Verlag, New York, 1995 - Gleick James: „Chaos: Making a New Science“,
Viking Press, Penguin, New York, 1987 - Gleick James: „Chaos: Vznik nové vědy“ (český překlad předchozí knihy),
Ando Publishing, Brno, 1996 - Gröller Eduard: „Interactive design of Nonlinear Functions for Iterated Function System“,
Technical University Vienna, 1995 - Hill, F. S. jr.: „Computer Graphics using OpenGL“,
Prentice Hall, 2001 - Hook Brian: „An Introduction to Fixed Point Math“,
Game Design and Review, 2003 - Lauwerier Hans: „Fractals“,
Princeton University Press, 1991 - Makovský Dušan: „Stochastické fraktály“,
Diplomová práce, VUT FIT Brno, 2003
- Mandelbrot Benoit B.: „The Fractal Geometry of Nature“,
W. H. Freeman, New York; San Francisco, 1982, ISBN 0–7167–1186–9 - Mandelbrot Benoit B.: „Fractal Landscapes without creases and with rivers“,
The Science of Fractal Images, ed. Heinz-Otto Peitgen, Dietmar Saupe; Springer-Verlag (1988) pp 243–260 - Peitgen Heinz-Otto, D. Saupe: „The Science of Fractal Images“,
Springer-Velag, 1988 - Peitgen Heinz-Otto, Jurgens Hartmut, Saupe Dietmar: „Fractals For The Classroom“,
Springer-Verlag, New York, 1988 - Peitgen Heinz-Otto, Richter Peter: „The Beauty of Fractals“,
Springer-Verlag, New York, 1986, ISBN 0–387–15851–0 - Peitgen Heinz-Otto, Jurgens Hartmut, Saupe Dietmar: „Chaos and Fractals: New Frontiers of Science“,
Springer-Verlag, New York, 1992 - Perlin K. and Hoffert E. M.: „Hypertexture“,
Computer graphics, Volume 23, Number 3, July 1989, pages 253–262 - Perlin Ken: „An Image Synthesizer“,
Computer Graphics, Volume 19, Number 3, 1985, pages 287–296 - Pickover Clifford: „Computers, Pattern, Chaos and Beauty: Graphics from an Unseen World“,
St. Martin's Press, New York, 1990 - Pickover Clifford: „Chaos in Wonderland“,
ISBN 0–312–10743–9 St. Martin's Press
- Pritchard Joe: „The Chaos Cookbook: A Practical Programming Guide“,
Butterworth-Heinemann, Oxford, 1992, ISBN 0–7506–0304–6 - Prusinkiewicz Przemyslaw and Hanan James: „Lindenmayer Systems, Fractals, and Plants“,
Springer-Verlag, New York, 1989. - Prusinkiewicz Przemyslaw and Lindenmayer Aristid: „The Algorithmic Beauty of Plants“,
Springer-Verlag, NY, 1990. ISBN 0–387–97297–8 - Sharman, J: „How to render landscapes“
- Silverman B. W.: „Density Estimation for Statistics and Data Analysis“,
Chapman and Hall, London, 1986. - Tišnovský Pavel: „Návrh editoru IFS“,
Vysoké učení technické v Brně, Fakulta elektrotechniky a informatiky, 1998 - Tišnovský Pavel: „Interaktivní editor afinních transformací“,
Vysoké učení technické v Brně, Fakulta elektrotechniky a informatiky, 1999 - Tišnovský Pavel: „Výpočet plochy Mandelbrotovy množiny metodou součtu pixelů“,
Elektrorevue, 2001 - Tišnovský Pavel: „Fraktály: dynamické systémy v komplexní rovině“,
Elektrorevue, 2001 - Tumblin Jack, Holly Rushmeier: „Tone Reproduction for Realistic Images“,
IEEE Computer Graphics and Applications, November/December 1993 (Vol. 13, No. 6) pp. 42–48.
- Weber J., Penn J.: „Creation and Rendering of Realistic Trees“,
Proceedings of SIGGRAPH '95, volume 22(4), ACM SIGGRAPH, New York, 1995 - Wegner Timothy, Peterson Mark: „Fractal Creations, First Edition“,
The Waite Group Press, 1991 - Wegner Timothy, Tyler Bert: „Fractal Creations, Second Edition“,
The Waite Group Press, 1993 - Wegner Timothy, Tyler Bert, Peterson Mark, Branderhorst Pierer: „Fractals for Windows“,
The Waite Group Press, 1992 - Yates Randy: „Fixed-Point Arithmetic: An Introduction“
- Žára J., Beneš B., Felkel P.: „Moderní počítačová grafika“,
Computer Press, Praha, 1998, ISBN 80–7226–049–9 - Žára J., Limpouch A., Beneš B., Werner T.: „Počítačová grafika – principy a algoritmy“,
Grada, 1992
18. Odkazy na Internetu
- Mandelbulber – creating animations
https://sites.google.com/site/mandelbulber/getting-started - MandelbulberTutorial & User Manual Version: 0.9.1
http://cdn.mandelbulber.org/doc/Mandelbulber_Manual_v091.pdf - AppImage
https://appimage.org/ - Stránka aplikace Gnofract 4D
http://edyoung.github.io/gnofract4d/ - Repositář aplikace Gnofract 4D
https://github.com/edyoung/gnofract4d - Multifractal system
https://en.wikipedia.org/wiki/Multifractal_system - What are Multifractals?
https://imagej.nih.gov/ij/plugins/fraclac/FLHelp/Multifractals.htm - Multifractal vs Fractal – What's the difference?
https://wikidiff.com/multifractal/fractal - Mandelbulb
http://www.mandelbulb.com/ - Mandelbulber Fractal Rendering Software
http://www.mandelbulb.com/2012/3d-fractal-rendering-mandelbulber/ - Mandelbulber na Sourceforge
https://sourceforge.net/projects/mandelbulber/ - Mandelbulb 3D (MB3D) Fractal Rendering Software
http://www.mandelbulb.com/2014/mandelbulb-3d-mb3d-fractal-rendering-software/ - Mandelbox (Wikipedia)
https://en.wikipedia.org/wiki/Mandelbox - Gallery of Mandelbox fractals
https://sites.google.com/site/mandelbox/ - Mandelbulb (Wikipedia)
https://en.wikipedia.org/wiki/Mandelbulb - Cygnus software: „Fractal eXtreme (fractal generator for Windows)“,
http://www.cygnus-software.com
We think that if you give Fractal eXtreme a try, you will soon decide that Fractal eXtreme's unique combination of speed, power, and intuitive interface make it your best choice for exploring the wonders of fractals. - Devaney Bob: „Dynamical systems and Iterated Function Systems“,
http://math.bu.edu/people/bob/
Bob Devaney's Home Page - Gintz Terry W.: „Zplot (fractal generator)“,
http://www.mysticfractal.com/FractalZplot.html
Fractal Zplot is an interactive program for generating fractal images. Originally named Zplot, this program has been in continuous development since 1989. Fractal Zplot currently supports the Mandelbrot set, Julia sets, Newton's method, and Phoenix curves, with millions of mapping variations. 3D fractal types include quaternion, hypercomplex, orbital fractals and lsystems, in addition to the original height field and landscape types. - Hubička Jan: „Stránky programu XaoS“,
http://xaos.sourceforge.net/english.php
Welcome to the redesigned web portal of XaoS. Here we offer up-to-date information about the XaoS project, the development issues and others. - Hubička Jan: „Starší (a IMHO hezčí) verze stránek programu XaoS“,
http://xaos.sourceforge.net/black/index.php
XaoS is a fast portable real-time interactive fractal zoomer. It displays the Mandelbrot set (among other escape time fractals) and allows you zoom smoothly into the fractal. Various coloring modes are provided for both the points inside and outside the selected set. In addition, switching between Julia and Mandelbrot fractal types and on-the-fly plane switching is provided. The first version was a minimal X Window Mandelbrot viewer by Thomas later modified by Jan to support high frame-rate zooming. Other additions were later made by both Thomas and Jan including autopilot (for those of you without drivers licenses), palette changing, GIF saving, and fractal inversion. - Chardonnet David: „IFS Fractals Digital Encyclopedy“,
http://www.chez.com/fractals/galeries/gb_index.html - Jones Damien M. a kol.:„Fractalus“,
http://www.fractalus.com
fractalus.com exists to showcase fractal art, provide information about fractals, and promote fractals in general. We (the artists who build and maintain this site) want to show you our very best; we create this art because we love to do it. We're happy to share this with you, but we would appreciate it if you would respect our wishes regarding image re-use and copyrights. - Kolka Milan: „Spojování želv v jazyce založeném na L-systémech“,
http://www.elektrorevue.cz/clanky/01010/index.html
Článek představuje programovací jazyk Fraktálovač, který je určen ke generování fraktálů. Jazyk je založen na Lindenmayerových systémech (L-systémech). Zejména je zde ukázán princip spojování želv, který rozšiřuje možnosti klasických L-systémů. - Lartigue Ghislain: „Hydrodynamical Instabilities: The Iterative Function System“,
http://www.enseeiht.fr/hmf/travaux/CD9900/travaux/optmfn/hi/00pa/mfn11/pa01.htm
The aim of this hands-on was to study a dynamical system. I have choosen to deal with a particular class of these systems which are the Iterative Function System (IFS). These systems are not really what one could call a „pure“ dynamical system. Actually, all the systems we have studied so far can be written X'=F(X,t), that is to say that the derivative of a given set of variables X=(x1,…,xn) can be expressed as a function of this set X and of the time (for the non-autonomous systems). Thus, the whole evolution of the system is perfectly deterministic and actually, is totally determined by the initial condition X(0). However, it is well known that in many cases, the evolution of a system can become chaotic and then, the sensibility to the initial conditions can give the impression that the system follows a random trajectory. But one should still remember that this is just an illusion which is the consequence of our finite precision knowing of the initial condition. - Pulcini Giovambattista, Verrando, Meloni Rossi: „IFS: Fractal Image Compression“,
http://mathforum.org/library/view/6165.html
Download IFS Application Framework, a freeware educational program for fractal image coding. Note: It needs 486DX2/66, 8MB RAM, Windows 3.1 with a 11MB swapfile and a 32000 SVGA driver (at least). Download IFSDOC, an introduction to IFS and IFSAF (in Postscript format). A more detailed description of IFSAF is also available. - Pulcini Giovambattista: „Fractal Image Compression Software (for Windows)“,
http://www.verrando.com/pulcini/gp-ifs1.html
IFSAF: IFS Application Framework is a software running under Windows 3.x for fractal image encoding. It has some bugs, makes no control on what you are doing, so it crashes frequently, is not a well-behaved window application: it monopolizes the CPU until the enc/dec is over, but shows graphically each step of the computation, so may be a valuable choise for the beginners in this field.Besides, it is a powerful framework, for testing several different algorithms, andoptions. - Scott Draves: „The Fractal Flame Algorithm“,
http://flam3.com/flame_draves.pdf, May 18, 2005 - Slijkerman Frederik: „Ultra Fractal (fractal generator for Windows)“,
http://www.ultrafractal.com
Ultra Fractal is the best tool to create fractal artwork and fractal animations. Whether you are a graphics designer, a professional fractal artist, a video producer, or a complete beginner, Ultra Fractal 4 makes it easy to create beautiful fractal pictures, animated textures, and moving fractal backgrounds. - Thornton Sterling: „XenoDream (Interactive IFS Editor)“,
http://xenodream.com
XenoDream is a 3-D graphics program that combines standard shapes with 3-D IFS fractal methods for interactive modeling with a difference. Browse through our galleries for some examples, and the XenoDream pages to learn more. - Tyler Bert, Wegner Tim a kol.:
„Fractint (fractal generator for DOS, Windows and Unix)“,
http://www.fractint.org
Fractint is a freeware fractal generator created for IBMPC's and compatible computers to run under DOS and ported to Linux. This page is for developers who wish to keep up with the latest source changes and users who would like to try the current developer's version. This page is under development by a one-finger typist entering html in a text editor, so it may not get much fancier than this for a while. - Mandelbrot Explorer (prohlížeč Mandelbrotovy množiny jako jednoduchá webová aplikace):
http://www.softlab.ece.ntua.gr/miscellaneous/mandel/mandel.html