Data wykonania ćwiczenia:
19 XII 2009
Teodor Kulej
I8Y1S1
Grafika komputerowa
Ćwiczenie labolatoryjne 1
Sprawozdanie
Prowadzący:
mgr inż. W.Sulej
Ćwiczenie labolatoryjne polegało na przekształceniu udostępnionego przez prowadzącego programu
tak, aby realizował zadane efekty graficzne.
Program symuluje pracę urządzenia rastrowego. Obsługa symulowanego urządzenia polega na
podawaniu wirtualnemu miotaczowi elektronów (zakładając, że mamy do czynienia z urządzeniem
typu wyświetlacz CRT) informacji o kolorze za pomocą poleceń:
ReadPixel(i,j) - to polecenie wczytuje piksel o współrzędnych i,j z pamięci obrazu i przesyła go do
urządzenia rastrowego
ReadTlo(N) to polecenie przesyła wysyła do rastra piksel odpowiadający tłu.
W programie wykorzystywana jest zmienna p oznaczająca aktualną klatkę w animacji efektu.
Zadanie 1
Zadanie to polegało na napisaniu algorytmu w wyniku którego na rastrze uzyskany zostanie obraz
odpowiadający efektowi zasłaniania obrazu w prawo. Kod opracowany przeze mnie wygląda
następująco:
public void Efekt1()
{
//L - maksymalna liczba linii
//K - maksymalna liczba kolumn
//j - zmienna pomocnicza
int klatka=p;
if (klatka >= L) klatka = 0;
for(int j=1;j<=L;j++)
for(int i=1;i<=K;i++)
{
if(false==(i>klatka)) ReadTlo(N);
else
ReadPixel(i,j);
}
p=klatka;
}
Rozwiązanie użyte przeze mnie odbiega od zastosowanego pierwotnie w zadaniu. Zamiast kilku
następujących po sobie pętli zastosowałem tu dwie pętle, jedną zagnieżdżoną w drugiej i w
zależności od warunku w poleceniu if kazałem programowi rysować albo tło albo odpowiedni piksel.
Warunek pozwala precyzyjnie określić numer klatki, i w razie gdyby numer kolumny był mniejszy niż
numer klatki, rysowania tła, a w przeciwnym wypadku obrazka.
Zadanie 2
Zadanie to polegało na napisaniu programu realizującego algorytm przewijania obrazu z góry na dół.
Oto napisany przeze mnie kod:
public void Efekt2()
{
int tmp=0;
if (p >= L){ p = 0;}
int klatka=p;
if (klatka >= L) klatka = 0;
for(int j=1;j<=L;j++)
{
for(int i=1;i<=K;i++)
{
ReadPixel( i ,(j+(K-klatka))%K+1);
}
tmp++;
}
p=klatka;
}
W tym zadaniu, podobnie jak w poprzednim wykorzystałem inną konstrukcję pętli głównych. Przy
przechodzeniu po kolejnych liniach numer odczytywanej linii jest zwiększany o różnicę
maksymalnego numeru linii i numeru klatkii, a następnie dzielony modulo przez ilość linii. Dzięki
temu obraz zaczyna się niżej, a ponad nim wyświetlane jest to, co nie mieści się w ramce u dołu.
Zadanie 3
W zadaniu tym należało napisać efekt przesuwania obrazu w kierunku górnego prawego
rogu. Aby uzyskać ten efekt korzystałem ze zmiennych pomocniczych zwiększających
czytelność kodu.
Oto napisany przeze mnie kod:
public void Efekt3()
{
int newX, newY;
if (p >= L){ p = 0;}
int klatka=p;
if (klatka >= L) klatka = 0;
for(int j=1;j<=L;j++)
{
for(int i=1;i<=K;i++)
{
newY=(i+K-klatka)%K ;
newX=(j+klatka)%L;
if( L-j>klatka && i>klatka)
ReadPixel( newY +1 ,newX+1);
else
ReadTlo(N);
}
}
p=klatka;
}
Wnioski:
Wyniki uzyskane przeze mnie są zgodne z zadanymi przez prowadzacego. Realizacja zadań nie była
trudna, o ile można było sobie wyobrazić schemat działania rastra i jakim przekształceniom trzeba
poddać współrzędne pobieranego obrazu, aby uzyskać zadany efekt. Mimo wszystko jednak
operowanie na wyższym poziomie abstrakcji, z dostępem do bufora obrazu, a nie do samego rastra,
jest wygodniejsze i prostsze w uzyciu.
Wyszukiwarka
Podobne podstrony:
lab1 sprawkosprawko lab1 ubytkowakarol sprawkografika lab1Lab1 RoboWorkskaskada sprawkogeodezja sprawko 3sprawko 48 (1)APD lab1SPALANIE SPRAWKO 7nLABORATORIUM CHEMIA I WYTRZYMALOSC MATERIALOW sprawko 1lab1 wprowadzenielab1(3)przykładowe sprawkoLab1 PA podstawy PSCAD v2Lab1 1 R3 lab11więcej podobnych podstron