WOJSKOWA AKADEMIA TECHNICZNA
Laboratorium NR 1 z przedmiotu:
Grafika komputerowa
Autor:
Michał Popławski
I9X6S1
Prowadzący:
mgr inż. Wojciech Sulej
Wstęp teoretyczny.
Aby rozwiązać to zadanie laboratoryjne należy wiedzieć w jaki sposób działa urządzenie rastrowe. Obraz generowany jest piksel po pikselu od lewej strony do prawej i wierszami w kierunku dolnej krawędzi ekranu. Gdy zostanie wygenerowany ostatni piksel (w prawym dolnym rogu) następuje przejście do początku wyświetlania i rozpoczyna się proces tworzenia kolejnej klatki. Programista może jedynie sterować generatorem adresu odczytu i dzięki temu decydować jakiej barwy piksel pojawi się na kolejnym miejscu, które będzie wyświetlało urządzenie rastrowe.
W dostępnym dla nas symulatorze efektów mamy dostępne dwie funkcje, które umożliwiały nam wykonanie przeznaczonych dla nas zadań:
-ReadPixel(i, j); - wybiera piksel o współrzędnych (i, j) z mapy obrazu wczytanego do programu
-ReadTlo(N); - rysuje piksel czarny.
Mapa obrazu jest mapą bitową i posiada następujące współrzędne:
j → <1;L> - numer wiersza
i → <1;K> - numer kolumny.
Odczytywanie przykładowego piksela wygląda w następujący sposób:
W programie używamy także zmiennej p, która jest aktualnym przesunięciem obrazu (w każdej klatce obraz przesunięty jest o p pikseli w daną stronę). Gdy p=0 mamy do czynienia z obrazem niezmienionym. Z każdą klatką p jest zwiększane o 1 i obraz powoli się przesuwa.
Analiza rozwiązań.
algorytm sterujący generatorem adresu odczytu w celu uzyskania efektu przewijania pionowego obrazu w kierunku dolnej krawędzi ekranu.
Kod źródłowy efektu:
public void Efekt1()
{
if (p >= L) p = 0;
for (int j = L-p+1; j <= L; j++)
{
for (int i = 1; i <= K; i++)
ReadPixel(i,j);
}
for (int j = 1; j <= L - p; j++)
{
for (int i = 1; i <= K; i++)
ReadPixel(i, j);
}
}
Efekt graficzny:
Analiza rozwiązania:
Obraz podczas przewijania w dół dzieli się na dwie części. Obie wczytują wiersze w całości dlatego pętle wewnętrzne są z zakresu od 1 -> K. Pętle zewnętrzne, które w tym przypadku odpowiedzialne są za przewijanie w dół, mają zakresy:
- część górna: L – p + 1 -> L,
- część dolna: 1 -> L – p.
Algorytm sterujący generatorem adresu odczytu w celu uzyskania efektu zasłaniania obrazu wzdłuż przekątnej ekranu w kierunku górnego prawego wierzchołka.
Kod źródłowy efektu:
public void Efekt2()
{
if (p >= L) p = 0;
for (int j = 1; j <= L-p; j++)
{
for (int i = 1; i <= p; i++)
ReadTlo(N);
for (int i = p + 1; i <= K; i++)
ReadPixel(i, j);
}
for (int j = 1; j <= p; j++)
{
for (int i = 1; i <= K; i++)
ReadTlo(N);
}
}
Efekt graficzny:
Analiza rozwiązania:
Efekt zasłaniania ma na celu pozostawić obraz w miejscu, w którym się znajduje, a na niego nakładać czarne tło, które w naszym przypadku ma zasłaniać po przekątnej w kierunku prawego górnego wierzchołka obrazu. Obraz należy podzielić na trzy części, dwie nadające tło i jedną wczytującą odpowiednie piksele. Pierwsza pętla zewnętrzna jest z zakresu od 1 -> L-p, w niej będą zawarte dwie pętle, z których pierwsza wczyta tło na obszar od 1 -> p, a na obszar od p+1 -> K wczytane zostaną piksele obrazu. Trzecia część jest to wczytanie tła w cały wiersz (1 -> K) w liniach od 1->p.
Algorytm sterujący generatorem adresu odczytu w celu uzyskania efektu przesuwania obrazu wzdłuż przekątnej ekranu w kierunku dolnego prawego wierzchołka.
Kod źródłowy efektu:
public void Efekt3()
{
if (p >= L/2) p = 0;
for (int j = 1; j <= p; j++)
{
for (int i = 1; i <= K; i++)
ReadTlo(N);
}
for (int j = 1; j <= L - p; j++)
{
for (int i = 1; i <= p; i++)
ReadTlo(N);
for (int i = 1; i <= K - p; i++)
ReadPixel(i, j);
}
}
Efekt graficzny:
Analiza rozwiązania:
Obraz należy podzielić na trzy części, dwie nadające tło i jedną wczytującą odpowiednie piksele. Pierwsza część jest to wczytanie tła w cały wiersz (1 -> K) w liniach od 1->p. Druga pętla zewnętrzna jest z zakresu od 1 -> L-p, w niej będą zawarte dwie pętle, z których pierwsza wczyta tło na obszar od 1 -> p, a na obszar od 1 -> K-p wczytane zostaną piksele obrazu.
Wnioski:
Wszystkie zadania zostały wykonane w poprawny sposób. Przy tworzeniu algorytmów sterujących generatorem adresu odczytu należy zwracać dużą uwagę na liczbę pikseli odczytywanych w jednej linii, gdyż zdublowanie jakiegoś piksela lub pominięcie sprawia, że na ekranie pojawiają się błędy i obraz nie zostaje wyświetlany w poprawny sposób (co wynika z generowania pikseli zgodnie z zasadami działania urządzenia rastrowego).