ďťż
Lemur zaprasza
Interpolacja -> zastosowanie w cieniowaniu Gourauda Jest ˙to ˙nic ˙innego jak znajdowanie wartosci posrednich miedzy dwiema wartosciami: x1 a xn. Robimy to tak: 1. Liczymy delta_x = xn - x1 / ilosc_krokow 2. I wykonujemy: x = x + delta_x "ilosc_krokow" razy(przy czym początkowa wartość x to x1) Dzięki punktom 1 i 2 możemy przejść od wartości x1 do xn w "ilosc_krokow" krokach - i to jest właśnie interpolacja. Algorytm ˙ten ˙wykorzystywany ˙jest ˙przy cieniowaniu algorytmem Gouarda . Jesli mamy linie pozioma o kolorach i wspolrzednych: x1->c1 i x2->c2 (Uwaga: x1 mniejsze od x2 inaczej zamien miejscami) robimy: delta_c = c2-c1/x2-x1 teraz dla kazdego piksela(dalej w prawo) poczynajac od x1 robimy c=c+delta_c, przy czym jako poczatkowa wartosc c przyjmujemy c1. Mamy ˙wtedy przejscie koloru c1 w c2 pomiedzy wspolrzednymi x1,y a x2,y dla kazdej linii poziomej(y - to jej wysokosc). Naszym ˙˙zadaniem ˙˙jest ˙˙napisac ˙procedure ˙ktora ˙bedzie ˙to realizowala np. linia(x1,cl,x2,cp,y); gdzie: cl - kolor lewej strony linii, cp - prawej Wykorzystamy ja do narysowania calego trojkata,jak ponizej Teraz ˙zakladamy, ˙ze wiemy jak wyswietla sie trojkat i bedziemy przesuwac sie od Y1 w dol(zal. Y1 mniejsze od Y2 mniejsze od Y3). Nasz ˙problem polega na tym jak wyliczyc cl,cp dla kolejnych lin trojkata. ccl=c1; ccp=c1; delta_c1 = c2-c1/y2-y1; delta_c2 = c3-c1/y3-y1; od y=y1 do y2 { linia(x1,ccL,x2,ccP,y); ccl=ccl+delta_c1; ccP=ccp+delta_c2; y++; } ccl=c2; delta_c1 = c3-c2/y3-y2; od y=y2 do y3 { linia(x1,ccL,x2,ccP,y); ccl=ccl+delta_c1; ccP=ccp+delta_c2; y++; } W ˙algorytmie tym pominieto liczenie wspolrzednych X ktore liczy sie ˙jak ˙dla ˙normalnego ˙algorytmu ˙na ˙kreslenie ˙trojkatow-> analogicznie jak C. Opis powyzszego pseudokodu: 1. Na poczatku rysowany jest fragment stad kazdy kolor lewego konca kazdej linii liczymy ze wzoru: ccl=ccl+delta_c1; a prawego ccP=ccp+delta_c2; Natomiast delta_c1 i delta_c2 liczymy ze wzoru: delta_c1 = c2-c1/y2-y1; -> obrazuje przejscie miedzy kolorami c1 a ˙c2 ˙(c1 ˙i c2 to lewa strona trojkata czyli delta_c1 jest dla kolejnych lewych stron rysowanych lin trojkata) delta_c2 = c3-c1/y3-y1; -> obrazuje przejscie miedzy kolorami c1 a ˙c3 ˙(prawa ˙strona ˙calego ˙trojkata, czyli dla prawej strony wszystkich lin trojkata) Po ˙dojsciu ˙y ˙do Y2 delta_c1 zmienia sie gdyz zaczynamy od tej pory ˙rysowac ˙druga(dolna) polowke trojkata i trzeba uwzglednic przejscie kolorow od c2 do c3(dla lewej strony). 2. Musimy od nowa policzyc delta_c1, wiec: delta_c1 ˙= c3-c2/y3-y2; ->obrazuje przejscie miedzy kolorami c2 a ˙c3 ˙(c2 i c3 to lewa strona trojkata czyli delta_c1 jest dla kolejnych lewych stron rysowanych lin trojkata) A wiec teraz rysujemy framgment: Tak otrzymujemy kompletnie ocieniowany trojkat. Co to sa dokladnie te delta_c1 i delta_c2? Wystarczy spojrzec na wczesniejszy opis algorytmu realizowanego przez procedure linia. Sa ˙one odpowiednikiem delta_x, ale w pionie i dla dwoch roznych stron trojkata: lewej i prawej. Przy czym: delta_x ˙- ˙okresla ˙jak sie ma zmiana wartosci koloru do zmiany wspolrzednej ˙˙poziomej(patrz ˙˙procedura ˙cieniowania ˙poziomej linii) delta_c ˙- ˙okresla ˙jak sie ma zmiana wartosci koloru do zmiany wspolrzednej pionowej(procedura cieniowania calego trojkata) Uwaga: ˙˙Nalezy ˙˙pamietac, ˙˙ze ˙dla ˙kazdego ˙trojkata ˙nalezy przygotowac ˙odpowiednia ˙palete ˙ktora ˙potem nalezy nalozyc na biezaca(np. ˙zorowac ˙z ˙odczytana ˙z ˙pamieci). ˙W ˙ten ˙sposob bedziemy mogli jednoczesnie wyswietlic kilka roznie cieniowanych trojkatow. Autor: Piotr Sokołowski |