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

Podobne dokumenty