Laboratorium grafiki i multimediów
Transkrypt
Laboratorium grafiki i multimediów
Linie Laboratorium grafiki i multimediów Michał Matuszak [email protected] 22-02-2010 Michał Matuszak [email protected] Laboratorium grafiki i multimediów Linie Michał Matuszak [email protected] Alg. naiwny Alg. Bresenhama Antialiasing Zadanie Laboratorium grafiki i multimediów Linie Alg. naiwny Alg. Bresenhama Antialiasing Zadanie Alg. naiwny Algorithm 1 Algorytm naiwny. Dane: x0 , y0 , x1 , y1 1: dx = x1 − x0 2: dy = y1 − y0 3: m = dy /dx 4: for x = x0 to x1 do 5: y = m ∗ (x − x0 ) + y0 6: putPixel (x, y ) 7: end for Michał Matuszak [email protected] Laboratorium grafiki i multimediów Linie Alg. naiwny Alg. Bresenhama Antialiasing Zadanie Alg. naiwny cd. Założyliśmy, że: x0 < x1 dx dy W łatwy sposób można wyeliminować powyższe ograniczenia Podany algorytm jest zbyt wolny Michał Matuszak [email protected] Laboratorium grafiki i multimediów Linie Alg. naiwny Alg. Bresenhama Antialiasing Zadanie Digital Differential Analyzer (DDA) Algorithm 2 Algorytm DDA. Dane: x0 , y0 , x1 , y1 1: dx = x1 − x0 2: dy = y1 − y0 3: m = dy /dx 4: y = y0 5: for x = x0 to x1 do 6: putPixel (x, y ) 7: y =y +m 8: end for Założenia na dane j.w. Niedokładny dla długich odcinków Michał Matuszak [email protected] Laboratorium grafiki i multimediów Linie Alg. naiwny Alg. Bresenhama Antialiasing Zadanie Alg. Bresenhama Opracowany przez Bresenhama do kontroli drukarek Operuje na liczbach całkowitych Bardzo szybki Załóżmy, że x1 x0 ∧ y1 y0 kx1 x0 k ky1 y0 k Michał Matuszak [email protected] Laboratorium grafiki i multimediów Linie Alg. naiwny Alg. Bresenhama Antialiasing Zadanie Rysunek: Źródło: Algorithm for computer control of a digital plotter by J.E. Bresenham Michał Matuszak [email protected] Laboratorium grafiki i multimediów Linie Alg. naiwny Alg. Bresenhama Antialiasing Zadanie Pseudokod Algorithm 3 Algorytm Bresenhama. Dane: x0 , y0 , x1 , y1 1: dx = x1 − x0 2: dy = y1 − y0 3: ∇ = 2 ∗ dy − dx 4: y = y0 5: for x = x0 to x1 do 6: putPixel (x, y ) 7: ∇ = ∇ + 2 ∗ dy 8: if ∇ 0 then 9: y =y +1 10: ∇ = ∇ − 2 ∗ dx 11: end if 12: end for Michał Matuszak [email protected] Laboratorium grafiki i multimediów Linie Alg. naiwny Alg. Bresenhama Antialiasing Zadanie Antiliasing Rysunek: Źródło: Wikipedia Michał Matuszak [email protected] Laboratorium grafiki i multimediów Linie Alg. naiwny Alg. Bresenhama Antialiasing Zadanie Aliasing Aliasing - to strata informacji wynikająca ze zbyt rzadkiego próbkowania. Będziemy walczyć z aliasingiem na dwa sposoby: Supersampling Pre-filtering Michał Matuszak [email protected] Laboratorium grafiki i multimediów Linie Alg. naiwny Alg. Bresenhama Antialiasing Zadanie Supersampling Algorytm: 2 Stwórz obrazek 2x (lub 4x, 8x, ...) większy od wyjściowego Narysuj linie 3 Przeskaluj powstały obrazek do rozmiaru wyjściowego 1 Pamiętaj o przeskalowaniu końców linii 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 2 Stawiać więcej niż jeden punk wzdłuż osi OY (np. 3) Zastosować algorytm rysujący linie o dowolnej grubości (Alg. Murphy’ego). Michał Matuszak [email protected] Laboratorium grafiki i multimediów Linie Alg. naiwny Alg. Bresenhama Antialiasing Zadanie Alg. Wu Rysunek: Źródło: Michael Abrash’s Graphics Programming Black Book, Michael Abrash Michał Matuszak [email protected] Laboratorium grafiki i multimediów Linie Alg. naiwny Alg. Bresenhama Antialiasing Zadanie 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. Michał Matuszak [email protected] Laboratorium grafiki i multimediów Linie Alg. naiwny Alg. Bresenhama Antialiasing Zadanie Alg. Gupty-Sproull’a Rysunek: Źródło: Filtering Edges for Gray-Scale Displays, Satish Gupta, Robert F. Sproull Michał Matuszak [email protected] Laboratorium grafiki i multimediów Linie Alg. naiwny Alg. Bresenhama Antialiasing Zadanie Alg. Gupty-Sproull’a Idea: 1 2 3 Ze środka każdego piksela rysujemy okrąg. Obliczamy w jakim stopniu jest on pokryty przez linie. Proporcjonalnie do znalezionego pokrycia wyznaczamy jego intensywność. Dla promienia okregu r = 1 i szerokości linii t = 1 w każdym kroku stawiamy trzy piksele. Można rysować linie o różnej grubości. Wolniejszy od algorytmu Wu. Michał Matuszak [email protected] Laboratorium grafiki i multimediów Linie Alg. naiwny Alg. Bresenhama Antialiasing Zadanie Zadanie: Napisz program rysujący dowolne linie z wykorzystaniem algorytmu naiwnego, przyrostowego oraz Bresenhama. Termin: 23:59 28.02.2010 (niedziela) Zadanie 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) Michał Matuszak [email protected] Laboratorium grafiki i multimediów