Hlavní navigace

Pravděpodobnosti transformací v systémech iterovaných funkcí

6. 6. 2006
Doba čtení: 13 minut

Sdílet

V další části seriálu o fraktálech využívaných (nejenom) v počítačové grafice si popíšeme několik způsobů, pomocí nichž je možné vypočítat pravděpodobnosti jednotlivých transformací v systémech iterovaných funkcí. Korektně nastavené a použité pravděpodobnosti transformací mohou výrazně urychlit vykreslení IFS systému.

Obsah

1. Výpočet pravděpodobností jednotlivých transformací
2. Výpočet pravděpodobnosti transformace vyjádřením koeficientu kontrakce
3. Výpočet pravděpodobnosti transformace z poměru obsahů generovaných obrazců
4. Výpočet pravděpodobností z poměru obsahů opsaných obdélníků či kvádrů
5. Výpočet pravděpodobností z poměru obsahů opsaných kružnic či koulí
6. Výpočet pravděpodobnosti transformace z koeficientu zkrácení úsečky
7. Uniformní rozdělení pravděpodobností
8. Obsah dalšího pokračování tohoto seriálu

1. Výpočet pravděpodobností jednotlivých transformací

V případě, že jsou zadány všechny lineární transformace systému iterovaných funkcí, pomocí kterých se bude vytvářet fraktální rastrový plošný obrazec či trojrozměrné těleso, musí se v dalším kroku dopočítat k zadané množině transformací Φ={φ1, φ2, … φn} jim odpovídající množina pravděpodobností Π={π1, π2, … πn}, které určují, s jakou četností budou tyto transformace použity při generování fraktálu (jak již víme z předchozích pokračování tohoto seriálu, jde o transformace afinní a většinou i kontraktivní). Bylo by samozřejmě možné, aby všechny transformace měly pravděpodobnost definitoricky nastavenou, to by ale nebylo výhodné z hlediska rychlosti programového generování fraktálu (viz první tři obrázky představující IFS systém se stejnými transformacemi, ale s odlišně nastavenými pravděpodobnostmi).

fractals32_1

Obrázek 1: IFS systém se třemi transformacemi, které mají nastavené pravděpodobnosti na stejné hodnoty {1/3, 1/3, 1/3}

Transformace, které jsou ve velké míře kontrahující, to znamená, že mají nízké hodnoty koeficientů v transformační matici, by iterované body příliš přitahovaly k atraktoru systému. Výsledkem by byl málo rozvinutý fraktál, pro jehož generování v dostatečné vizuální kvalitě by bylo nutné použít příliš vysoký počet iterací. Také množství vygenerovaných souřadnic (a tím i změněných, tj. zapsaných pixelů) by neúměrným způsobem stoupalo – toto zpomalení je ještě více patrné při generování obrazů trojrozměrných IFS systémů, kdy je zapotřebí vygenerovat mnohem větší počet bodů než v případě dvojrozměrném.

fractals32_2

Obrázek 2: IFS systém se třemi transformacemi, které mají nastavené pravděpodobnosti na hodnoty {1/5, 2/5, 2/5}

Z tohoto důvodu je vhodné, aby byla jednotlivým lineárním (resp. afinním) transformacím přiřazena určitá pravděpodobnost, s jakou tyto transformace při generování fraktálního obrazce nastanou, přičemž příliš kontrahující transformace budou mít menší pravděpodobnost než transformace kontrahující méně. Při výpočtu pravděpodobností jednotlivých transformací je nutné dbát na to, aby součet všech pravděpodobností byl roven jednotce dle minule uvedeného vztahu. V následujících kapitolách popíšu šest možností, pomocí kterých je možné vypočítat pravděpodobnosti jednotlivých transformací. U každé možnosti bude uvedena také vhodnost jejího použití vzhledem k charakteru vytvářeného fraktálního obrazce. První uvedený způsob je známý a často používaný, další tři způsoby jsou nové – poprvé byly pravděpodobně popsány v mé diplomové práci. Mezi popisované způsoby patří:

  1. výpočet pravděpodobnosti transformací vyjádřením koeficientu jejich kontrakce.
  2. výpočet pravděpodobnosti transformací z poměru obsahů generovaných obrazců.
  3. výpočet pravděpodobnosti transformací z poměru obsahů opsaných obdélníků či kvádrů.
  4. výpočet pravděpodobnosti transformací z poměru obsahů opsaných kružnic či koulí.
  5. výpočet pravděpodobnosti transformací z koeficientu zkrácení úsečky.
  6. uniformní rozdělení jednotlivých pravděpodobností.
