Matematyczne góry
Podstawy matematyczne na których bazuje algorytm generowania "matematycznych gór" przedstawione będą w sposób ogólny niewymagający znajomości matematyki na poziomie akademickim.
Pierwszym twierdzeniem, które gra podstawową rolę w mojej pracy jest twierdzenie polskiego matematyka Stefana Banacha. Twierdzenie nosi nazwę "Twierdzenia o punkcie stałym". Na początek należałoby wyjaśnić pojęcie przekształcenia zwężającego. Zapis d(x,y) oznaczał będzie odległość punktów x oraz y. Jeśli istnieje liczba a(0,1)  taka, że d(f(x),f(y))af(x,y) to przekształcenie f nazywamy zwężającym. Liczbę a nazywamy współczynnikiem zwężania.
Przykład Dla liczb rzeczywistych ich odległość mierzymy używając wartości bezwzględnej tzn. dla x,yR d(x,y)=|x-y|. Rozpatrzmy dla x[0,1]  przekształcenie f(x)=14x2. Ponieważ dla x,yR prawdziwa jest nierówność
d(f(x),f(y))=|14x2-14y2|=14|(x-y)(x+y)|142|x-y|=12|x-y| Zatem przekształcenie f jest przekształceniem zwężającym. Współczynnik zwężania wynosi 12. Twierdzenie Banacha mówi, że przy odpowiednich założeniach (które zakładam, że na potrzeby mojej pracy są spełnione), jeśli przekształcenie f jest zwężające, to istnieje dokładnie jeden punkt stały x tego przekształcenia, (tzn. w zależności od dziedziny funkcji liczba, punkt, zbiór) taki, że f(x)=x.
Aby obliczyć punkty stałe funkcji rozpatrywanej powyżej tj. f(x)=14x2 powinniśmy rozwiązać równanie 14x2=x. Rozwiązaniami równania są liczby x=0 oraz x=4. Ze względu na dziedzinę punktem stałym jest liczba 0.

Dowód twierdzenia Banacha podaje iteracyjną metodę znalezienia punktu stałego przekształcenia f. Przebiega ona następująco: weżmy dowonly punkt x0 należący do dziedziny funkcji. Następnie obliczamy x1=f(x0). Dalej x2=f(x1) itd. Ogólnie xn=f(xn-1). Okazuje się, że ciąg xn jest zbieżny do punktu stałego przekształcenia f.
Bazując na moim przykładzie, weźmy np. x0=13. Następnie x1=f(13)=14·19=136, x2=f(136)=14·11296=15184 itd. Widać dokładnie, że ciąg xn będzie zbiegał do punktu stałego przekształcenia, czyli do 0.
Dowód twierdzenia Banacha pokazuje jeszcze jedno oszacowanie, które wykorzystam w dalszym opisie. Zachodzi nierówność d(x0,x)11-ad(x0,f(x0))
Przekształcenia w, które wykorzystuję do generowania matematycznych gór to tzw. przekształcenia afiniczne, które punktom płaszczyzny przyporządkowują inne punkty płaszczyzny. Jeśli P(x,y) jest dowolnym punktem płaszczyzny, to
w(P)=(u,v)=(ax+by+e,cx+dy+f). Dla przykładu rozpatrzmy przekształcenie w(P)=(3x+y-1, 2x-4y). Dla P(-1,3) dostaniemy w(P)=(3·(-1)+3-1, 2·(-1)-4·3)=(-1,-14). Mówiąc precyzyjniej, obrazem punktu P(-1,3) jest punkt P'(-1,-14).

Okazuje się, że mając dane na płaszyźnie dwa trójkąty pierwszy o wierzchołkach P1(x1,y1) , P2(x2,y2) , P3(x3,y3) drugi o wierzchołkach Q1(u1,v1) , Q2(u2,v2) , Q3(u3,v3) (punkty nie mogą być współliniowe) to zawsze możemy znaleźć odwzorowanie afiniczne odwzorowujące jeden z nich na drugi. Wystarczy rozwiązać układ sześciu równań z sześcioma niewiadomymi: ax1+by1+e=u1cx1+dy1+f=v1ax2+by2+e=u2cx2+dy2+f=v2ax3+by3+e=u3cx3+dy3+f=v3 Jeśli boki trójkąta przekształcanego będą krósze od odpowiednich boków jego obrazu, to możemy twierdzić, że przekształcenie w jest zwężające. Dla przykładu obliczę współczynniki przekształcenia afinicznego w, które odwzorowuje trójkąt o wierzchołkach P na trójkąt o wierzchołkach Q. Trójkąty przedstawiłem na obrazie obok.


Należy w tym celu rozwiązać następujący układ równań: -4a+3b+e=1-4c+3d+f=23a-2b+e=33c-2d+f=4-2a-b+e=4-2c-d+f=3 Rozwiązaniami układu są liczby: a=-0,39 b=-0,94 c=0,17 d=-0,17 e=2,28 f=3,17 Odwzorowanie wygląda zatem następująco:
w(P) = (-0,39x-0,94y+2,28 , 0,12x-0,17y+3,17)
Okazuje się, że jeśli mamy n odwzorowań zwężających, np. takich które były rozważane powyżej to odwzorowanie w(P) =w1(P) w2(P)...wn(P) jest również przekształceniem zwężającym. Odwzorowanie to nosi nazwę odwzorowania Hutchinsona.
Aby wyjaśnić powstawanie "matematycznych gór" podam jeszcze pojęcie "odległości obrazów" na płaszczyźnie zaporponowane przez niemieckiego matematyka Felixa Hausdorffa. Odległość w języku metematycznym nazywamy metryką.
Trzeba w tym celu zdefiniować pojęcie "otoczenia epsilonowego" zbioru na płaszczyźnie.
Otoczeniem epsilonowym zbioru A nazywamy zbiór Aε zdefiniowany następująco: Aε={yR2:xA |x-y|ε}

