Michał Polkowski
gr. I8Y3S1
Data wykonania ćwiczenia:
2.12.2009r.
WOJSKOWA AKADEMIA TECHNICZNA
Laboratorium Grafiki komputerowej
SPRAWOZDANIE
z ćwiczenia laboratoryjnego nr 1.
Prowadzący:
mgr inż. Wojciech Sulej
Do dyspozycji mamy program, który realizuje pewne funkcje związane z
przekształcaniem obrazu wczytanego z pliku. Zadaniem jest przekształcenie poszczególnych
procedur tak, aby realizowały funkcje zadane przez prowadzącego.
Piksele wczytywane są do komórek pamięci obrazu kolejno wierszami począwszy od
lewego górnego rogu. Po tych komórkach przebiega raster wczytujący (wyświetlający) piksel
korzystając z następujących funkcji:
•
ReadPixel(i, j) – wczytanie do komorki wyświetlanego obrazu – piksela obrazu
wczytanego z pliku o współrzędnych (i, j);
•
ReadTlo(N) – wczytanie do komórki wyświetlanego obrazu – piksela o kolorze
określonym przez stałą N (tutaj – czerń);
Wykorzystywana jest także zmienna p, oznaczająca aktualną klatkę w animacji efektów.
Zadanie 1.
Napisac algorytm sterujacy generatorem adresu odczytu w celu uzyskania efektu zaslaniania
poziomego obrazu w kierunku lewej strony obrazu.
Przekształcona przeze mnie funkcja wygląda następująco:
public void Efekt1()
{
//efekt: zasłanianie
if (p >= K) p = 0;
for (int j = 1; j <= L; j++)
{
//wczytuje obraz do czarnego paska
for (int i = 1; i <= K - p; i++)
ReadPixel(i, j);
//wczytuje pasek czarnego tla
for (int i = 1; i <= p; i++)
ReadTlo(N);
}
}
Warunek if(p >= K) p = 0; sprawdza czy przekształceniu uległ już cały obraz. Obraz ma
rozmiar 256x256 pikseli, dlatego maksymalna ilosc klatek dla jednego pełnego
przekształcenia wynosi właśnie 256. Gdy wartosc p przekroczy ta granice przypisujemy jej
wartosc 0, czyli proces przekształcania obrazu wykonuje się od początku, zatacza pętlę.
Pierwsza pętla for przechodzi przez kolejne kolumny obrazu, kolejne pętle –
zagnieżdźone – wczytują odpowiednio piksele obrazu do pewnego momentu, a następnie
piksele tła (czerń). W ten sposób obraz jest „zasłaniany” w każdej kolejnej klatce od prawej
strony w lewym kierunku.
Efekt działania programu (dwie wybrane klatki):
Zadanie 2.
Napisac algorytm sterujacy generatorem odczytu w celu uzyskania efektu przewijania
pionowego w kierunku gornej krawedzi ekranu.
Przekształcona przeze mnie funkcja wygląda następująco:
public void Efekt2()
{
//efekt: przewijanie si
ę
obrazu do gory
if (p >= L) p = 0;
for (int j = 1 + p; j <= L; j++)
{
for (int i = 1; i <= K; i++)
ReadPixel(i, j);
}
for (int j = 1; j <= p; j++)
{
for (int i = 1; i <= K; i++)
ReadPixel(i, j);
}
}
Podobnie jak w poprzednim zadaniu zmienna p, oznaczająca aktualną klatkę, może
przyjmować wartość maksymalną L = 256, po czym zeruje się i tak proces się zapętla.
Najpierw wczytywane są wiersze obrazu od pierwszego+p wiersza (p – aktualna
klatka), a następnie wiersze wcześniej pominięte, tzn od pierwszego do ostatniego-p wiersza.
W ten sposób obraz „przewija się” w pionie w kierunku górnej krawędzi.
Efekt działania programu (dwie wybrane klatki):
Zadanie 3.
Napisac algorytm sterujacy generatorem adresu odczytu w celu uzyskania efektu
przesuwania obrazu wzdluz przekatnej ekranu w kierunku gornego prawego wierzchołka.
Przekształcona przeze mnie funkcja wygląda następująco:
public void Efekt3()
{
//efekt: przewijanie po przek
ą
tnej w prawy-gorny rog
if (p >= L) p = 0;
for (int j = 1 + p; j <= L; j++)
{
for (int i = 1; i <= p; i++)
ReadTlo(N);
for (int i = 1; i <= K - p; i++)
ReadPixel(i, j);
}
for (int j = 1; j <= p; j++)
for (int i = 1; i <= K; i++)
ReadTlo(N);
}
Procedura wczytuje kolejne wiersze obrazu od 1+p wiersza – tzn. omija wiersze ktore
wyszly poza górną krawędź ekranu. Wczytuje kolumny począwszy od p pikseli tła – bo
obrazek przesuwa się z każdą klatką o 1px w prawo – a następnie K-p pikseli obrazu – p
pikseli wyszło poza krawędź w klatce numer p. Na koniec wczytywany jest prostokąt
czarnego tła wypełniający pozostałą przestrzeń obrazu.
Efekt działania programu (dwie wybrane klatki):
Wnioski:
Wyniki w każdym z zadań są zgodne z oczekiwaniami. Zrealizowanie tych zadań nie
było trudne, obsługa funkcji ReadPixel() i ReadTlo() oraz zrozumienie działania procedury
wyświetlania obrazu było dosyć łatwe. Myślę, że mogłbym stworzyć inne, bardziej
skomplikowane efekty, wykorzystując wiedzę nabytą w ćwiczeniu.