Kedysi som sa fraktalom venoval (este na strednej skole a potom na univerzite) a konkretne aj metodou generovania mrakov/hor. Tento clanok som z casovych dvovodov necital (posledne uz len pozriem obrazky :-) ), no prave z obrazkov som si vsimol, ze vo vsetkych vidno kolme hviezdy (krize) - to je standardny problem tejto metody. Pamatam sa, ze som vo svojom fraktalovom programe v ramci semestralnej prace venoval dost mojho mozgoveho vykonu, aby vygnerovane hory (+ aj mracnove textury) neobsahovali tento umely defekt :-) - a to som necerpal zo ziadnych inych zdrojov. Takze verim, ze existuje aj lepsia metoda ;-). To len tak na okraj.
Clanky su inac super; keby som mal tieto k dispozicii pred par rokmi, boli by pre mna velmi uzitocne ;-)
máte naprostou pravdu v tom, že dnes uvedená metoda trpí právě tímto nedostatkem (je však nejjednodušší, proto se také hodí pro demonstraci). Při tvorbě fraktálních krajin tento nedostatek prakticky vůbec nevadí, ale při zobrazení plasmy jako textury již ano - je to způsobeno tím, že lidské oko+muzek jsou vytrénovány na hledání hran v obrázcích, protože hrany (prudké změny v barevné intenzitě) nesou podle našich zkušeností nejvíce informací.
Optická chyba s hranami je způsobena tím, že se při dělení čtverce přesouvá pouze jeho prosřední bod (střed) a ostatní čtyři body (středy stran čtverce) jsou vypočteny pouze interpolací - to znamená, že pixely na hranách největšího čtverce mají konstantně se měnící intenzitu. Tyto "středohranové" body není možné (alepospoň při klasické rekurzi) přesunout, protože po rozdělení čtverce by došlo ke "zlomům" na hranici dvou čtverců (problém známý pod pojmem cracked edge).
Řešení tohoto problému samozřejmě existuje, ale poněkud komplikuje celý výpočet. Při dělení čtverce je totiž zapotřebí znát i jeho okolí - sousedy - aby bylo možné posouvat i body na středech hran. Z toho důvodu se musí rekurzivní výpočet upravit tak, že se všechny čtverce na jedné úrovni vypočítají současně a teprve poté se všechny v jednom kroku rozděli. Asi nejjednodušší je sdílet celou bitmapu s plasmou a přenášet pouze úroveň zanoření a index čtverce v daném zanoření.
Zajmalo by me, jak je to se vzorcem pro výpočet rozptylu. V teorii je uveden vzorec , ktery jsem nasel i v jinych materialech, σi^2=σ^2/(2^2H(i+1)). V kodu pak ale dale pocitate se vzorcem d=Delta/(pow(2.0, 2.0*Hexp*(i+0))). Zajmalo by me jestli se jedna jen o zjednodusseni, nebo je v tom jiny umysl. Obrazky totiz s implementovanym vzorcem vypadaji lepe nez s tim teoretickym.