Hlavní navigace

Čtyřrozměrné fraktály a GNU aplikace Quat

13. 2. 2007
Doba čtení: 10 minut

Sdílet

Dnešním pokračováním seriálu o fraktálech se již blížíme k dokončení poměrně rozsáhlé části věnované čtyřrozměrným fraktálům vytvářeným pomocí hyperkomplexní a kvaternionové algebry. Řekneme si, jakým způsobem se používá aplikace Quat, pomocí které se tyto fraktály dají vytvářet a interaktivně editovat.

Obsah

1. Čtyřrozměrné fraktály a aplikace Quat
2. Způsob práce aplikace Quat
3. Specifikace parametrů čtyřrozměrné Juliovy množiny
4. Nastavení pohledu na původně čtyřrozměrný fraktální objekt
5. Barevné přechody (gradient), transformační funkce barev
6. Editace ořezávacích rovin
7. Nastavení rozlišení, antialiasingu a osvětlovacího modelu
8. Obsah dalšího pokračování tohoto seriálu

1. Čtyřrozměrné fraktály a aplikace Quat

Aplikace Quat je jednou z mála úspěšných a snadno použitelných aplikací určených pro práci se čtyřrozměrnými Juliovými množinami. Na rozdíl od raytraceru POV-Ray, který také podporuje vykreslování 4D Juliových množin, je vykreslování v programu Quat založeno na odlišném principu, z čehož také vyplývají dále zmíněné přednosti a nedostatky. Quat na některých platformách disponuje grafickým uživatelským rozhraním, ve kterém je možné nastavit parametry čtyřrozměrné Juliovy množiny, způsob obarvení povrchu výsledného fraktálního objektu, přidávat, ubírat i modifikovat ořezávací roviny, specifikovat vlastnosti povrchu s využitím Phongova osvětlovacího modelu atd. V novějších verzích tohoto programu je podporováno i vykreslování přes samostatný Z-buffer (významné urychlení některých operací) a také antialiasing, který je právě u obrázků čtyřrozměrných fraktálů vhodné provádět, aby se povrch vykreslovaného objektu zbavil všech vizuálních chyb a nespojitostí.

fractals67_1
Obrázek 1: Objekt vykreslený v programu Quat