fractals32_3

Obrázek 3: IFS systém se třemi transformacemi, které mají nastavené pravděpodobnosti na hodnoty {1/10, 9/20, 9/20}

2. Výpočet pravděpodobnosti transformace vyjádřením koeficientu kontrakce

Tento způsob výpočtu pravděpodobností jednotlivých transformací IFS systému patří mezi nejčastěji používané metody pro získání (a pozdější aplikaci) pravděpodobností transformací při vytváření IFS koláží v plošných rastrových obrazcích. Pro běžné typy transformací (zdaleka ne však pro všechny, zejména to neplatí pro mezní a singulární případy) dává tento způsob poměrně dobré výsledky, to znamená, že rozložení pravděpodobností generované tímto vztahem přibližně odpovídá ideálnímu rozložení. Další předností tohoto způsobu výpočtu je jeho jednoduchost, dosti závažnou nevýhodou pak fakt, že některé pravděpodobnosti mohou při výpočtu vycházet nulové – je to dáno způsobem výpočtu koeficientů z transformační matice. To by však znamenalo, že by se daná transformace nepodílela na generování koláže, což je samozřejmě chybné rozhodnutí. Po aplikaci tohoto způsobu je tedy nutné ošetřit nulové pravděpodobnosti a přiřadit jim nějakou minimální nenulovou hodnotu, která je v dalším textu označena symbolem Sε.

Při odvození vztahu pro výpočet pravděpodobnosti i-té transformace se vychází z použité transformační matice Ai, ze které je vypočten dočasný koeficient kontrakce:

s'i=a11i × a22i – a12i × a21i

Poté je zapotřebí ošetřit stav, kdy je některý koeficient kontrakce nastaven na nulovou hodnotu. To se provede tak, že se každá nulová hodnota kontrakce nahradí předem zadanou konstantou Sε. Pravděpodobnost πi právě zpracovávané transformace i lze vyjádřit jednoduše:

πi=s''i/S

kde hodnota S představuje součet hodnot všech upravených koeficientů kontrakce:

S=∑i=0N s''i

Výše uvedenou metodu je možné použít zejména při práci s plošnými IFS systémy, protože při práci v prostoru mnohdy nastávají problémy s výpočtem koeficientu kontrakce – mnoho koeficientů je po výpočtu nulových či blízkých nule.

fractals32_4

Obrázek 4: IFS systém se čtyřmi transformacemi, které mají nastavené pravděpodobnosti na shodné hodnoty {1/4, 1/4, 1/4, 1/4}

3. Výpočet pravděpodobnosti transformace z poměru obsahů generovaných obrazců

Tento způsob výpočtu pravděpodobností jednotlivých transformací spočívá ve výpočtu plochy Sbase bázového (základního) objektu tak, jak ho zadal uživatel v interaktivním grafickém editoru. Poté se na vrcholy bázového objektu aplikuje i-tá transformace, pro kterou je pravděpodobnost počítána, a pro nově vygenerované body se vyčíslí plocha nového objektu Si. Pravděpodobnost dané transformace se spočítá jako poměr obsahů těchto dvou obrazců:

πi=Si/Sbase

Výpočet obsahu objektu, který je zadán seznamem svých vrcholů, z nichž každý vrchol má souřadnice [xn, yn], se provede pomocí algebraického součtu determinantů. Každý determinant je vytvořen z matice čtveřic hodnot, které jsou dány polohou dvou sousedních vrcholů, které leží na hranici objektu:


   | xj  xj+1 |