Przykłady Otoczeń epsilonowych zbiorów


Weźmy dwa zbiory A, B leżące na płaszczyźnie. Dobierzmy dwie liczby (otoczenia epsilonowe zbiorów A oraz B) εA  oraz εB  tak aby zachodziły inkluzje ABεB  oraz BAεA . Większą z tych liczb nazywamy odległością Hausdorffa zbiorów A i B i oznaczamy literką h. Mówiąc prościej, aby odległość Hausdorffa dwóch zbiorów A i B była "mała", każdy element zbioru A musi leżeć "blisko" jakiegoś elementu zbioru B.



Zapiszę jeszcze raz nierówność wynikającą z dowodu twierdzenia Banacha dla zbiorów A i B używając odległości Hausdorffa. h(A0,A)11-ah(A0,w(A0)) , gdzie A0 oznacza tutaj obraz początkowy, A natomiast jest obrazem generowanych przez ciąg An+1=w(An). Jeśli teraz postawimy sobie zadanie znalezienia takiego odwzorowania w aby wygenerowany przez niego obraz A był jak najbardziej bliski (w sensie metryki Hausdorffa) ustalonemu z góry obrazowi początkowemu A0 (temu, który chcemy zakodować) to z powyższej nierówności widać, że odległość ta będzie niejako "kontrolowana" przez jednokrotne zastosowanie operatora Hutchinsona. Rozumieć to można w ten sposób, że jeśli w1(A0) w2(A0)...wn(A0) okaże się bliska A0 (prawa strona nierówności) to tym bardziej A będzie bliski A0.
Rozpatrzę przykład z papotką przedstawioną na poniższym rysunku.



Paproć posiada wyraźne cechy "samopodobieństwa" tzn. część paprotki ograniczona trójkątem T1 jest pomniejszoną i obróconą kopią całości, podobnie jak część ograniczona trójkątem T2 i T3. Aby ustalić odwzorowania składowe wi odwzorowania w ustalmy tzw. trójkąt bazowy (zawierający obraz całej paprotki). Następnie zaznaczając współrzędne kolejnych trójkątów T1,T2,T3 dostaniemy współczynniki kolejnych odwzorowań wi (tak jak było to opisane w sekcji drugiej).
Poniżej obraz paprotki wygenerowany za pomocą mojego programu:



Patrząc na obraz góry, na jej nieregularne kształty, możemy dopatrzyć się podobieństwa całej góry do jej małych fragmentów. Zaznaczając trójkąt bazowy jako "obrys" góry, a następnie trójkąty na które ta góra ma być przekształcana, spodziewamy się odtworzenia początkowego obrazu poprzez wielokrotne (w mojej pracy 300000 razy) zastosowanie operatora w.

Do wygenerowania paprotki w powyższej sekcji użyto czterech funkcji wi o współczynnikach przedstawionych w tabeli poniżej (przekształcenie w1 generuje łodygę paprotki).
a b c d e f
w1 0 0 0 0,17 0 0
w2 0,849 0,025 -0,025 0,849 0 3
w3 0,155 0,235 0,195 0,186 0 1,2
w4 0,155 -0,235 0,195 0,186 0 3
Iterowanie zaczynamy od punktu (0,0), ponieważ obraz końcowy nie zależy od wyboru punktu startowego. Łatwo policzyć, że po pierwszym kroku iteracji otrzymujemy 4 punkty, po drugim 42, po k-tym 4k. I tu sprawa się komplikuje gdyż przy wzroście k ilości punktów robią się ogromne. Z pomocą przychodzi tzw. probabilistyczny sposób generowania obrazów.
Jeśli mamy n odwzorowań wi to przyporządkowujemy każdemu z nich liczbę pi, która będzie równa prawdopodobieństwu wylosowania odwzorowania wi. Musi być przy tym zachowana równość p1+p2+...pn=1. Wybieramy następnie dowolny punkt płaszczyzny (u mnie punkt (0,0)), losujemy jedno z odwzorowań wi a następnie przekształcamy ten punkt tym odwzorowaniem. Mówiąc ogólnie, każdy następny punkt jest obrazem punktu poprzedniego przekształconego przez jedno z wylosowanych odwzorowań. Jeśli mamy n odwzorowań wi to przyporządkowujemy każdemu z nich liczbę pi, która będzie równa prawdopodobieństwu wylosowania odwzorowania wi. Musi być przy tym zachowana równość p1+p2+...pn=1. Wybieramy następnie dowolny punkt płaszczyzny (u mnie punkt (0,0)), losujemy jedno z odwzorowań wi a następnie przekształcamy ten punkt tym odwzorowaniem. Mówiąc ogólnie, każdy następny punkt jest obrazem punktu poprzedniego przekształconego przez jedno z wylosowanych odwzorowań.
W pracy dodatkowo generuję dolne partie obrazu na zielono (symulacja trawy), a górne na szaro (symulacja mgły).