Tento program je dostupný ve dvou variantách (http://www.phys­cip.uni-stuttgart.de/phy11733­/quat_e.html). První varianta nabízí plnohodnotné grafické uživatelské rozhraní (GUI), druhá varianta komunikuje výhradně přes příkazový řádek (to se hodí například při paralelním spouštění výpočtů na více počítačích). Program Quat je možné používat na velkém množství platforem. Variantu s grafickým uživatelským rozhraním je možné používat jak na Linuxu (zde se spouští příkazem quat, dřívější verze většinou příkazem xquat), tak i na operačních systémech Microsoft Windows (program quatwin) a pravděpodobně i na dalších operačních systémech, které jsou podporovány použitou GUI knihovnou FLTK.

Variantu spouštěnou z příkazového řádku lze přeložit prakticky na jakékoli platformě disponující třicetidvoubitovým překladačem programovacího jazyka C. To zahrnuje i platformu DOS, pro kterou existuje Quat autorem oficiálně přeložený pomocí DJGPP (GCC pro DOS); teoreticky je možné Quat provozovat i na počítačích Atari ST či na Amigách, což je ovšem v případě tohoto výpočetně mimořádně náročného programu konfigurace vhodná pouze pro trpělivé uživatele.

Řádková varianta programu Quat si teoreticky vystačí na dnešní dobu s opravdu spartánskou konfigurací počítače – procesor minimálně Intel 486 a 4MB RAM, přičemž samotný Quat si alokuje cca 1,6MB RAM. I varianta s grafickým uživatelským rozhraním je poměrně skromná na systémové zdroje, k čemuž přispívá i použitá knihovna pro GUI – FLTK (Fast Light Tool Kit, http://www.fltk­.org), jejíž jméno je zvoleno příhodně. Na druhou stranu je vytváření kvalitních obrázků čtyřrozměrných Juliových množin výpočetně velmi náročné, proto také na starých čtyřiosmšestkách či prvních Pentiích trvají výpočty jednoho obrázku i několik hodin (zhruba stejně dlouho jako výpočet klasické Mandelbrotovy množiny na osmibitových počítačích, jinými slovy jde o záležitost pouze pro nadšence). Nicméně na procesorech s frekvencí okolo 1GHz jsou výpočty velmi rychlé, podle rozlišení a dalších parametrů trvají od několika sekund po jednotky hodin.

fractals67_2
Obrázek 2: Pro výpočet tohoto objektu byla použita varianta Quatu spouštěná z příkazové řádky

2. Způsob práce aplikace Quat

Program Quat používá jiný algoritmus vizualizace obrázku čtyřrozměrné Juliovy množiny než minule a předminule popisovaný raytracer POV-Ray. Zatímco v POV-Rayi se prováděl pomocí poměrně složitých numerických metod výpočet průsečíku paprsku s povrchem fraktálu, Quat při vizualizaci pracuje tak, že pro každý pixel obrazovky (resp. pro každý pixel vytvářeného obrázku) vygeneruje sérii n bodů a následně provádí test, který nejbližší bod leží na rozhraní mezi vnějším a vnitřním prostorem. Hodnota n do značné míry ovlivňuje přesnost a rychlost celého výpočtu a případný vznik vizuálních chyb ve vytvářeném obrázku.

Každý bod je nejprve ohodnocen pravdivostní hodnotou („uvnitř“ či „vně“) na základě iterační funkce Juliovy množiny podle toho, zda jemu odpovídající kvaternionová hodnota z0 způsobila konvergenci či divergenci orbitu. Stejným způsobem se ostatně vyhodnocují i vnější a vnitřní body Mandelbrotovy množiny či Juliových množin ležících v komplexní rovině. Pokud je nalezen průsečík s hranicí fraktálu (pro některé pixely průsečík být nalezen samozřejmě nemusí), je následně vypočten normálový vektor k povrchu a s využitím Phongova osvětlovacího modelu je vyjádřena i barva pixelu (zde situaci poněkud zjednodušuji, protože pro určení normály se berou v úvahu i sousední pixely).

Použitá metoda výpočtu má své klady i zápory. Mezi klady můžeme počítat poněkud větší rychlost vykreslování (zde však záleží na samotné implementaci výpočetních postupů a především na požadované přesnosti) a možnost použití rozšířeného Z-bufferu pro urychlení dalšího vykreslování objektu s odlišnými parametry (jiné osvětlení, různé „texturovací“ funkce atd.). Mezi nevýhody patří například nemožnost použít zrcadlení a/nebo průhlednost, protože není možné do scény přidávat sekundární paprsky, které jsou v raytracerech přirozeným způsobem podporovány. Také možnosti texturování jsou omezené, ale tuto nevýhodu možná další verze programu odstraní.

Prakticky všechny nastavení se v grafické verzi programu Quat nachází pod položkou menu Parameters=>Edit. Po výběru této položky se zobrazí dialog obsahující pět listů, na kterých je možné nastavit jak základní parametry vykreslované čtyřrozměrné Juliovy množiny, tak i osvětlovací model, způsob výpočtu barev na povrchu fraktálu, ořezávací roviny aj. V dalších kapitolách si ukážeme, jakým způsobem se pracuje s grafickou variantou programu Quat, zejména se zmiňovaným konfiguračním dialogem. Uvedené screenshoty sice pochází z poněkud postarší (zato však rozšířenější) verze 1.0, oproti nové verzi (1.2) však došlo pouze k nepatrným změnám, na které upozorním v dalším pokračování tohoto seriálu.

fractals67_3
Obrázek 3: Úvodní obrazovka programu Quat se zobrazeným menu

3. Specifikace parametrů čtyřrozměrné Juliovy množiny

Mezi hodnoty, které nejvíce ovlivňují vzhled výsledného obrázku, bezesporu patří parametry čtyřrozměrné Juliovy množiny. Mezi tyto parametry náleží typ vykreslované množiny (Iteration Formula: Juliova množina či varianta fraktálu Lambda, verze 1.2 podporuje i další typy fraktálů) a hodnota kvaternionové konstanty c=c1+ici+jcj+kck j­ejíž význam odpovídá komplexní konstantě c=c1+ici použi­té u klasických Juliových množin (c(1,i,j,k) parts). Při nastavení hodnoty c může pomoci zobrazený řez kvaternionovou Mandelbrotovou množinou, ve které se pomocí myši zvolí souřadnice c1 a ci. Zbylé dvě souřadnice se mohou do příslušných textových políček zapsat ručně; po tomto zadání se však musí stisknout tlačítko Redraw, aby se řez Mandelbrotovou množinou překreslil (toto překreslení se tedy neprovádí automaticky).

Dále je možné na tomto formuláři nastavit maximální počet iterací prováděných pří výpočtu konvergence či divergence orbitu, bailout (hodnotu používanou pro test divergence) a také konstantu, která je použita při ořezání původně čtyřrozměrného objektu trojrozměrným podprostorem. Počet iterací ovlivňuje přesnost výpočtů, což se vizuálně projevuje na členitosti zobrazovaného povrchu. Typické hodnoty se pohybují od šesti iterací (málo členitý objekt) do čtrnácti iterací (prakticky nespojitý povrch). Podobný význam má v tomto kontextu hodnota bailout – čím je vyšší, tím je vypočtený povrch objektu hladší. U klasických komplexních Juliových množin je bailout nastaven na hodnotu 4, zde je implicitně použita hodnota 16. V praxi se však nemusíme bát nastavit i mnohem vyšší hodnoty, například 200.

fractals67_4
Obrázek 4: Ukázka specifikace parametrů čtyřrozměrné Juliovy množiny

4. Nastavení pohledu na původně čtyřrozměrný fraktální objekt

Na druhém listu formuláře se provádí nastavení pohledu na vykreslovanou Juliovu množinu. Základními parametry jsou souřadnice pozorovatele/kamery (View Point) a jeho částečná orientace v prostoru (Up). Pozorovatel se vždy dívá do bodu (0, 0, 0); na základě tohoto údaje je možné vypočítat jeho úplnou orientaci. Dále se zadává rozsah vykreslované scény (Length Of View), čím nižší je zde uložená hodnota, tím více se objekt zvětší. Perspektiva se nastavuje v textových políčkách nazvaných Interocular. Specifikuje se buď vzdálenost nebo zorný úhel. Nulová hodnota značí, že se nebude perspektiva používat a bude se provádět rovnoběžné promítání. Celou scénou, tj. vykreslovaným fraktálem, je možné pohybovat po zadání numerických hodnot do políček nazvaných Move. První políčko slouží pro posun v horizontálním směru, druhé políčko pro posun ve směru vertikálním.

Posledním důležitým parametrem je pozice světelného zdroje. Quat podporuje pouze jeden světelný zdroj s bílou barvou, který se chová jako bodové světlo. Všechny nastavené parametry je možné jednoduše otestovat – postačí v dolní části dialogu zvolit tlačítko Do! (v nové verzi přejmenované na Calc) a v ploše vedle tlačítka se provede překreslení náhledu na fraktál (nová verze i zde zavádí novinku – náhled je samostatným oknem, které je možné přesouvat na libovolné místo obrazovky). Pokud je zatrženo tlačítko Own, provádí se překreslení Juliovy množiny se zde zadanými parametry, v opačném případě jsou použity implicitní hodnoty. Další tři schématické obrázky, které se (alespoň v současné verzi) nedají editovat, slouží pro zobrazení nastavení aktivního pozorovatele a promítací roviny ze tří stran: nárys, půdorys bokorys. Obsah těchto obrázků se změní ihned po nastavení nové souřadnice a orientace pozorovatele.

fractals67_5
Obrázek 5: Ukázka nastavení pohledu na vykreslovaný fraktál

5. Barevné přechody (gradient), transformační funkce barev

Třetí list konfiguračního formuláře slouží k zadávání barevných přechodů, které jsou použity při obarvování bodů ležících na vypočteném povrchu fraktálu. Samotné obarvení bodů můžeme považovat za jednoduchou formu textury. Způsob výpočtu barvy je následující: jakmile je vypočten bod ležící na povrchu fraktálu, je na základě všech tří souřadnic tohoto bodu (nebo hodnoty orbitu) a zadané transformační funkce vypočtena reálná hodnota t. Posléze se provede vyhledání barvy v barvové paletě, která dané hodnotě t náleží. Barvová paleta však v Quatu není specifikována výčtem barev, jak je to obvyklé v mnoha jiných programech, ale seznamem barevných (gradientních) přechodů, u kterých jsou obě koncové barvy editovatelné.

Prakticky vše vypadá tak, že se v horní části tohoto listu nachází pravítko se zobrazenými přechody. Tlačítkem Add je možné přidat další gradientní přechod spolu se specifikací jeho váhy (ta určuje délku tohoto přechodu). Obě koncové barvy přechodu se zadávají v částech nadepsaných Color 1 a Color 2. Tlačítko Sel vyvolá dialog pro výběr barvy. Tlačítka Copy a Paste slouží k přesunům barev mezi jednotlivými přechody. To je výhodné v případech, kdy vyžadujeme plynulé navázání jednotlivých gradientních přechodů na sebe: postačí koncovou barvu z jednoho přechodu zkopírovat jako počáteční barvu přechodu druhého.

Důležité je textové pole Color Formula s přidruženým tlačítkem. Zde je možné nastavit, jakým způsobem se provede výpočet hodnoty t. K dispozici je několik připravených vzorců, ale je možné napsat si i vzorec vlastní, což do celého procesu výpočtu vnáší velkou svobodu v tvorbě jednoduchých i složitějších prostorových textur. Hodnoty ve vzorci je možné zjišťovat ze souřadnic bodu ležícího na povrchu fraktálu a ze souřadnic orbitu (viz poslední připravený vzorec). I na tomto formuláři je možné pomocí tlačítek Do! (Calc) a Own provádět náhledy na fraktál a prakticky interaktivně tak zjišťovat vliv nastavených parametrů na výsledný obrázek.

fractals67_6
Obrázek 6: Ukázka nastavení barevných přechodů a transformační funkce barev

fractals67_7
Obrázek 7: Viditelný skok mezi dvěma barevnými přechody

6. Editace ořezávacích rovin

Pomocí ořezávacích rovin, jejichž parametry lze nastavit na čtvrtém listu dialogu s konfigurací, je možné od vytvářené čtyřrozměrné Juliovy množiny oddělit libovolné části. Každá ořezávací rovina je specifikována svým normálovým vektorem a vzdáleností od počátku souřadné soustavy. Orientaci ořezávací roviny, tj. tu část podprostoru, která má být odstraněna, určují znaménka u normálového vektoru. Ořezávacích rovin může být specifikováno několik (k jejich přidání slouží tlačítko Add), musíme si však dát pozor na to, že v této části grafického uživatelského rozhraní je chyba, která způsobuje, že se nastavené změny na výsledném fraktálu nemusí projevit (ořezávací rovina se neuloží či naopak nesmaže), proto je vždy vhodné použít před potencionálně zdlouhavým výpočtem celého obrázku nejprve náhled, abychom si ověřili, že je vše nastaveno korektně.

fractals67_8
Obrázek 8: Editace ořezávacích rovin

fractals67_9
Obrázek 9: Ukázka fraktálu, u nějž jsou aplikovány tři ořezávací roviny

7. Nastavení rozlišení, antialiasingu a osvětlovacího mo­delu

V poslední části konfiguračního dialogu je možné nastavit parametry, které přímo ovlivňují formát výsledného obrázku. Mezi základní vlastnostmi každé bitmapy patří nepochybně její rozlišení, které je možné nastavit pomocí celočíselných hodnot X Resolution a Y Resolution (tato textová pole se ve skutečnosti chovají i jako posuvníky, proto je možné hodnotu změnit i táhnutím pomocí myši). Hodnota Z Resolution ovlivňuje počet rovin, ve kterých se provádí výpočet průsečíku s fraktálním objektem. Jedná se o velmi důležitou hodnotu, při jejímž nesprávném nastavení se v obrázku buď vytváří nežádoucí „schody“ nebo výpočet naopak trvá neúměrně dlouho. Místo ručního nastavení všech tří hodnot rozlišení je možné použít pomocná tlačítka pojmenovaná Resolution shortcuts.

Další tři parametry, konkrétně Phong Highlight max, Phong Highlight sharp a Ambient Light slouží k nastavení parametrů osvětlovacího modelu (nenechte se zde zmást poněkud nelogickým uspořádáním textových polí). Poslední parametr Antialiasing se používá pro vizuální vyhlazení povrchu a má velký vliv na rychlost (či naopak pomalost) celého vykreslování. Těmito parametry se však budeme podrobněji zabývat až v následující části seriálu.

root_podpora

fractals67_a
Obrázek 10: Nastavení rozlišení, antialiasingu a osvětlovacího mo­delu

8. Obsah dalšího pokračování tohoto seriálu

V následujícím pokračování tohoto seriálu dokončíme popis programu Quat, zejména vliv antialiasingu a nastavení rozlišení v Z-ové ose na kvalitu celého generovaného obrázku. Také si ozřejmíme význam Z-bufferu, který je u tohoto programu poněkud odlišný od obecně chápaného Z-bufferu jako pouhé paměti hloubky.

Byl pro vás článek přínosný?

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.