Dj=|         |
   | yj  yj+1 |

Poslední determinant v řadě uzavírá celou posloupnost:


   | xn  x0 |
Dn=|        |
   | yn  y0 |

Výsledná plocha objektu je potom rovna polovině tohoto součtu:

S=1/2 |D1+D2+…+Dn|

Jedná se o nejpřesnější metodu sloužící k výpočtu pravděpodobností jednotlivých transformací, jejíž nevýhodou je však větší složitost, z čehož plyne i časová náročnost. Také způsob výpočtu ploch obrazce nemusí vždy dát korektní výsledky. To se stane zejména v případě, kdy uživatel zadal určitým způsobem zdeformovaný tvar bázového objektu, který má například dvě shodné hrany. Pro aplikaci systému iterovaných funkcí v prostoru se tento způsob výpočtu pravděpodobností příliš nehodí, protože se vlastní výpočet objemů těles stává příliš komplikovaný – proto byly pro tyto účely vytvořeny další metody popsané v následujících kapitolách.

fractals32_5

Obrázek 5: IFS systém se čtyřmi transformacemi, které mají nastavené pravděpodobnosti na hodnoty {1/10, 3/10, 3/10, 3/10}

4. Výpočet pravděpodobností z poměru obsahů opsaných obdélníků či kvádrů

Způsob výpočtu pravděpodobností jednotlivých transformací pomocí vyčíslení poměru obsahů opsaných obdélníků či kvádrů je velmi rychlý, zejména v porovnání s předchozím způsobem. Vypočtené pravděpodobnosti jsou také jednoznačné, proto není zapotřebí ve výpočtech provádět korekce vypočtených hodnot. Nevýhodou je však menší přesnost vypočtených pravděpodobností, přičemž odchylka korektních hodnot od vypočtených pravděpodobností může činit jednotky a v ojedinělých případech až desítky procent.

Nejprve je proveden výpočet minimálních a maximálních souřadnic bázového objektu pomocí následujících vztahů:

xmin = min(xi)     pro všechna i v rozsahu <1..n>
xmax = max(xi)
ymin = min(yi)
ymax = max(yi)
zmin = min(zi)
zmax = max(zi

Z vypočtených souřadnic je získána plocha obdélníka (resp. objem kvádru, pokud se pracuje s trojrozměrnými IFS), který je opsán bázovému objektu:

Sobd = (xmax-xmin) × (ymax-ymin)
Skva = (xmax-xmin) × (ymax-ymin) × (zmax-zmin)

Poté je pro každý vrchol bázového objektu provedena transformace a následně jsou spočítány nové minimální a maximální souřadnice pro transformovaný bázový objekt ([x'i, y'i, z'i]=φj([xi, yi, zi])):

x'min = min(x'i)    pro všechna i v rozsahu <1..n>
x'max = max(x'i)
y'min = min(y'i)
y'max = max(y'i)
z'min = min(z'i)
z'max = max(z'i)

V dalším kroku algoritmu je vypočtena plocha obdélníka (resp. objem kvádru), který je opsán transformovanému bázovému objektu:

S'obdj = (x'max-x'min) × (y'max-y'min)
S'kvaj = (x'max-x'min) × (y'max-y'min) × (z'max-z'min)

Výsledná pravděpodobnost j-té transformace je dána vztahem:

πj=S'obdj / Sobd

resp.

πj=S'kvaj / Skva

Mohlo by se zdát, že by bylo dostačující vypočítat ohraničující obdélník bázového objektu a souřadnice vrcholů nového obdélníku získat pomocí aplikace transformace. Takový postup by však nedával shodný výsledek, neboť určité transformace (například zkosení apod.) by tento obdélník změnily na jiný tvar a vypočtený obsah S'j by byl odlišný od S'obdj.

fractals32_6

Obrázek 6: IFS systém se čtyřmi transformacemi, které mají nastavené pravděpodobnosti na hodnoty {4/100, 32/100, 32/100, 32/100}

