Algorytm Bresenhama

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)].

Przeczytaj u przyjaciół: