background image

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 

 

 

 

 

 

 

 

 

 

 

 

 

background image

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. 

 

 

 

 

 

background image

 

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): 

 

background image

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.