Zobaczyć ocean

Zobaczyć ocean

Rysunek 2. Tworzony obraz zazwyczaj jest wyższy niż oryginał - parametr h2 ma tu większą wartość niż h1. Ponadto do obrazu docelowego wchodzi tylko fragment oryginału, wyznaczony parametrem poziom. Wzajemna gra parametrów h1 - h2 - poziom decyduje o proporcjach wody i powietrza.

Jest to algorytm przeglądania za pomocą dwóch pętli całej powierzchni obrazu docelowego i zastanawiania się nad każdym pikselem, jak go zabarwić. Tutaj problem nie jest wielki - każdy konkretny piksel zabarwiamy kolorem pobranym z obrazu pierwszego, czyli to proste kopiowanie.

Zobaczyć ocean

Rysunek 3. Interfejs programu uzupełniono o dwa edytory, dostarczające kluczowych parametrów do konstrukcji podziału obrazu na zasadniczą scenę i jej odbicie w wodzie.

Przytoczyłem tu bardzo ważną, uniwersalną zasadę grafiki komputerowej, ale podejrzewam, że niektórzy z Państwa nie zwrócili na nią należytej uwagi. Zatem powtórzmy:

Tworząc grafikę piksel po pikselu, zawsze przemierzaj obszar docelowy! Zastanów się nad każdym pikselem obszaru docelowego - jak go zabarwić!

No dobrze, dość tej dydaktyki. Zawińmy rękawy i zmierzmy się z problemem oceanu. Na rysunku 2 znajdą Państwo zasady dzielenia obrazu między powietrze i wodę oraz reguły dobierania jego rozmiarów.

Napiszmy program, który realizuje odpowiedni podział obrazu na część górną (powietrze) i dolną (woda). Wprowadźmy do gry narzędzia, które umożliwią elastyczne manipulowanie położeniem linii podziału. Na rysunku 3 widzimy propozycję interfejsu takiego programu, a poniżej przytaczamy odpowiednie uzupełnienia algorytmu:

int i, j, szer, wys, poziom;

TColor k;

szer = Image2 -> Picture -> Bitmap -> Width;

try

{

wys = Edit1 -> Text.ToInt();

poziom = Edit2 -> Text.ToInt();

}

catch(...) //awaria konwersji ...

{

wys = Image1 -> Picture -> Bitmap -> Height;

poziom = wys / 2;

}

Image2 -> Picture -> Bitmap -> Height = wys;

for( i = 0; i < szer; ++i)

{

for( j = 0; j < wys; ++j)

{

if( j < poziom)

k = Image1 -> Picture -> Bitmap ->

Canvas -> Pixels[ i][ j];

else

k = Image1 -> Picture -> Bitmap ->

Canvas -> Pixels[ i][ 2 * poziom - j];

Image2 -> Picture ->

Bitmap -> Canvas -> Pixels[ i][ j] = k;

}

}