WOJSKOWA AKADEMIA TECHNICZNA
Sprawozdanie laboratoryjne z przedmiotu
GRAFIKA KOMPUTEROWA
Wykonujący ćwiczenie: Paweł Madejski
Prowadzący: dr inż. Marek Salamon
Data wykonania: 27.10.2008r
Grupa szkoleniowa: I7X1S1
Treść zadania (zestaw 12):
Napisać algorytm sterujący generatorem adresu odczytu w celu uzyskania efektu zasłaniania poziomego obrazu w kierunku prawej strony ekranu.
Napisać algorytm sterujący generatorem adresu odczytu w celu uzyskania efektu przewijania pionowego obrazu w kierunku dolnej krawędzi ekranu.
Napisać algorytm sterujący generatorem adresu odczytu w celu uzyskania efektu przesuwania obrazu wzdłuż przekątnej ekranu w kierunku dolnego prawego wierzchołka.
Opis zadania:
Na podstawie programu „Symulator efektów” symulującego efekty graficzne uzyskiwane na ekranie rastrowego mieliśmy zaprojektować algorytmy operujące z obiektami graficznymi na podstawie zadanych zadań.
rys. interfejs programu używanego na laboratorium
Aby dokładniej zrozumieć operacje wykonywane w algorytmach przedstawię pokrótce zasadę działania urządzenia graficznego wyposażonego w rastrową technikę wyświetlania obrazu.
Grafika rastrowa - reprezentacja obrazu za pomocą pionowo-poziomej siatki odpowiednio kolorowanych pikseli na monitorze komputera, drukarce lub innym urządzeniu wyjściowym.
(źródło: wikipedia.pl)
W naszym przypadku do obsługi pikseli wyświetlanych na ekranie używamy funkcji:
ReadPixel(i,j) - funkcja wstawiająca w aktualne miejsce na ekranie zawartości piksela spod komórki i,j (z poprzednio zapamiętanej pamięci obrazu).
ReadTlo(N) - funkcja wstawiająca w miejsce bieżącego aktywnego piksela na ekranie koloru o wartości N (w naszym przypadku jest to kolor czarny).
L - ilość wierszy obrazu.
K - ilość kolumn obrazu.
i,j - odpowiednio położenia w wierszu (i) i kolumnie (j).
Wykonanie zadań:
algorytm sterujący generatorem adresu odczytu w celu uzyskania efektu zasłaniania poziomego obrazu w kierunku prawej strony ekranu.
1. public void Efekt1(){
2. //efekt: ZAD1 zasłanianie poziome obrazu w kierunku prawej strony
3. if(p >= L) p = 0;
4.
5. for (int j = 1; j <= L; j++){
6. for (int i = 1; i <= p; i++)
7. ReadTlo(N);
8. for (int i = p + 1; i <= K; i++)
9. ReadPixel(i, j);
10. }
11. }
Dana funkcja składa się z trzech pętli for, dwóch wewnętrznych odpowiadających za wypełnienie kolumn i jednej zewnętrznej, która odpowiada za każdą kolejną linię (linijka 5. listingu) Zmienna p określa aktualne położenie początku “ czarnej dziury”, która pochłania panią na fotografii z każdą kolejną klatką animacji. Jeśli jednak nasza “dziura” pochłonie już wszystko (będzie większa bądź równa od ilości kolumn równej 256) zniknie. Za to działanie odpowiedzialna jest linijka 3. naszego listingu. Za wypełnianie czarnym kolorem pierwszych p kolumn pikseli w linii jest podpowiedzialna pętla z linii 6 oraz funkcja ReadTlo(N); Po wypełnienu tych pierwszych p pikseli w danym wierszu trzeba uzupełnić kolejne K-p pikseli w których powininna zostać wyświetlona zawartość obrazu zasłanianego (linie 8-10).
rys. działanie funkcji Efekt1()
algorytm sterujący generatorem adresu odczytu w celu uzyskania efektu przewijania pionowego obrazu w kierunku dolnej krawędzi ekranu.
1. public void Efekt2(){
2. //efekt: ZAD 2 przewijanie pionowe obrazu w kiejrunku dolnej krawedzi obrazu
3.
4. if(p >= L) p = 0;
5.
6. for (int j = L - p; j <= L; j++){
7. for (int i = 1; i <= K; i++)
8. ReadPixel(i, j);
9. }
10. for (int j = 1; j <= L - p; j++){
11. for (int i = 1; i <= K; i++)
12. ReadPixel(i, j);
13. }
14. }
Funkcja Efekt2() praktycznie nie wiele różni się od poprzednio opisanej. Zasadniczą różnicą jest zmiana przeznaczenia wskaźnika p, który w tym przypadku odpowiada za wyznaczenie wiersza w któeym kończy się i zarazem zaczyna obraz. Wydaje się to trochę dziwne (koniec i początek w tym samym miejscu) ale w rzeczywistości tak własnie jest. Tutaj mamy dwie pętle zewnętrzne, z których każda ma swoją pętlę wewnętrzną. Jest tak ponieważ najpierw trzeba wypełnić wszystkie kolumny w początkowych wierszach (odwzorowywują one koniec obrazka), a dopiero pożniej pozostałą część przesuniętą w tym przypadku do dołu. W tym algorytmie nie używamy funkcji ReadTlo ponieważ nie wypełniamy żadnego obszaru tłem tylko w miejsce odsłonięte przesunięciem wstawiamy linie która znikneła nam po przesunięciu (tworząc swego rodzaju cykl).
rys. działanie funkcji Efekt2()
algorytm sterujący generatorem adresu odczytu w celu uzyskania efektu przesuwania obrazu wzdłuż przekątnej ekranu w kierunku dolnego prawego wierzchołka.
1. public void Efekt3(){
2. //efekt: ZAD 3 przesuwanie obrazu wzdłuż przekątnej ekranu w kierunku dolnego
3. //prawego wierzchołka
4.
5. if(p >= L) p = 0;
6.
7. for (int j = 1; j <= L; j++){
8. if (j <= p)
9. for (int i = 1; i <= K; i++)
10. ReadTlo(N);
11. else{
12. for (int i = 1; i <= K; i++){
13. if (i <= p) ReadTlo(N);
14. else ReadPixel(i - p, j - p);
15. }
16. }
17. }
18. }
Efekt3() jest zarazem ostatnią jak i najtrudniejszą funkcją w całym zadaniu laboratoryjnym. Oprócz prostych pętli for zawiera ona również instrukcje warunkowe które wskazują miejsca w których powinniśmy użyć odpowiednich pętli, bądź funkcji. Wiadomo, że jeśli przesuniemy jakiś przedmiot zawsze pod nim jest jakieś tło. Zakładając więc, że nasze zdjęcie było umieszczone w albumie z czarnymi stronicami, a my chcemy je wyjąć w kierunku dolnego prawego wierzchołka naszego albumu to po każdym “małym ruchu” odsłaniane będą kolejne czarne części pustych stronic albumu (jak na rysunku). Trzeba było też znów posłużyć się naszą niezastąpioną zmienną p. Teraz oprócz wskaźnika miejsca podziału między obrazem (ReadPixel), a tłem (ReadTlo) pozwala nam na odnalezienie lewego górnego wierzchołka, od którego zaczynamy rysować (zczytywać pixele)naszego tła.
rys. działanie funkcji Efekt3()