Fraktalna góra

Najbardziej uderzającą cechą fraktali jest to, że w miarę powiększania w każdej skali wyglądają tak samo albo prawie tak samo. Czy skalista góra - przynajmniej w pewnej skali - ma tę właściwość i uda się ją wymodelować za pomocą fraktalnej powierzchni?

Najbardziej uderzającą cechą fraktali jest to, że w miarę powiększania w każdej skali wyglądają tak samo albo prawie tak samo. Czy skalista góra - przynajmniej w pewnej skali - ma tę właściwość i uda się ją wymodelować za pomocą fraktalnej powierzchni?

Rysunek 1. Efektowna i poprawna prezentacja góry wymaga zastosowania algorytmu projekcji trójwymiarowej. Istotą tego algorytmu jest umiejętność wyznaczenia ekranowego miejsca punktu, który znajduje się gdzieś w trójwymiarowej przestrzeni wirtualnej, rozciągającej się za ekranami naszych monitorów. Tutaj widać kwadratową podstawę przyszłej góry. Za chwilę poszarpiemy tę powierzchnię drobniejszymi pagórkami.

Rysunek 1. Efektowna i poprawna prezentacja góry wymaga zastosowania algorytmu projekcji trójwymiarowej. Istotą tego algorytmu jest umiejętność wyznaczenia ekranowego miejsca punktu, który znajduje się gdzieś w trójwymiarowej przestrzeni wirtualnej, rozciągającej się za ekranami naszych monitorów. Tutaj widać kwadratową podstawę przyszłej góry. Za chwilę poszarpiemy tę powierzchnię drobniejszymi pagórkami.

Fraktal jest obiektem matematycznym i do swojej realizacji wymaga nieskończoności. Istnieje w przestrzeni matematycznej i próżno go szukać w otaczającym świecie, zbudowanym z atomów. Atomy swoją strukturą wyznaczają najmniejsze możliwe skale obserwacji i tam wszelkie fraktalne samopodobieństwa muszą się kończyć. Jednak mimo tego ograniczenia wiążemy wielkie nadzieje z fraktalnym obrazowaniem natury. Zazwyczaj wystarczy wygenerować obrazy złożone z kilku, a nie z nieskończenie wielu pięter fraktalnej złożoności, aby uzyskać zachwycająco realistyczne grafiki.

Za chwilę sprawdzimy, jak wyglądałaby góra - zrazu gładka jak piramida Cheopsa, w następnym kroku modelowania pokryta drobniejszymi pagórkami, które za chwilę, tym samym algorytmem, ale już w drobniejszej skali znów zostaną zaburzone. Najpierw jednak zajmijmy się kwestią techniczną, związaną z projekcją trójwymiarowych obrazów na płaskie ekrany. Zagadnieniem tym zajmowaliśmy się szczegółowo w numerze 11/2006, kiedy rysowaliśmy trójwymiarowe wykresy funkcji dwóch zmiennych - między innymi fal na wodzie. Krótko przypomnijmy tamte algorytmy, zainteresowanych Czytelników odsyłając do materiałów archiwalnych, dostępnych na każdym naszym krążku DVD oraz w portalu internetowym.

Zagadnienie projekcji 3D najłatwiej i najefektowniej zrealizować w formie klas. W materiałach źródłowych znajdą Państwo dwie klasy - prostą i pomocniczą, definiującą punkt w przestrzeni 3D:

class TPunkt

{

public:

double x, y, z;

TPunkt( void) {x = y = z = 0;}

TPunkt( double Ax, double Ay

double Az):x(Ax), y(Ay), z(Az){}

};

oraz złożoną, główną klasę, określającą położenie takiego punktu na płaskim ekranie:

class T3d

{

private:

double fodl_ekr, sf,cf, st,ct, R, A,B,C,D;

public:

T3d( TPunkt obserwator

int xe0, int ye0, int eszer, int ewys

double odl_ekr=0.5

double szer_ekr=0, double wys_ekr=0);

bool punkt_3d(int &xe,int &ye,const

TPunkt &p);

};

Nie będziemy analizować dość złożonych algorytmów klasy T3d, ale omówmy jej interfejs. Przede wszystkim widzimy, że ma ona dwie publiczne - zatem przeznaczone dla użytkowników - funkcje, z których pierwsza jest tzw. konstruktorem, a druga to główny koń pociągowy projekcji 3D, wyliczający ekranowe współrzędne punktu 3D. Oto przykład wykreślenia obrazu, widocznego na rysunku 1:

# TPunkt obserwator( 60, 80, 60);

T3d projekcja( obserwator

0, Panel1 -> Height, ClientWidth

ClientHeight - Panel1 -> Height);

TPunkt p1( 10, 10, 0)

p2( 10, -10, 0)

p3( -10, -10, 0)

p4( -10, 10, 0);

int xe1, ye1, xe2, ye2, xe3, ye3, xe4, ye4;

if( projekcja.punkt_3d( xe1, ye1, p1) &&&#