Laboratorium grafiki i multimediów Michał Matuszak gruby@mat.umk.pl 22-02-2010
Algorithm 1 Algorytm naiwny. Dane:x 0,y 0,x 1,y 1 1:d x =x 1 x 0 2:d y =y 1 y 0 3:m =d y /d x 4:forx=x 0 tox 1 do 5: y =m (x x 0 )+y 0 6: putpixel(x,y) 7:endfor
cd. Założyliśmy, że: x 0 <x 1 d x d y W łatwy sposób można wyeliminować powyższe ograniczenia Podany algorytm jest zbyt wolny
Digital Differential Analyzer(DDA) Algorithm 2 Algorytm DDA. Dane:x 0,y 0,x 1,y 1 1:d x =x 1 x 0 2:d y =y 1 y 0 3:m =d y /d x 4:y =y 0 5:forx=x 0 tox 1 do 6: putpixel(x,y) 7: y =y +m 8:endfor Założenia na dane j.w. Niedokładny dla długich odcinków
Opracowany przez Bresenhama do kontroli drukarek Operuje na liczbach całkowitych Bardzo szybki Załóżmy, że x 1 x 0 y 1 y 0 x 1 x 0 y 1 y 0
Rysunek: Źródło: Algorithm for computer control of a digital plotter by J.E. Bresenham
Pseudokod Algorithm 3 Algorytm Bresenhama. Dane:x 0,y 0,x 1,y 1 1:d x =x 1 x 0 2:d y =y 1 y 0 3: =2 d y d x 4:y =y 0 5:forx=x 0 tox 1 do 6: putpixel(x,y) 7: = +2 d y 8: if 0then 9: y =y +1 10: = 2 d x 11: end if 12:endfor
Antiliasing Rysunek: Źródło: Wikipedia
Aliasing Aliasing- to strata informacji wynikająca ze zbyt rzadkiego próbkowania. Będziemy walczyć z aliasingiem na dwa sposoby: Supersampling Pre-filtering
Supersampling Algorytm: 1 Stwórzobrazek2x(lub4x,8x,...)większyodwyjściowego 2 Narysuj linie Pamiętaj o przeskalowaniu końców linii 3 Przeskaluj powstały obrazek do rozmiaru wyjściowego Można użyc prostego uśredniania bloków 2x2(lub 4x4, 8x8, etc.) Problem: Linia stała sie niewyraźna. Trzeba narysować szerszą linie. Możemy np.: 1 StawiaćwięcejniżjedenpunkwzdłużosiOY(np.3) 2 Zastosować algorytm rysujący linie o dowolnej grubości (Alg. Murphy ego).
Alg. Wu Rysunek: Źródło: Michael Abrash s Graphics Programming Black Book, Michael Abrash
Załóżmy, że mamy narysować linie w pierwszym oktancie. Przemieszczamy sie wzdłuż osi OX co jeden piksel. Algorytm rysuje zawsze po dwa piksele wzdłuż osi OY. Wybiera ich intensywność proporcjonalnie do odległości od idealnej linii. Ich intensywność sumuje się do 1. Jasność tak narysowanego odcinka skupia się na idealnej linii. Wu przedstawił algorytm potrafiący efektywnie obliczać odległość pikseli od idealnej linii. Algorytm niewiele ustępuje szybkością alg. Bresenhama.
Alg. Gupty-Sproull a Rysunek: Źródło: Filtering Edges for Gray-Scale Displays, Satish Gupta, Robert F. Sproull
Alg. Gupty-Sproull a Idea: 1 Ze środka każdego piksela rysujemy okrąg. 2 Obliczamy w jakim stopniu jest on pokryty przez linie. 3 Proporcjonalnie do znalezionego pokrycia wyznaczamy jego intensywność. Dlapromieniaokregur =1iszerokościliniit=1wkażdym kroku stawiamy trzy piksele. Można rysować linie o różnej grubości. Wolniejszy od algorytmu Wu.
: Napisz program rysujący dowolne linie z wykorzystaniem algorytmu naiwnego, przyrostowego oraz Bresenhama. Termin: 23:59 28.02.2010(niedziela) dodatkowe: Stwórz na co najmniej dwa sposoby linie korzystając z technik przeciwdziałających aliasingowi(supersamling, Wu, Gupta-Sprull). Termin: 23:59 07.03.2010(niedziela)