5. Výpočet pravděpodobnosti z poměru obsahů opsaných kružnic či koulí

Tento způsob výpočtu pravděpodobností jednotlivých transformací se podobá způsobu předchozímu. Základní rozdíl však spočívá v tom, že se neprovádí obalení bázového objektu obdélníkem, ale kružnicí. Pro výpočet pravděpodobnosti se potom porovnají obsahy obalujících kružnic bázového objektu a objektu transformovaného. V případě výpočtu pravděpodobností trojrozměrného systému iterovaných funkcí se místo obalové kružnice používá obalová koule.

Střed obalující kružnice v ploše (resp. koule v prostoru) se vypočítá jako aritmetický průměr souřadnic vrcholů bázového objektu:

xs=1/n × ∑i=1n xi
ys=1/n × ∑i=1n yi
zs=1/n × ∑i=1n zi
 

Pro výpočet obsahu obalující kružnice je nutné znát i její poloměr, který se vypočte jako maximální vzdálenost středu obalující kružnice a souřadnic vrcholů bázového objektu:

radiuskruznice=max(((xs-xi)2+(ys-yi)2)1/2)

kde xi a yi jsou souřadnice i-tého vrcholu bázového objektu. Obsah obalující kružnice se nyní vypočte snadno:

Skruznice=π × radius2kruznice

Pro obalující kouli v prostoru platí podobné vztahy jako pro kružnici:

radiuskoule=max(((xs-xi)2+(ys-yi)2+(zs-zi)2)1/2)
Skoule=4/3 × π × radius3koule

Ve druhém kroku se nejprve provede transformace všech vrcholů bázového objektu. Dále jsou vypočteny souřadnice středu nové kružnice (resp. koule v prostoru):

x's=1/n × ∑i=1n x'i
y's=1/n × ∑i=1n y'i
z's=1/n × ∑i=1n z'i

Následně je zjištěn poloměr kružnice, která obaluje tento nový objekt vzniklý transformací v ploše:

radius'kruzni­ce=max(((x's-x'i)2+(y's-y'i)2)1/2)

kde x'i a y'i jsou souřadnice i-tého vrcholu transformovaného objektu. Obsah nové obalující kružnice je vypočten pomocí vztahu:

S'kruznice=π × radius'2kruzni­cei

Výsledná i-tá pravděpodobnost dané transformace IFS systému je dána vztahem:

πi=S'kruznice­i/Skruznice

Pro obalující kouli v prostoru je situace obdobná:

radius'koule=max(((x's-x'i)2+(y's-y'i)2+(z's-z'i)2)1/2)
S'koule=4/3 × π × radius'3koule
πi=S'koulei/Skou­le

Tato metoda má podobné vlastnosti jako metoda předchozí. Výsledky se samozřejmě mohou lišit, neboť se jedná o odlišný způsob výpočtu. Předností této metody je, že se počítají korektně i ty transformace, u kterých dochází ke značnému zmenšení jedné souřadnice (například horizontální změna měřítka s malým faktorem zvětšení). U předchozí metody by obsah transformovaného obdélníku byl blízký nule, ale v metodě obalových kružnic/koulí se díky způsobu výpočtu poloměru transformované kružnice či koule dosáhne uspokojivých výsledků.

fractals32_7

Obrázek 7: IFS systém se čtyřmi transformacemi, u nichž je snížen koeficient kontrakce

6. Výpočet pravděpodobnosti transformace z koeficientu zkrácení úsečky

Tento způsob využívá pro výpočet pravděpodobností transformací v systému iterovaných funkcí takzvaný koeficient zkrácení úsečky. Pro zjednodušení výpočtů neuvažuji v dalším textu libovolnou úsečku, ale úsečku, která vychází z bodu P0=[0,0] do bodu P1=[1,1] v ploše, nebo z bodu P0=[0,0,0] do bodu P1=[1,1,1] v prostoru. V tomto případě lze vzorec pro výpočet pravděpodobnosti i-té transformace přímo bez dalších komplikací odvodit. Nejprve si rozepišme zadané hodnoty, které získáme z bodů P0 a P1:

