Referat Algorytm Bresenhama
description
Transcript of Referat Algorytm Bresenhama
SPOŁECZNA WYŻSZA SZKOŁAPRZEDSIĘBIORCZOŚCI I ZARZĄDZANIA
W ŁODZI
WYDZIAŁ STUDIÓW MIĘDZYNARODOWYCHI INFORMATYKI
KIERUNEK INFORMATYKA
JACEK LEWIŃSKINr albumu: 50564
ALGORYTMY RYSOWANIA WYCINKA OKRĘGU W GRAFICE RASTROWEJ
Przedmiot realizowany w ramach Projektu: „Modernizacja i rozwój systemu nauczania informatyki w Społecznej Wyższej Szkole Przedsiębiorczości i Zarządzania”
współfinansowany ze środków Unii Europejskiej w ramach Europejskiego Funduszu Społecznego, Program Operacyjny Kapitał Ludzki
ŁÓDŹ 2011Wstęp
Myśląc o współczesnych komputerach, serwerach, stacjach graficznych i podziwiając
ich potęgę niezmiernie rzadko uświadamiamy sobie, że wzrost ich możliwości w kreowaniu
naszego obecnego świata polega w znacznym stopniu nie tylko na wynajdowaniu coraz
nowszych technologii ale również na opracowywaniu matematycznych algorytmów
stanowiących podstawę pracy obliczeniowej sprzętu. Wiele algorytmów znamy od dość
dawna i stanowią one podstawę przeliczania punktów budujących obraz. Do takich
algorytmów należy Algorytm Bresenhama.
Algorytm służy do rasteryzacji krzywych 2D, czyli jak najlepszego przybliżania
matematycznych krzywych na siatce pikseli. Jego prosta implementacja umożliwia obliczenia
na liczbach całkowitych oraz zmiennoprzecinkowych. Najczęściej jednak wykorzystujemy te
pierwsze (źródło:[3]). Prostota jest siłą tego algorytmu. Główna pętla algorytmu wykorzystuje tylko
dwie operacje porównania i dodawania.
Algorytm rysowania wycinka okręgu
Przy rasteryzacji okręgu będziemy potrzebować tylko jego ośmiokrotnej symetrii.
Rasteryzacja będzie obejmowała tylko jeden oktant. Pozostałe otrzymamy poprzez odbicie
symetryczne tej jednej części okręgu.
Rysunek 1 Rasterowany oktet (źródło:[3])
Pętla algorytmu będzie wykonywać się na współrzędnej x; punktem początkowym
będzie „szczyt” okręgu o współrzędnych (0, r). Punktem końcowym będzie ten w którym
nachylanie stycznej przekroczy − 1. Jak wiadomo funkcja jednej zmiennej opisująca połówkę
okręgu ma postać
dlatego końcowa wartość współrzędnej x wyniesie
Nie ma potrzeby dzielenia przez pierwiastek z dwóch, a to dlatego, że f(x0) = x0, więc
współrzędna x będzie rosnąć od zera, a y maleć od r do chwili, aż zrówna się z x.
Rysunek 2 Rasteryzacja wycinka koła (źródło:[5])
Możemy teraz przystąpić do obliczeń przyrostów; dla formalności przypomnę równanie
uwikłane dla okręgu (przyjmuje ono wartości ujemne dla punktów z wnętrza okręgu)
Wartość początkowa d wynosi f(0 + 1, r − 0.5) = − r + 1.25 i tak jak w przypadku linii
pojawiła się wartość ułamkowa. Rozwiązanie jest podobne — przemnożenie d przez 4.
Pamiętając, że y maleje, obliczamy różnice pierwszego rzędu:
deltaA = f(x + 2, y − 0.5) − f(x + 1, y − 0.5) = 2x + 3,
deltaB = f(x + 2, y − 1.5) − f(x + 1, y − 0.5) = 2x + 2y + 5.
Jak widać zależą one od chwilowych wartości współrzędnych x i y. Zostaną więc policzone
różnice drugiego rzędu.
Wartości początkowe w punkcie (0, r) — bez przesunięcia o wektor [1, 0.5] — wynoszą:
deltaA(0, r) = 3,
deltaB(0, r) = − 2r + 5.
Przy wyborze punktu A wzrasta wyłącznie współrzędna x, więc:
deltaA(A) = deltaA(x + 1, y) − deltaA(x, y) = 2,
deltaB(A) = deltaB(x + 1, y) − deltaB(x, y) = 2.
natomiast po wybraniu B maleje dodatkowo y:
deltaA(B) = deltaA(x + 1, y − 1) − deltaA(x, y) = 2
deltaB(B) = deltaB(x + 1, y − 1) − deltaB(x, y) = 4
Jak widać przyrosty drugiego rzędu już nie zależą od x ani y.
Pamiętamy, że d zostanie przemnożone przez 4.
Sposób wybierania odpowiednich pikseli przedstawia rysunek:
Rysunek 3 Rasteryzacja wycinka koła (źródło:[4])
Implementacja Algorytmu Bresenhama
void plotCircle(int xm, int ym, int r){ int x = -r, y = 0, err = 2-2*r; /* II. Quadrant */ do { setPixel(xm-x, ym+y); /* I. Quadrant */ setPixel(xm-y, ym-x); /* II. Quadrant */ setPixel(xm+x, ym-y); /* III. Quadrant */ setPixel(xm+y, ym+x); /* IV. Quadrant */ r = err; if (r > x) err += ++x*2+1; /* e_xy+e_x > 0 */ if (r <= y) err += ++y*2+1; /* e_xy+e_y < 0 */ } while (x < 0);}
Implementacja Algorytmu Bresenhama (źródło:[6])
BIBLIOGRAFIA
1. J.E. Bresenham, Algorithm for computer control of a digital plotter, IBM Systems Journal, vol. 4, no. 1, 1965.
2. M. Jankowski, Elementy grafiki komputerowej, WNT, 2006.3. W. Muła, Algorytm Bresenhama - http://0x80.pl/articles/bresenham.html4. dr Przybyszewski K., wykłady w formacie pdf
http://www.kursy.jpkps.pl/login/index.php stan na dzień 10.01.2011.5. Wikipedia http://en.wikipedia.org/wiki/Midpoint_circle_algorithm6. The Beauty of Bresenham's Algorithm http://free.pages.at/easyfilter/bresenham.html