You are on page 1of 5

SPOŁECZNA WYŻSZA SZKOŁA

PRZEDSIĘBIORCZOŚCI I ZARZĄDZANIA
W ŁODZI
WYDZIAŁ STUDIÓW MIĘDZYNARODOWYCH
I INFORMATYKI

KIERUNEK INFORMATYKA

JACEK LEWIŃSKI
Nr 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Ź 2011
Wstę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.html
4. 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_algorithm
6. The Beauty of Bresenham's Algorithm http://free.pages.at/easyfilter/bresenham.html

You might also like