x0=0
y0=0
z0=0
x1=1
y1=1
z1=1 

Hodnoty vypočtené po aplikaci transformace specifikované transformační maticí A:

x'0=a11x0+a12­y0+a13z0+tx
y'0=a21x0+a22­y0+a23z0+ty
z'0=a31x0+a32­y0+a33z0+tz
x'1=a11x1+a12­y1+a13z1+tx
y'1=a21x1+a22­y1+a23z1+ty
z'1=a31x1+a32­y1+a33z1+tz 

Do těchto vztahů dosadíme hodnoty bodů P0=[x0, y0, z0]=[0,0,0] a P1=[x1, y1, z1]=[1,1,1]:

x'0=a110+a120­+a130+tx=tx
y'0=a210+a220­+a230+ty=ty
z'0=a310+a320­+a330+tz=tz
x'1=a111+a121­+a131+tx=a11+a12+a13+tx
y'1=a211+a221­+a231+ty=a21+a22+a23+ty
z'1=a311+a321­+a331+tz=a31+a32+a33+tz 

Délka netransformované úsečky v prostoru je rovna:

d3=((x1-x0)2+(y1-y0)2+(z1-z0)2)1/2=((1–0)2+(1–0)2+(1–0)2)1/2=31/2

Pro úsečku v ploše E2 platí obdobný vztah:

d2=((x1-x0)2+(y1-y0)2)1/2= =((1–0)2+(1–0)2)1/2=21/2

Délka transformované úsečky se v prostoru vypočítá pomocí transformovaných bo­dů:

d'3=((x1‚-x0‘)2+(y1‚-y0‘)2+(z1‚-z0‘)2)1/2=
=((a11+a12+a1­3+tx-tx)2 +(a21+a22+a23­+ty-ty)2 +(a31+a32+a33­+tz-tz)2)1/2=
=((a11+a12+a1­3)2+(a21+a22+a23)2+(a31+­a32+a33)2)1/2

Pro délku transformované úsečky v rovině pak platí obdobný vztah:

d'2=((x1‚-x0‘)2+(y1‚-y0‘)2)1/2=
=((a11+a12+tx-tx)2 +(a21+a22+ty-ty)2)1/2=
=((a11+a12)2+­(a21+a22)2)1/2

Pravděpodobnost dané transformace πi se vypočte jako podíl těchto dvou délek:

