Nie obrażaj więc mojej inteligencji poprzez czynione na pokaz zaniżanie własnej.
POLITECHNIKA KOSZALIŃSKA - WYDZIAŁ ELEKTRONIKI
URZĄDZENIA ZEWNĘTRZNE Ćwiczenie laboratoryjne N 3 Ćwiczenie laboratoryjne N 3 TEMAT: OBSŁUGA KART GRAFICZNYCH Z WYKORZYSTANIEM PRZERWAŃ Celem ćwiczenia jest zapoznanie się z przerwaniami obsługującymi karty graficzne, oraz z podstawowymi algorytmami rysowania linii prostych i krzywych. Przygotowanie pracy laboratoryjnej wykonywane przed ćwiczeniem. 1. Zapoznaj się z przerwaniem BIOS'u o numerze 10h. W szczególności z jego funkcjami 00h i 0Ch, obsługującymi karty graficzne. 2. Zapoznaj się z dyrektywą MACRO i EQU. 3. Zastanów się w jaki sposób narysować odcinek pionowy lub poziomy z wykorzystaniem informacji zawartych w pkt. 1 i 2. 4. Zapoznaj się z algorytmem Bresenhama dla odcinków innych niż pionowe lub poziome. Stwórz schemat blokowy dla tego algorytmu uwzględniając specyfikę układu współrzędnych na ekranie monitora. Kolejność wykonywania ćwiczenia: I. Napisz program w Asemblerze wyświetlający na monitorze w dowolnym punkcie ekranu pojedynczy pixel w rozdzielczości 320x200 w kolorze białym i sprawdź jego działanie. II. Wykorzystując dyrektywę MACRO rozbuduj wcześniejszy program, tak aby w makrze znajdował się fragment kodu odpowiedzialny za umieszczenie piksela w zadanym punkcie ekranu. III. Przekształć program tak aby rysował odcinki o parametrach zadanych w Tabeli I. IV. Używając algorytmu Bresenhama połącz linią ukośną dwa (dowolne) końce linii uzyskanych z poprzedniego programu. Algorytm Bresenhama Założenia wstępne algorytmu Bresenhama: • kwadratowy raster • początkiem wektora jest początek układu współrzędnych – punkt (0, 0) • kat nachylenia α ≤ 45° Idea algorytmu Bresenhama jest optymalny, względem bieżącego punktu, wybór punktu następnego. Jak widzimy na rysunku (Rys. 2) wybór taki dokonuje sie na podstawie minimalnego błędu popełnianego przy liczeniu odległości „oczek” rastra od rzeczywistej linii. 1 Mimo ze ograniczamy sie do pierwszej ćwiartki, to rozszerzenie do pozostałych ćwiartek jest natychmiastowe i trywialne. 1 z 4 POLITECHNIKA KOSZALIŃSKA - WYDZIAŁ ELEKTRONIKI URZĄDZENIA ZEWNĘTRZNE Ćwiczenie laboratoryjne N 3 Drawing 1: Wybór następnego punktu w algorytmie Bresenhama Punkt początkowy wektora P 1 (0, 0) ogólnie P 1 (x 1 , y 1 ) Punkt końcowy wektora P 2 (dx, dy) ogólnie P 2 (x 2 , y 2 ) gdzie dx = x 2 − x 1 i dy = y 2 − y 1 z czego y = (dy/dx)x. e 1 = (dy/dx)(x + 1) − y e 2 = 1 − e 1 = 1 − (dy/dx)(x + 1) + y (2) Chcąc określić, dla wyboru którego z punktów E(x+1, y) czy NE(x+1, y+1) popełniamy większy błąd zbadamy różnice: e 1 − e 2 = 2(dy/dx)(x + 1) − 2y − 1 (3) zgodnie z założeniem, dla dx > 0 mnożąc obie strony przez dx nie zmieniamy znaku różnicy: (e 1 − e 2 )dx = 2(x + 1)dy − 2ydx − dx (4) Wprowadźmy zmienna decyzyjna δ jako: δ = (e 1 − e 2 )dx = 2(x + 1)dy − 2ydx − dx (5) Znak δ decyduje o wyborze punktu bliższego rzeczywistej prostej. jeśli δ < 0, to e 1 < e 2 , zatem należy wybrać punkt E(x + 1, y) jeśli δ ≥ 0, to e 1 ≥ e 2 , zatem należy wybrać punkt NE(x + 1, y + 1). Kolejne wartości bieżących x, y i δ wyznaczają formuły rekurencyjne: jeśli wybrano punkt E(x + 1, y): x i+1 = x i + 1 y i+1 = y i δ i+1 = 2(x i + 1 + 1)dy − 2y i dx − dx = 2(x i + 1)dy − 2y i dx − dx + 2dy = δ i + 2dy (6) jeśli wybrano punkt NE(x + 1, y + 1): x i+1 = x i + 1 y i+1 = y i + 1 δ i+1 = 2((x i + 1) + 1)dy − 2(y i + 1)dx − dx = δ i + 2(dy − dx) (7) Ponieważ dx i dy są stałymi, można dodatkowo uprościć obliczenia przyjmując: incrNE = 2dy − 2dx incrE = 2dy (8) a mnożenia zastąpić przesunięciem w lewo. 2 z 4 POLITECHNIKA KOSZALIŃSKA - WYDZIAŁ ELEKTRONIKI URZĄDZENIA ZEWNĘTRZNE Ćwiczenie laboratoryjne N 3 Tabela I: Długość [pixel] Lp. Kolor Kształt Pkt 'styku' 1 jasnoniebieski 30 ┌ 10, 10 2 jasnozielony 60 ┐ 300,10 3 jasno siny 90 └ 10,180 4 jasnoczerwony 120 ┘ 300,180 5 różowy 20 ├ 150,100 6 żółty 40 ┤ 150,100 7 biały 80 ┬ 150,100 8 zielony 160 ┴ 190,100 9 czerwony 25 ┼ 100,100 10 niebieski 50 ┌ 50,50 11 siny 100 ┐ 100,100 12 fioletowy 150 ┌ 5,5 13 brązowy 30 ┐ 200,20 14 jasnoszary 60 └ 70,100 15 szary 90 ┘ 100,100 16 jasnoniebieski 120 ├ 150,10 17 siny 20 ┤ 150,100 18 zielony 40 ┬ 30,30 19 jasnoczerwony 80 ┴ 100,120 20 jasnoszary 160 ┼ 160,160 Algorytm Bresenhama: procedure Bresenham(x0, y0, x1, y1, kolor: integer); var Δx,Δy, incrE, incrNE, δ, x, y: integer; begin Δx := x1 − x0; Δy := y1 − y0; δ := 2 * Δy − Δx; (* Wartość początkowa δ *) incrE := 2 * Δy; (* Inkrementacja przy wyborze punktu E *) incrNE := 2 * (Δy − Δx); (* Inkrementacja przy wyborze punktu NE *) x := x0; y := y0; PutPixel(x, y, kolor); (* Piksel początkowy *) 3 z 4 POLITECHNIKA KOSZALIŃSKA - WYDZIAŁ ELEKTRONIKI URZĄDZENIA ZEWNĘTRZNE Ćwiczenie laboratoryjne N 3 while x < x1 do begin if δ <= 0 then begin (* Wybrano E *) δ := δ + incrE; x := x + 1; end else begin (* Wybrano NE *) δ := δ + incrNE; x := x + 1; y := y + 1; end; PutPixel(x, y, kolor); end; (* while *) end; (* Bresenham *) Przykładowe pytania i polecenia: 1. Omów działanie napisanych programów. 2. Do czego służy MACRO? 3. Do czego służy EQU? 4. Omów zasadę działania algorytmu Bresenhama. 5. Do czego służy przerwanie 10h, 0Ch? 6. Co oznacza dyrektywa .STACK? 7. Czym różni się procedura od makra? Literatura S. Kruk: Programowanie w języku Assembler , PLJ, W-wa, 1992. G. Syck: Turbo Assembler. Biblia użytkownika , LT&P, W-wa, 1994. M. Gieroń: Przerwania systemowe i programy rezydentne , Karat, Tarnów, 1993. S. Kruk: Turbo debugger PLJ, W-wa, 1995. R. Goczyński, M.Tuszyński: Mikroprocesory 80286,80386 i i486 , Help, W-wa, 1991 P. Metzger, A. Jełowicki: Anatomia PC , Helion, Gliwice, 1997 http://www.republika.pl/wmula/prog/bresenham.html 4 z 4 |
Menu
|