Algorytm Bresenhama
Algorytm Bresenhama jest wykorzystywany do rasteryzacji krzywych płaskich, co oznacza, że umożliwia ich jak najlepsze odwzorowanie na siatce pikseli. W 1965 roku Jack Bresenham stworzył metodę rasteryzacji odcinków, która później została zaadaptowana do rysowania innych obiektów, takich jak okręgi i elipsy.
Główna moc algorytmu wynika z jego prostoty; koszt umieszczenia jednego piksela to zaledwie jedno porównanie i jedno dodawanie (w przypadku odcinków) lub jedno porównanie i dwa dodania (dla okręgów i elips). Dodatkowo, algorytm operuje na liczbach całkowitych, co czyni obliczenia bardzo szybkim procesem na wszystkich mikroprocesorach.
Metoda ta pozwala w prosty sposób określić, które piksele są najbliżej rasteryzowanego obiektu (np. odcinka). Zakładając, że wcześniej algorytm zapisał piksel o współrzędnych
(x, y), w kolejnym kroku algorytm może zapisać piksel albo
(x + 1, y) (ruch poziomy), albo
(x + 1, y + 1) (ruch ukośny). Wybór zależy od wartości tzw. zmiennej decyzyjnej, której wartość jest aktualizowana po każdym kroku. Aktualizacja polega na dodaniu odpowiednich wartości, które są stałe w przypadku odcinka, natomiast dla okręgu i elipsy zmieniają się z każdym krokiem:
D = zmienna decyzyjna
- DL = przyrost D przy ruchu w lewo
- DU = przyrost D przy ruchu ukośnym
- DDLL = przyrost DL przy ruchu w lewo (dla odcinka = 0)
- DDUL = przyrost DU przy ruchu w lewo (dla odcinka = 0)
- DDLU = przyrost DL przy ruchu ukośnym (dla odcinka = 0)
- DDUU = przyrost DU przy ruchu ukośnym (dla odcinka = 0)
Powtarzaj
zapisz piksel
(x, y)
jeśli D > 0, to
- x := x + 1 – ruch w lewo
- D := D + DL – aktualizacja zmiennej decyzyjnej
- DL := DL + DDLL – aktualizacja parametrów pomocniczych
- DU := DU + DDUL – aktualizacja parametrów pomocniczych
w przeciwnym razie
- x := x + 1 – ruch ukośny
- y := y + 1
- D := D + DU – aktualizacja zmiennej decyzyjnej
- DL := DL + DDLU – aktualizacja parametrów pomocniczych
- DU := DU + DDUU – aktualizacja parametrów pomocniczych
Algorytm konwersji odcinka
Założenia
Kąt pomiędzy styczną a osią OX nie może przekraczać 45 stopni.
Jeśli krzywa może być opisana funkcją
y = f(x) to musi być spełniony warunek 0 < f'(x) ≤ 1.
Krzywa musi być nierosnąca albo niemalejąca.
Algorytm i jego działanie
Załóżmy, że krzywa w przedziale [xi, xk] spełnia powyższe założenia. Pierwszy piksel stawiamy w punkcie P(xi, yi).
Drugi piksel ogranicza się do dwóch możliwości:
- Si+1 = (xi + 1, yi)
- Ti+1 = (xi + 1, yi + 1)
Przyrost w kierunku osi OX (osi wiodącej) jest stały – jeden piksel. Korzystając z równania kierunkowego prostej
y = (dy/dx)(x – xo) + yo policzymy w jakiej odległości znajdują się powyższe piksele od punktu przecięcia łączącego je odcinka z prostą przebiegającą w rzeczywistym układzie współrzędnych
s = (dy/dx)(xi + 1 – xo) – (yi – yo)
t = (yi + 1 – yo) – (dy/dx)(xi + 1 – xo)
di = dx(s – t) = 2dy(xi – xo) – 2dx(yi – yo) + 2dy – dx
Jeżeli di > 0, to s > t, za punkt Pi+1 przyjmujemy piksel Ti+1, jeżeli di < 0, to wybieramy piksel Si+1. Wartość di = 0 oznacza, że oba piksele leżą w tej samej odległości i arbitralnie przyjmujemy, że następny piksel to Ti+1.
Obliczamy jeszcze wartość di+1 oraz różnicę di+1 – di.
Na końcu uzyskujemy wzór na di+1 = di + 2dy – 2dx(yi+1 – yi).
W przypadku di = 0, yi+1 = yi + 1 (wybieramy piksel Ti+1).
W przypadku di < 0, yi+1 = yi (wybieramy piksel Si+1).
Implementacja
Implementacja algorytmu Bresenhama musi uwzględniać różne możliwe położenia odcinka względem osi OX. W każdej sytuacji można zastosować opisany wyżej schemat, traktując oś OY jako oś wiodącą.
Rysowanie odcinka algorytmem Bresenhama
Procedura w języku C:
Algorytm Bresenhama dla elipsy
Założenia
Elipsa ma osie zgodne z osiami układu współrzędnych, półosie elipsy mają długości a (wzdłuż osi OX) i b (wzdłuż OY), oraz rozważamy elipsę w I ćwiartce układu współrzędnych. Środkiem symetrii elipsy jest środek układu współrzędnych. Rysowanie elipsy zaczynamy od punktu (0, b), a w każdym kroku stawiamy symetrycznie 4 punkty elipsy. Początkową osią wiodącą jest oś OX, a w punkcie zmiany osi wiodącej, współczynnik nachylenia stycznej do elipsy wynosi -1 (tg 135°).
Algorytm i jego działanie
Przybliżana elipsa ma równanie:
x2/a2 + y2/b2 – 1 = 0.
O wyborze piksela decyduje wartość funkcji F(x, y) = b2x2 + a2y2 – a2b2.
W punkcie środkowym M, położonym pomiędzy alternatywnymi pikselami, gdy osią wiodącą jest OX, oblicza się F(M) = F(xi + 1, yi – 1/2). Jeżeli F(M) > 0, to punkt M leży na zewnątrz elipsy i wybieramy piksel Pi+1 = SE, natomiast gdy F(M) ≤ 0, to punkt M leży wewnątrz elipsy lub na jej brzegu i wybieramy piksel Pi+1 = E.
Kiedy osią wiodącą jest OY, oblicza się F(M) = F(xi + 1/2, yi – 1). Jeżeli F(M) > 0, to punkt M leży na zewnątrz elipsy i wybieramy piksel Pi+1 = S, natomiast gdy F(M) ≤ 0, to punkt M leży wewnątrz elipsy lub na jej brzegu i wybieramy piksel Pi+1 = SE.
Algorytm nie wymaga wyliczania każdorazowo wartości funkcji F(M). Jego siła leży w możliwości wyliczania wartości tej funkcji (czyli zmiennej decyzyjnej) w kolejnym kroku (di+1) z mniejszą ilością obliczeń.
Zgodnie z przyjętymi założeniami elipsę zaczynamy rysować w punkcie (0, b). Ponieważ osią wiodącą jest wówczas OX, policzymy wartość zmiennej decyzyjnej d dla piksela startowego P0 = (0, b).
d0 = F(1, b – 1/2) = b2 + a2(-b + 1/4).
Jeżeli następnym pikselem jest Pi+1 = E, to wartość zmiennej decyzyjnej wynosi di+1 = di + 2b2xi+1 + b2.
Jeżeli następnym pikselem jest Pi+1 = S, to wartość zmiennej decyzyjnej wynosi di+1 = di – 2a2yi+1 + a2.
Przy zmianie osi wiodącej na OY należy również zmienić wartość zmiennej decyzyjnej. Różnica między „nową” i „starą” zmienną wynosi:
F(xi + 1/2, yi – 1) – F(xi+1, yi – 1/2).
Teraz wyliczymy rekurencyjne równania opisujące zmienną decyzyjną, gdy osią wiodącą jest OY.
Jeżeli następnym pikselem jest Pi+1 = S, to wartość zmiennej decyzyjnej wynosi:
di+1 = F(xi+1 + 1/2, yi+1 – 1) = di – 2a2yi+1 + a2.
Jeżeli następny piksel to Pi+1 = S, to również di+1 = di + 2b2 – 2a2yi+1 + a2.
Bibliografia
J.E. Bresenham. Algorithm for computer control of a digital plotter. „IBM Systems Journal”. 4 (1), 1965. [zarchiwizowane z adresu 2008-05-28]. (ang.). brak numeru strony
Michał Jankowski: Elementy grafiki komputerowej. Warszawa: Wydawnictwa Naukowo-Techniczne, 1990, s. 27–34. ISBN 83-204-1326-5.
Linki zewnętrzne
Algorytm Bresenhama. wm.ite.pl. [zarchiwizowane z tego adresu (2017-11-12)].