πi3=(d'3)/(d)=
=((a11+a12+a1­3)2+(a21+a22+a23)2+(a31+­a32+a33)2)1/2/(31/2)=
=[((a11+a12+a­13)2+(a21+a22+a23)2+(a31­+a32+a33)2)/3]1/2
πi2=(d'2)/(d)=
=((a11+a12)2+­(a21+a22)2)1/2/(21/2)= [((a11+a12)2+­(a21+a22)2)/2]1/2 

Tato metoda je pro výpočet velmi jednoduchá, přináší však také některé nevýhody. První nevýhodu způsobuje fakt, že úsečka je jednorozměrná. To znamená, že pravděpodobnost je přímo úměrná změně délky úsečky. Přesnější (resp. relevan­tnější) výsledky dávají metody, které pravděpodobnost počítají jako změnu obsahu či objemu nějakého útvaru. Rozdíl je tedy v lineárním, kvadratickém či kubickém poměru. Například transformace, která provede zmenšení objektu na polovinu bude mít pravděpodobnost rovnu 1/2. Budeme-li však pravděpodobnost počítat některou z předchozích metod, vyjde tato pravděpodobnost rovna 1/4 či 1/8. Tyto hodnoty jsou přesnější, neboť bázový objekt je v ploše pokryt čtyřmi objekty a v prostoru dokonce objekty osmi, z nichž každý je zmenšen na polovinu.

Druhou nevýhodou této metody je, že vyjadřuje zkrácení jen jedné pevně dané úsečky. To může způsobit chyby v případě, že daná transformace změní tvar tělesa v jiném směru, než jaký má tato úsečka. Pro ilustraci můžeme zadat transformaci, která nejprve otočí objekt o 45 stupňů doprava, potom provede horizontální změnu měřítka a následně objekt otočí o 45 stupňů doleva. Můžeme se přesvědčit, že zatímco tvar objektu se změní, délka úsečky zůstane konstantní. Bylo by tedy vhodnější, aby se spočítala změna délky různě orientovaných úseček. Problém nastává v případě, kdy je zapotřebí spočítat výslednou pravděpodobnost transformace v systému iterovaných funkcí. Poměr zkrácení všech úseček by se měl zprůměrovat, přičemž se musí použít geometrický průměr, ne průměr aritmetický.

Pro co nejpřesnější výpočet je možné jednu úsečku nahradit vektorem s pevně danou délkou, který se otáčí okolo středu. Při jedné otočce vektoru se tedy vypočítá obsah kružnice o poloměru rovném délce vektoru. Musí se provést integrace, aby se zjistil obsah této kružnice. Pro zjištění pravděpodobnosti transformace v prostoru je výpočet komplikovanější, proto ho zde neuvádím:

obsah=∫0(cos­2φ+sin2φ)1/2 dφ

Poté se vypočte obsah objektu, který vznikne rotací vektoru po provedené transformaci. Obecně musí vyjít elipsa (resp. v prostoru elipsoid):

obsah'=∫0((c­os φ×a11+sin φ×a12+tx)2+(c­os φ×a21+sin φ×a22+ty)2)1/­2 dφ

Výsledná pravděpodobnost se potom opět vypočte z poměru těchto dvou ploch:

πi=obsah'/obsah

Jak je z předchozích vztahů patrné, tento způsob výpočtu pravděpodobnosti je velmi komplikovaný a časově náročný – ve skutečnosti se totiž pomocí integrálu zpřesnily předchozí dvě metody, které vyjadřovaly vzájemný poměr objemů či obsahů obalových těles. Popisovaná úprava přitom neodstraňuje základní nevýhodu této metody, tj. lineární závislost pravděpodobnosti na změně měřítka.

fractals32_8

Obrázek 8: Struktura vytvořená pomocí IFS systému

7. Uniformní rozdělení pravděpodobností

Při použití této metody výpočtu pravděpodobností jednotlivých transformací se pravděpodobnost jedné transformace v systému iterovaných funkcí vypočte jako převrácená hodnota počtu transformací:

πi=1/n pro všechna i z rozsahu <1­..n>

kde n je počet všech transformací. Všechny transformace tedy mají přiřazenu stejnou pravděpodobnost. Obecně má tato volba za následek nerovnoměrné rozložení hustoty bodů ve výsledném fraktálu. To je důsledkem toho, že více kontrahující transformace k sobě také více přitahují generované body. Tyto body se potom více „hromadí“ na místech, kde je aplikována daná transformace. Pro trojrozměrné fraktální objekty je tato metoda nevhodná, protože v některých místech prostoru může značně narůstat počet navzájem se překrývajících surfelů, které je zapotřebí odstranit při konečné úpravě (postprocessingu) modelu scény.

fractals32_9

Obrázek 9: Další struktura vytvořená pomocí IFS systému

CS24_early

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

V následujícím pokračování tohoto seriálu krátce zhodnotíme vlastnosti metod pro výpočet pravděpodobností jednotlivých transformací a posléze si popíšeme další algoritmy, pomocí nichž je možné generovat obrázky IFS systémů (algoritmus náhodné procházky totiž zdaleka není jediným algoritmem, který je pro výpočet IFS možné použít).

fractals32_a

Obrázek 10: IFS systém s krystalickou strukturou

ikonka

Zajímá vás toto téma? Chcete se o něm dozvědět víc?

Objednejte si upozornění na nově vydané články do vašeho mailu. Žádný článek vám tak neuteče.

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.