Sprawozdanie z ćwiczeń laboratoryjnych z przedmiotu Grafika komputerowa
Imię i nazwisko: |
Grupa szkoleniowa: |
Data:
|
Prowadzący zajęcia: |
|
Andrzej Sobolewski |
I7X6S1 |
31.10.2008 |
dr inż. Marek Salamon |
|
Zestaw: |
Ocena: |
|||
7 |
|
|||
|
|
Zadanie 1.
I. Treść zadania:
Napisać algorytm sterujący generatorem adresu odczytu w celu uzyskania efektu zasłaniania poziomego obrazu w kierunku lewej strony ekranu.
II. Kod źródłowy z rozwiązanym zadaniem:
public void Efekt1(){
if (p>=L) p = 0;
for (int j=1; j<=L; j++){
for (int i=1; i<=K-p; i++)
ReadPixel(i, j);
for (int i=K-p; i<K; i++)
ReadTlo(N);
}
}
L- liczba linii,
K- liczba kolumn.
III. Sposób rozwiązania zadania:
Instrukcja if, która rozpoczyna kod sprawdza, czy wartość klatki (zmienna p) jest większa lub równa wysokości obrazu. Jeżeli tak jest zmienna p przyjmuje wartość 0. Wtedy przy wejściu do dalszych pętli obraz zostanie przeczytany w całości. Wyświetlanie efektu zaczyna się od górnego lewego wierzchołka. Piksele wczytywane są wierszami od góry do dołu, jak również kolumnami od lewej do prawej strony. Dzieje się tak, ponieważ obraz nie zmienia swojego położenia i jest tylko poddawany efektowi zasłaniania poziomego w kierunku lewej strony ekranu. Na końcu każdego wiersza po wczytaniu piksela funkcją ReadPixel(i, j), następuje wczytanie tła stopniowo przysłaniającego obraz. Liczba pikseli wczytywanych za każdym obrotem pętli zewnętrznej maleje, natomiast liczba wczytań tła funkcją ReadTlo(N) rośnie. Dzieje się tak za sprawą wcześniej już wspomnianej zmiennej p zawierającej wartość aktualnej wartości klatki, która jest inkrementowana poza wywołaniem funkcji Efekt1. Gdy cały obraz zostanie zasłonięty, następuje wyzerowanie zmiennej p i efekt rozpoczyna się od nowa.
IV. Uzyskane wyniki:
Dzięki funkcji Efekt1() uruchomionej w programie napisanym w C# uzyskałem efekt zasłaniania poziomego obrazu w kierunku lewej strony ekranu.
Zadanie 2.
I. Treść zadania:
Napisać algorytm sterujący generatorem adresu odczytu w celu uzyskania efektu przesuwania pionowego obrazu w kierunku dolnej krawędzi ekranu.
II. Kod źródłowy z rozwiązanym zadaniem:
public void Efekt2(){
if (p>=L) 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<=K; i++)
ReadPixel(i, j);
}
L- liczba linii,
K- liczba kolumn.
III. Sposób rozwiązania zadania:
Powyższą funkcję podobnie jak w poprzednim zadaniu rozpoczyna warunek if związany ze zmienną p, który jest odpowiedzialny za rozpoczynanie efektu od nowa. Wyświetlanie obrazu rozpoczyna się w lewym górnym wierzchołku. Piksele wywoływane są od góry do dołu wierszami oraz wewnątrz nich od lewej do prawej kolumnami. Do uzyskania zadanego efektu używam zagnieżdżonych pętli for wczytujących tło oraz piksele. Służą do tego dwie dostarczone funkcje. Pierwsza z nich ReadTlo(N) wczytuje pod piksel, który aktualnie będzie wyświetlany, zadany kolor tła. Funkcja ReadPixel(i, j) natomiast wczytuje z pamięci obrazu do wyświetlenia piksel o wartościach współrzędnych spod zmiennych i oraz j. Wyświetlanie efektu rozpoczyna się od wczytania tła. Wczytywać trzeba wszystkie kolumny w wierszach. Liczba wierszy inkrementuje się za każdym wejściem do funkcji, które to realizuje umieszczona w programie Form1.cs zewnętrzna pętla. Następnie wczytywane są piksele obrazu. Podobnie jak przy wyświetlaniu tła, liczba wczytywanych kolumn w wierszach jest równa K i się nie zmienia przy każdym wejściu do funkcji Efekt2(). Zmianie ulega natomiast liczba wierszy, która się zmniejsza, ponieważ obraz jest przesuwany ku dolnej krawędzi ekranu i stopniowo znika. Wczytywanie pikseli rozpoczyna się po wpisaniu tła i wczytywana jest tylko górna część obrazka z pamięci obrazu, na którą starczy miejsca (liczby wierszy), które wyznaczone jest przez warunek j<=L-p pętli for. Gdy cały obraz zostanie zasłonięty, następuje wyzerowanie zmiennej p i efekt rozpoczyna się od nowa.
IV. Uzyskane wyniki:
Dzięki funkcji Efekt2() uruchomionej w programie napisanym w C# uzyskałem efekt przesuwania pionowego obrazu w kierunku dolnej ekranu.
Zadanie 3.
I. Treść zadania:
Napisać algorytm sterujący generatorem adresu odczytu w celu uzyskania efektu przewijania obrazu wzdłuż przekątnej ekranu w kierunku górnego lewego wierzchołka.
II. Kod źródłowy z rozwiązanym zadaniem:
public void Efekt3(){
if (p>=L) p = 0;
for (int j=1; j<L; j++){
for (int i=1+p; i<=K; i++)
ReadPixel(i, j);
for (int i=1; i<=p; i++)
ReadPixel(i, j);
}
}
L- liczba linii,
K- liczba kolumn.
III. Sposób rozwiązania zadania:
Powyższą funkcję podobnie jak w poprzednim zadaniu rozpoczyna warunek if związany ze zmienną p, który jest odpowiedzialny za rozpoczynanie efektu od nowa. Wyświetlanie obrazu rozpoczyna się w lewym górnym wierzchołku. Piksele wywoływane są od góry do dołu wierszami oraz wewnątrz nich od lewej do prawej kolumnami. Do uzyskania zadanego efektu używam zagnieżdżonych pętli for wczytujących piksele. Służy do tego dostarczona funkcja ReadPixel(i, j), która wczytuje z pamięci obrazu do wyświetlenia piksel o wartościach współrzędnych spod zmiennych i oraz j. W tym przypadku tło nie musi być wczytywane. Działanie efektu rozpoczyna się od wczytywanie pikseli, do czego służą zagnieżdżone pętle for. Pierwsza z nich jest odpowiedzialna za kolejne wczytywanie elementów do wierszy. Pierwsza wewnętrzna pętla for wczytuje obraz od lewej strony wyświetlania z przesunięciem w pamięci obrazu o p (liczba klatek). Gdy kończy swoje działanie, druga wewnętrzna pętla for wczytuje z pamięci obrazu piksele bez przesunięcia, czyli p pierwszych kolumn z pamięci. W obydwu przypadkach liczba kolumn się zmienia, dzięki inkrementacji zmiennej p na zewnątrz funkcji. Dzięki warunkowi j<L w pętli for (int j=1; j<L; j++) nie są wczytywane piksele z ostatniego wiersza pamięci obrazu co pozwala stworzyć zadany efekt. Gdy cały obraz zostanie zasłonięty, następuje wyzerowanie zmiennej p i efekt rozpoczyna się od nowa.
IV. Uzyskane wyniki:
Dzięki funkcji Efekt3() uruchomionej w programie napisanym w C# uzyskałem efekt przewijania obrazu wzdłuż przekątnej ekranu w kierunku górnego lewego wierzchołka.
Wnioski:
Odczytywanie pikseli w sposób niezależny od rodzaju zapisu pozwala wyzwolić na urządzeniu zobrazowania różne przydatne efekty.
Przy niewłaściwym ustawieniu znaków nierówności, np. „>” lub „<” zamiast „>=” lub „<=” i odwrotnie w warunkach sprawdzających pętli for, powoduje wyświetlanie nierównych krawędzi obrazów, bądź powstawanie efektów różnych od tych które chcemy uzyskać. Jest tak w przypadku funkcji Efekt3(), gdzie w pętli for (int j=1; j<L; j++) warunek j<L po zmianie na j<=L tworzy przewijanie obrazu w lewą stronę zamiast wzdłuż przekątnej ekranu w kierunku górnego lewego wierzchołka.