Grafika - miki.cs.pollub.plmiki.cs.pollub.pl/own/wp-content/uploads/2014/06/POD_w_6... ·...
Transcript of Grafika - miki.cs.pollub.plmiki.cs.pollub.pl/own/wp-content/uploads/2014/06/POD_w_6... ·...
Wykład obejmuje operacje rastrowe związane
z wyświetleniem kształtów o ciągłych krawędziach
za pomocą skończenie gęstej siatki pikseli
Podstawowe operacje rastrowe
Rysowanie odcinków
Rysowanie okręgów
Krzywe Béziera, sklejane
Antyaliasing
Wypełnianie obszarów
Obcinanie
Podstawowe operacje rastrowe
Rysowanie odcinków
Odcinek przedstawiony rastrowo będzie miał wygląd podobny do poniższego
Podstawowe operacje rastrowe
Rysowanie odcinków
Odcinek opisany jest za pomocą pozycji punktów początku i końca odcinka
Pozycje te zapisane są wg. układu współrzędnych (najczęściej
odpowiadającego wartościami ilościom pikseli obrazu)
Np. Odcinek (2,5),(10,8)
Znając te współrzędne można wyznaczyć równanie prostej, na której ten
odcinek leży.
y=mx+b
m – współczynnik nachylenia prostej = tg kąta nachylenia do osi x.
Podstawowe operacje rastrowe
Rysowanie odcinków
Znając równanie prostej można zbudować naiwny algorytm rysowania
odcinka:
Dla wszystkich wartości x (pikseli) od początku do końca odcinka
• Wyznacz y[i] dla x[i] z równania prostej (1 mnożenie, 1 dodawanie)
• Znajdź najbliższą y[i] wartość całkowitą yc[i] (1 zaokrąglenie)
• Zaznacz piksel (x[i],yc[i])
Algorytm ten działa poprawnie dla
odcinków o nachyleniu od 0 do 45
stopni
Dla odcinków o nachyleniu od 45 do 90
stopni należy podążać wzdłuż osi y.
Podstawowe operacje rastrowe
Rysowanie odcinków
Algorytm naiwny można poprawić korzystając z faktu, że nachylenie
odcinka jest stałe. Wtedy przy przesuwaniu wartości x o 1, różnica między
kolejnymi wartościami y jest stała i wynosi y=m (0<m<1)
Kolejne wartości y można obliczyć ze wzoru
y[i+1] = y[i]+ y
Oszczędność: 1 mnożenie
Algorytm taki nosi nazwę: Digital Differential Analyzer (DDA)
Algorytm ten działa poprawnie dla odcinków o nachyleniu od 0 do 45 stopni,
stąd 0<m<1
Podstawowe operacje rastrowe
Rysowanie odcinków
Algorytm może być stosowany dla linii w
dowolnym oktancie układu współrzędnych,
pod warunkiem modyfikacji kierunku i znaku
przesunięcia.
Podstawowe operacje rastrowe
Rysowanie odcinków
Algorytm wyznaczania odcinka
wykorzystujący jedynie obliczenia
stałopozycyjne został zaproponowany przez
Bresenhama w 1965r.
Algorytm ten, tak samo jak poprzednie
ogranicza się do jednego oktantu układu
współrzędnych. Wykorzystuje on zależność
miedzy poprzednim i kolejnym pikselem,
mówiącą że wartość y następnego piksela
będzie taka sama lub o 1 większa.
Podstawowe operacje rastrowe
Rysowanie odcinków
Dla odcinka (xp,yp),(xk,yk) kryterium wyboru między pikselami jest znak
parametru p[i] (-1 < p[i] < 1), którego początkowa wartość wynosi
p[1]=2 y - x
gdzie x= xk – xp i y= yk – yp
Dla p[i]<0 wybierany jest piksel (x[i+1],y[i])
a kryterium p[i+1] = p[i] + 2 y
Dla p[i]>=0 wybierany jest piksel (x[i+1],y[i+1])
a kryterium p[i+1] = p[i] + 2 y - 2 x
Tylko 1 dodawanie całkowitoliczbowe w 1 kroku
Algorytm Bresenhama
Podstawowe operacje rastrowe
Rysowanie odcinków
Dla odcinka (1,1),(7,4)
Wartości początkowe
x= 7 – 1 = 6
y= 4 – 1 = 3
A= 2 y = 6
B = 2 y - 2 x = -6
p[1]= 2*3 – 6 = 0
Algorytm Bresenhama - przykład
4
3
2
1
1 2 3 4 5 6 7 Krok 0
Zaczynamy od (x[1],y[1])
Podstawowe operacje rastrowe
Rysowanie odcinków
Dla odcinka (1,1),(7,4)
Wartości początkowe
x= 7 – 1 = 6
y= 4 – 1 = 3
A= 2 y = 6
B = 2 y - 2 x = -6
p[1]= 2*3 – 6 = 0
Algorytm Bresenhama - przykład
Krok 1
p[1]=0 to (x[2],y[2])
p[2]=0 – 6 = -6
4
3
2
1
1 2 3 4 5 6 7
Podstawowe operacje rastrowe
Rysowanie odcinków
Dla odcinka (1,1),(7,4)
Wartości początkowe
x= 7 – 1 = 6
y= 4 – 1 = 3
A= 2 y = 6
B = 2 y - 2 x = -6
p[1]= 2*3 – 6 = 0
Algorytm Bresenhama - przykład
Krok 2
p[2]= -6 to (x[3],y[2])
p[3]= -6 + 6 = 0
4
3
2
1
1 2 3 4 5 6 7
Podstawowe operacje rastrowe
Rysowanie odcinków
Dla odcinka (1,1),(7,4)
Wartości początkowe
x= 7 – 1 = 6
y= 4 – 1 = 3
A= 2 y = 6
B = 2 y - 2 x = -6
p[1]= 2*3 – 6 = 0
Algorytm Bresenhama - przykład
Krok 3
p[3]= 0 to (x[4],y[3])
p[4]= 0 - 6 = -6
4
3
2
1
1 2 3 4 5 6 7
Podstawowe operacje rastrowe
Rysowanie odcinków
Dla odcinka (1,1),(7,4)
Wartości początkowe
x= 7 – 1 = 6
y= 4 – 1 = 3
A= 2 y = 6
B = 2 y - 2 x = -6
p[1]= 2*3 – 6 = 0
Algorytm Bresenhama - przykład
Krok 4
p[4]= -6 to (x[5],y[3])
p[5]= -6 + 6 = 0
4
3
2
1
1 2 3 4 5 6 7
Podstawowe operacje rastrowe
Rysowanie odcinków
Dla odcinka (1,1),(7,4)
Wartości początkowe
x= 7 – 1 = 6
y= 4 – 1 = 3
A= 2 y = 6
B = 2 y - 2 x = -6
p[1]= 2*3 – 6 = 0
Algorytm Bresenhama - przykład
Krok 5
p[5]= 0 to (x[6],y[4])
p[6]= 0 - 6 = -6
4
3
2
1
1 2 3 4 5 6 7
Podstawowe operacje rastrowe
Rysowanie odcinków
Dla odcinka (1,1),(7,4)
Wartości początkowe
x= 7 – 1 = 6
y= 4 – 1 = 3
A= 2 y = 6
B = 2 y - 2 x = -6
p[1]= 2*3 – 6 = 0
Algorytm Bresenhama - przykład
Krok 6
p[6]= -6 to (x[7],y[4])
x[7] -> Koniec
4
3
2
1
1 2 3 4 5 6 7
Podstawowe operacje rastrowe
Rysowanie okręgów
222 ryx
Równanie okręgu
Korzystając z zasady symetryczności
można wyznaczyć punkty tylko w 1
oktancie koła
Bezpośrednie wyznaczanie
z równania kosztowne
obliczeniowo
Podstawowe operacje rastrowe
Rysowanie okręgów
Dla koła w 1 oktancie zachodzi zależność analogiczna jak dla odcinka.
Wartość y kolejnego piksela będzie równa wartości obecnej
lub o 1 mniejszej.
Algorytm Bresenhama
Kryterium wyboru jest to czy punkt
środkowy znajduje się wewnątrz
czy na zewnątrz koła
0222 ryx
0222 ryx
Podstawowe operacje rastrowe
Rysowanie okręgów
Dla 1 oktantu koła (0,r),(x,y) - takie że x=y, kryterium wyboru między
pikselami jest znak parametru p[i], którego początkowa wartość wynosi
p[1]=5/4 - r
Dla p[i]<0 wybierany jest piksel (x[i+1],y[i])
a kryterium p[i+1] = p[i] + 2 x[i+1] + 1
Dla p[i]>=0 wybierany jest piksel (x[i+1],y[i+1])
a kryterium p[i+1] = p[i] + 2 x[i+1] + 1 – 2y[i+1]
Kroki są powtarzane tak długo jak pozycja x > pozycja y
Pozostałe 7 pikseli powiązanych wyznaczane jest na podstawie wybranego
Tylko operacje całkowitoliczbowe w 1 kroku
Algorytm Bresenhama
Podstawowe operacje rastrowe
Rysowanie okręgów
Dla okręgu o środku (0,0) i r=5
Algorytm Bresenhama dla okręgów - przykład
Krok 0
Zaczynamy od (x[0],y[5])
5
4
3
2
1
0
-1
-2
-3
-4
-5
-5 -4 -3 -2 -1 0 1 2 3 4 5
Podstawowe operacje rastrowe
Rysowanie okręgów
Dla okręgu o środku (0,0) i r=5
p[0]= 5/4-5 = -3,75 < 0
Algorytm Bresenhama dla okręgów - przykład
Krok 1
Kolejny piksel (x[1],y[5])
p[1]= -3,75 +2+1=-0,75
5
4
3
2
1
0
-1
-2
-3
-4
-5
-5 -4 -3 -2 -1 0 1 2 3 4 5
Podstawowe operacje rastrowe
Rysowanie okręgów
Dla okręgu o środku (0,0) i r=5
p[1]= -0,75 < 0
Algorytm Bresenhama dla okręgów - przykład
Krok 2
Kolejny piksel (x[2],y[5])
p[2]= -0,75 +4+1=4,25
5
4
3
2
1
0
-1
-2
-3
-4
-5
-5 -4 -3 -2 -1 0 1 2 3 4 5
Podstawowe operacje rastrowe
Rysowanie okręgów
Dla okręgu o środku (0,0) i r=5
p[2]= 4,25 > 0
Algorytm Bresenhama dla okręgów - przykład
Krok 3
Kolejny piksel (x[3],y[4])
STOP
5
4
3
2
1
0
-1
-2
-3
-4
-5
-5 -4 -3 -2 -1 0 1 2 3 4 5
Interpolacja
metoda numeryczna polegająca na wyznaczaniu w danym
przedziale tzw. funkcji interpolacyjnej, która przyjmuje
w nim z góry zadane wartości w ustalonych punktach -
węzłach
Krzywe
Modelowanie krzywej
Możliwość wykreślenia dowolnej krzywej jest niezbędna w grafice
komputerowej
Przed erą komputerów krzywe tworzono „analogowo” wykorzystując cienką
sprężystą listwę, podwieszając ją i obciążając w odpowiednio dobranych
miejscach
Cyfrowo krzywą można uznać za wykres pewnej funkcji
Krzywe
Krzywe
Modelowanie krzywej
Wykorzystanie funkcji bezpośrednich typu y=f(x) pozwoli na dokładne
matematyczne zapisanie krzywej ale ma jedną poważną wadę – pozwala na
wyznaczenie jednej wartości y dla każdego x uniemożliwiając tworzenie pętli
(czy chociażby okręgu)
Matematyczny zapis dowolnych krzywych został wprowadzony do grafiki
komputerowej dzięki krzywym kreślonym z wykorzystaniem funkcji
parametrycznych
Krzywe
Modelowanie krzywej – funkcje parametryczne
Ogólnie funkcje parametryczną można zapisać jako:
Gdzie X(t) i Y(t) są funkcjami parametru t. Dla konkretnej wartości t zwracając
wartości x oraz y
Parametr t jest często określany mianem czasu co ma odpowiadać
przemieszczaniu się punktu (podróżnika) ze stałą prędkością wzdłuż krzywej.
Wraz ze wzrostem czasu wzrasta liniowo przebyta droga.
tYtXtQ ,
Krzywe
Modelowanie krzywej – funkcje parametryczne
Np. dla zestawu funkcji
i t w zakresie 0 < t < 2
Uzyska krzywa będzie okręgiem
ttY
ttX
sin)(
cos)(
Modelowanie krzywej nieparametrycznej
Konieczność zapisania krzywej lub jej przybliżenia za pomocą funkcji
matematycznej
Krzywą „spróbkowaną” np. w czasie skanowania obrazu można przybliżać
wykorzystując interpolację.
Interpolację stosujemy, gdy nie znamy postaci analitycznej f(x) lub, gdy
analityczna postać funkcji f(x) jest znana, ale obliczanie jej wartości jest zbyt
pracochłonne.
Krzywe
Modelowanie krzywej - Interpolacja
Zadanie sprowadza się do wyznaczenia przybliżenia funkcji f(x) uzyskującego
dla skończonej ilości n punktów tzw węzłów interpolacji wartości zgodne
z położeniem tych punktów.
W celu wyznaczenia przybliżonych wartości funkcji f(x) konstruujemy tzw.
funkcję interpolacyjną F(x) określonej klasy, (np. wielomiany algebraiczne,
wielomiany trygonometryczne, funkcje sklejane (splajny) itp.) dostatecznie
prostą do obliczeń, która w węzłach interpolacji przyjmie te same wartości co
funkcja f(x)
Zadanie wykonalne gdy F(x) jest wielomianem stopnia n-1
Krzywe
Modelowanie krzywej - Interpolacja
Wzór interpolacyjny Lagrange’a dla n+1 węzłów interpolacji (wersja cyfrowa)
n
j
jii
ijj
j
nn
xxxx
yxxW
0
0
1
)()(
)()(
)())(()( 101 nn xxxxxxx
gdzie
Tylko jedno rozwiązanie
Krzywe
Modelowanie krzywej - Interpolacja
3424144
3
4323133
1
4232122
4
4131211
3
4321)(3
xx
xxxxxxxW
Przykład
Znaleźć wielomian interpolacyjny Lagrange’a, dla punktów
(1,3),(2,4),(3,-1),(4,3).
n
j
jii
ijj
j
nn
xxxx
yxxW
0
0
1
)()(
)()(
Krzywe
Modelowanie krzywej - Interpolacja
Dla niewielkiej ilości punktów (kilka) krzywa interpolacyjna jest zgodna
z oczekiwaniami.
Przy większej ilości stopień wielomianu
wzrasta a krzywa wykazuje tendencję
do oscylacji
Lepsze wyniki daje krzywa sklejana/składana
Krzywe
Krzywa Béziera
Jest krzywą parametryczną. Może być jedną z krzywych składanych
Zaproponowana w latach 60-tych ubiegłego wieku przez Pierre Etienne
Béziera. Krzywe te miały pomóc przy projektowaniu karoserii samochodów dla
koncernu Renault, dla którego Bézier pracował.
Równolegle, podobne rozwiązanie zaproponował Paul de Casteljau, pracujący
dla konkurencyjnej firmy Citroën. Jednak Renault zezwolił na upublicznienie
wyników o kilka lat wcześniej…
Krzywe
Krzywa Béziera
Krzywa Béziera stopnia n jest definiowana przez n +1 punktów P0, P1, … Pn
w bazie wielomianów Bernsteina.
Jest to krzywa gładka, której kształt zależy od położenia punktów kontrolnych.
Krzywa Béziera 3 stopnia
Pierwszy i ostatni z punktów są końcami
krzywej. Pozostałe punkty to punkty
kontrolne
Krzywe
Krzywa Béziera – wielomiany Bernsteina
Wielomiany bazowe Bernsteina opisane są wzorem
1,0
,00
..01
t
niidla
nidlatttB
inin
in
i
Krzywe
Krzywa Béziera
33
3
23
2
23
1
33
0
)(
13)(
13)(
1)(
ttB
tttB
tttB
ttB
Wzór analityczny na krzywą Béziera 3-go stopnia
1,0
...1)(
...1)(
13131)(
3
0
3
0
3
4
2
2
2
1
3
0
t
tYtY
tXtX
tPttPttPtPtQ
Krzywe
Obliczanie dość złożone (potęgowanie, mnożenie…)
Krzywa Béziera - Właściwości
P0 i P1 są końcami krzywej
Odcinki P0 , P1 i P2 , P3 są styczne do krzywej
Krzywa Béziera zawiera się całkowicie
w wielokącie wypukłym, którego wierzchołkami są
wierzchołki łamanej
Odwrócenie kolejności punktów nie zmienia
kształtu krzywej P0
P1 P2
P3
Wada: Krzywą Béziera nie można zbudować krzywej stożkowej
Krzywe
Krzywa Béziera - rysowanie
Algorytm de Casteljau
Bazuje na prostym podziale odcinków.
Wyznacza zbiór punktów leżących na krzywej Béziera na podstawie
wierzchołków łamanej ją opisującej.
Gęstość wyznaczonych punktów jest zależna od gęstości podziału przedziału
parametru t <0,1>
Np. dla gęstości 0,01 wyznaczonych zostanie 100 punktów rozmieszczonych
na krzywej.
Krzywe
Krzywe
Krzywa Béziera - Algorytm de Casteljau
Punkty na krzywej można wyznaczyć dzieląc rekurencyjnie przez tą samą
wartość odcinki łamanej, opisującej krzywą
Możliwość ta wynika z właściwości wielomianów bazowych Bernsteina
ttBtBttB n
i
n
i
n
i
1
1
11
Krzywe
Krzywa Béziera - Algorytm de Casteljau
nn PPPP ,,...,, 110
Przebieg
Dla zbioru n+1 wierzchołków łamanej opisującej krzywą:
każdy odcinek łamanej jest dzielony w stosunku , zapisywany jest nowy
wierzchołek
Powstaje nowy zbiór n wierzchołków
Proces jest powtarzany dla nowego zbioru, aż do pozostania tylko jednego
wierzchołka – punkt ten leży na krzywej Béziera
Algorytm wykonywany jest ponownie, dla kolejnej wartości z przedziału t
tt 1:
Krzywe
Krzywa Béziera - składanie
W praktyce rzadko kiedy używa się krzywych Béziera wysokiego
stopnia.
Każdy punkt krzywej Béziera zależy od wszystkich punktów kontrolnych
– kontrolowanie kształtu krzywej wysokiego stopnia byłoby trudne
Rozwiązaniem jest łączenie ze sobą odcinków opisanych krzywymi
niskiego stopnia (najczęściej 3)
Krzywe
Krzywa Béziera - składanie
nn PPPP ,,...,, 110
Połączenie dwóch krzywych opisanych łamanymi oraz
następuje gdy
Łączyć można dowolną ilość krzywych, także w obszary zamknięte
nn RRRR ,,...,, 110 0RPn
Krzywe
Krzywa Béziera - składanie
Istnieją trzy typy połączeń krzywych Béziera
- Połączenie ostre (bez zachowania ciągłości)
Krzywe
Krzywa Béziera - składanie
Istnieją trzy typy połączeń krzywych Béziera
- Połączenie gładkie (z zachowaniem ciągłości geometrycznej)
R0 R1
P2
P3
Punkty leżą na jednej prostej 1032 ,,, RRPP
Krzywe
Krzywa Béziera - składanie
1032 ,,, RRPP
Istnieją trzy typy połączeń krzywych Béziera
- Połączenie symetryczne (z zachowaniem ciągłości parametrycznej)
R0 R1
P2
P3
Punkty leżą na jednej prostej
Odcinki oraz mają jednakową długość 32 , PP10 , RR
Krzywe
Krzywa Béziera - wady
Nie można za ich pomocą wyznaczyć krzywych stożkowych
Poddanie punktów kontrolnych krzywej rzutowaniu perspektywicznemu
spowoduje zmianę kształtu krzywej
Krzywe
Wymierna Krzywa Béziera
Jest zdefiniowana wzorem
Gdzie wi jest wagą i-tego punktu Béziera
n
i
n
ii
n
i
n
iii
tBw
tBPw
tQ
0
0
)(
)(
)(
Krzywe
Wymierna Krzywa Béziera
1, 20 ww
Jedna z głównych zalet to możliwość tworzenia krzywych stożkowych
Np. Tworząc krzywą 2 stopnia i ustalając wagi
Można uzyskać
- Łuk hiperboli dla
- Łuk paraboli dla
- krótszy łuk okręgu/elipsy dla
- dłuższy łuk okręgu/elipsy dla
11 w11 w
10 1 w
01 1 w
0w
1w
2w
2
21 w
2
21 w
Podstawowe operacje rastrowe
Grubość linii
Grubość linii tworzącej rysunek
może być większa od 1 piksela
Konieczne jest wyznaczenie
zbioru pikseli
składających się na linię
Wyznaczenie pikseli dla linii poziomych
i pionowych nie stanowi problemu
Podstawowe operacje rastrowe
Grubość linii
Wyznaczenie pikseli dla linii ukośnych
wiąże się z niepewnością, które piksele
powinny zawierać się w linii
Jeśli wybrane zostaną tylko piksele
zawierające się w obszarze, nastąpi
optyczne „wyszczuplenie” linii.
Najczęściej kompensacja przez dodanie
pikseli bliskich wybranej grubości linii
– fizyczne pogrubienie linii
Linia o nachyleniu od 0 do 45 st. – wyznaczanie pikseli w osi y
Linia o nachyleniu od 45 do 90 st. – wyznaczanie pikseli w osi x
Podstawowe operacje rastrowe
Grubość linii
Ustalanie pikseli dla linii grubej nie będącej prostym odcinkiem wiąże się
z przechodzeniem miedzy osią x i y – bardziej złożony algorytm
Prostszym rozwiązaniem jest
zastępowanie każdego
piksela linii obszarem
o określonym kształcie
– np. prostokąt
Podstawowe operacje rastrowe
Rysowanie linii - Aliasing
Specyfika budowy rastra powoduje różne wyświetlanie linii w zależności od
jej kąta pochylenia.
Głównym efektem jest powstawanie „schodkowości” linii innych niż
wielokrotność 90° - Aliasing.
Jej widoczność zależy od rozdzielczości i wielkości ekranu.
Nie istnieje metoda eliminacji aliasingu
Schodkowość jest największa dla
linii pod kątem 45° (Schodek co
piksel) Powoduje to optyczne
zmniejszenie grubości linii
Podstawowe operacje rastrowe
Rysowanie linii - Antyaliasing
Aliasing można optycznie zamaskować rozmywając krawędzie linii
Metoda ta nazywa się Antyaliasing
Zamiast ostrego rozgraniczenia miedzy kolorem linii/krawędzi i kolorem tła
wprowadza się kolory pośrednie pomiędzy tymi dwoma
Dla linii 1 pikselowej generowanie linii
zostało zmodyfikowane
Jeżeli rzeczywista linia leży odpowiednio
daleko od najbliższego piksela, wybierane
są piksele po obu stronach linii, każdy
z intensywnością koloru zależną od
odległości do linii rzeczywistej
Suma intensywności jest równa
intensywności koloru linii
Podstawowe operacje rastrowe
Rysowanie linii - Antyaliasing
W przypadku grubszych linii i innych obiektów antyaliasing stosowany jest
do ich krawędzi.
Podstawowe operacje rastrowe
Rysowanie linii - Antyaliasing
Kolory pośrednie dla krawędzi zależą od koloru tła. Zastosowanie prostego
antyaliasingu dla krawędzi obiektu przemieszczanego (animowanego)
może spowodować efekt „Halo” w chwili przesunięcia obiektu na tło
o innym kolorze
Efektu Halo można uniknąć stosując antyaliasing wykorzystujący stopnie
przeźroczystości zamiast poziomów jasności
Podstawowe operacje rastrowe
Wypełnianie obszarów
Podstawowa cecha: Wypełnić możemy obszar zamknięty (czyli jaki?)
Obszary zamknięte mogą być definiowane (ograniczane)
rastrowo (zbiór pikseli tworzących krawędź)
lub wektorowo (zbiór odcinków o wspólnych wierzchołkach)
Podstawowe operacje rastrowe
Wypełnianie obszarów
Obszary zamknięte rastrowe (zbiór pikseli)
Specyfika tworzenia linii rastrowych powoduje podział na dwa rodzaje
obszarów zamkniętych
Czterospójny
Obszar jest cztero-spójny (ang. four-way connected region), jeśli zawarte
w nim piksele posiadają ten sam kolor oraz do każdego z nich można
dotrzeć przechodząc po pikselach tego obszaru w 4 podstawowych
kierunkach.
A wypełnienie gradientowe?
Podstawowe operacje rastrowe
Wypełnianie obszarów
Obszary zamknięte rastrowe (zbiór pikseli tworzących krawędź)
Specyfika tworzenia linii rastrowych powoduje podział na dwa rodzaje
obszarów zamkniętych
Ośmiospójny
Obszar jest ośmio-spójny (ang. eight-way connected region), jeśli zawarte
w nim piksele posiadają ten sam kolor oraz do każdego z nich można
dotrzeć przechodząc po pikselach tego obszaru w 8 podstawowych
kierunkach.
Podstawowe operacje rastrowe
Wypełnianie obszarów
Obszary zamknięte rastrowe (zbiór pikseli tworzących krawędź)
Analogicznie krawędź rastrowa może być cztero lub ośmiospójna
Podstawowe operacje rastrowe
Wypełnianie obszarów
Sposób wypełnienia – wypełnienie konturowe (boundary fill)
•Obszar posiada jednokolorowy kontur
•Wnętrze obszaru jest wypełnione dowolnymi kolorami
– innymi niż kolor konturu
Podstawowe operacje rastrowe
Wypełnianie obszarów
Sposób wypełnienia – wypełnienie powodziowe/pożar prerii (flood fill)
• Obszar jest wypełniony jednym kolorem
• Otoczenie obszaru wielokolorowe (kolory inne niż kolor obszaru)
Podstawowe operacje rastrowe
Wypełnianie obszarów
Metoda wypełniania pożar prerii
1. Wybierany jest piksel startowy (wewnątrz obszaru wypełnienia)
i umieszczany na stosie.
2. Dla wszystkich pikseli spójnych do danego piksela (cztero lub ośmio)
testowany jest warunek
- piksel jest tego samego koloru co startowy (w. powodziowe)
lub - piksel jest innego koloru niż kolor krawędzi (w. krawędziowe)
3. Wszystkie piksele spełniające warunek, oznaczane są jako nowe piksele
startowe (umieszczane na stosie)
4. Obecny piksel kolorowany jest nowym kolorem oraz usuwany ze stosu
5. Dla wszystkich pikseli na stosie wykonywane są punkty 2 do 4, tak długo
jak stos zawiera jakieś piksele.
Podstawowe operacje rastrowe
Wypełnianie obszarów
Metoda wypełniania pożar prerii – algorytm czterospójny
Wypełnione: 0 px
Stos: 1 px
Testowane: 4 px
Podstawowe operacje rastrowe
Wypełnianie obszarów
Metoda wypełniania pożar prerii – algorytm czterospójny
Wypełnione: 1 px
Stos: 4 px
Testowane: 16 px
Podstawowe operacje rastrowe
Wypełnianie obszarów
Metoda wypełniania pożar prerii – algorytm czterospójny
Wypełnione: 5 px
Stos: 7 px
Testowane: 49 px !! (w tym 11 nowych…)
i następne kroki…
Podstawowe operacje rastrowe
Wypełnianie obszarów
Metoda wypełniania pożar prerii – algorytm ośmiospójny krawędziowy
Wypełnione: 0 px
Stos: 1 px
Testowane: 8 px
Podstawowe operacje rastrowe
Wypełnianie obszarów
Metoda wypełniania pożar prerii – algorytm ośmiospójny krawędziowy
Wypełnione: 1 px
Stos: 8 px
Testowane: 72 px !!
Podstawowe operacje rastrowe
Wypełnianie obszarów
Metoda wypełniania pożar prerii – algorytm ośmiospójny krawędziowy
Wypełnione: 9 px
Stos: 6 px
Testowane: 54 px
Wypełnianie ośmiospójne „przecieka” przez krawędź ośmiospójną
Podstawowe operacje rastrowe
Wypełnianie obszarów
Metoda wypełniania pożar prerii
Główna wada:
Ogromna nadmiarowość testów kolorów pikseli
- Ten sam piksel może być sprawdzany nawet ośmiokrotnie
Podstawowe operacje rastrowe
Wypełnianie obszarów
Metoda wypełniania – algorytm Smitha
Algorytm ten wykorzystuje pojęcie segmentów:
Ciągów pikseli mających tą samą cechę
Segment jest opisywany 3 wartościami:
współrzędne x, y początku, oraz długość
segmentu
1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9
(2,2,6)
(3,4,3)
(8,6,2)
(3,9,1)
Podstawowe operacje rastrowe
Wypełnianie obszarów
Metoda wypełniania – algorytm Smitha
Etapy
1. Wybierany jest punkt wewnątrz obszaru
2. Dla punktu wyznaczany jest maksymalny
segment, kolorowany i zapisany na stosie
Podstawowe operacje rastrowe
Wypełnianie obszarów
Metoda wypełniania – algorytm Smitha
Etapy
3. Dla pierwszego piksela w segmencie
sprawdzane są piksele poniżej i powyżej
4. Jeżeli sprawdzony piksel należy do
obszaru, wyznaczany jest segment, do
którego należy, kolorowany i zapisany na
stosie
Podstawowe operacje rastrowe
Wypełnianie obszarów
Metoda wypełniania – algorytm Smitha
Etapy
5. Algorytm przesuwa się wzdłuż segmentu
bazowego o odległość równą
wyznaczonemu przyległemu segmentowi
+ 1. Testowany jest kolejny przyległy
piksel. Jeżeli sprawdzony piksel należy
do obszaru, wykonywane są zadania
z punktu 4
Podstawowe operacje rastrowe
Wypełnianie obszarów
Metoda wypełniania – algorytm Smitha
Etapy
5. Algorytm przesuwa się wzdłuż segmentu
bazowego o odległość równą
wyznaczonemu przyległemu segmentowi
+ 1. Testowany jest kolejny przyległy
piksel. Jeżeli sprawdzony piksel należy
do obszaru, wykonywane są zadania
z punktu 4
0 + 1 = 1
Podstawowe operacje rastrowe
Wypełnianie obszarów
Metoda wypełniania – algorytm Smitha
Etapy
5. Algorytm przesuwa się wzdłuż segmentu
bazowego o odległość równą
wyznaczonemu przyległemu segmentowi
+ 1. (Jeżeli wykroczono poza koniec
segmentu bazowego, algorytm kończy
sprawdzanie po tej stronie.) Testowany
jest kolejny przyległy piksel. Jeżeli
sprawdzony piksel należy do obszaru,
wykonywane są zadania z punktu 4
0 + 1 = 1
Podstawowe operacje rastrowe
Wypełnianie obszarów
Metoda wypełniania – algorytm Smitha
Etapy
5. Algorytm przesuwa się wzdłuż segmentu
bazowego o odległość równą
wyznaczonemu przyległemu segmentowi
+ 1. Testowany jest kolejny przyległy
piksel. Jeżeli sprawdzony piksel należy
do obszaru, wykonywane są zadania
z punktu 4
Podstawowe operacje rastrowe
Wypełnianie obszarów
Metoda wypełniania – algorytm Smitha
Jeżeli wykroczono poza koniec
segmentu bazowego po obu stronach,
bazowy segment jest usuwany ze
stosu. Algorytm kontynuuje działanie od
p.2 z kolejnym segmentem ze stosu
Podstawowe operacje rastrowe
Wypełnianie obszarów
Metoda wypełniania wielokątów
Wielokąt jest opisywany za pomocą zbioru odcinków
o początkach i końcach określanych współrzędnymi
pikselowymi
Dla skrócenia zapisu możliwe jest tworzenie
„łamanej” składającej się z kilku odcinków.
Zapisywana jest za pomocą ciągu liczb
gdzie 1 jest ilością odcinków a następne
parami współrzędnych tworzących łamaną
(bez powtórzeń wierzchołków)
Np. 4, 1,2, 4,4, 5,8, 17,3
Podstawowe operacje rastrowe
Wypełnianie obszarów
Metoda wypełniania wielokątów – skanowanie liniami poziomymi
Metoda ta polega na szukaniu przecięć odcinków wielokąta
z poziomymi liniami odpowiadającymi kolejnym rzędom
pikseli.
Algorytm zakłada, że linia pozioma przetnie
wielokąt parzystą ilość razy.
Dla każdej pary współrzędnych przecięć
(zaokrąglonych do pikseli) zamalowywany
jest odcinek pomiędzy nimi.
Podstawowe operacje rastrowe
Wypełnianie obszarów
Metoda wypełniania wielokątów – skanowanie liniami poziomymi
Najprostsza wersja algorytmu skanowania liniami
poziomymi miałaby postać:
1. wyznacz ymin i ymax z listy krawędzi wielokąta
2. Dla y = ymin; ymax; y++ wykonuj kroki 3-5
3. Wyznacz X - zbiór współrzędnych x punktów przecięcia
krawędzi z listy z linią skanującą y
4. Posortuj rosnąco zbiór X
5. Dla kolejnych par punktów ze zbioru X narysuj odcinki na
wysokości y.
6. Koniec
Ale…
Podstawowe operacje rastrowe
Wypełnianie obszarów
Metoda wypełniania wielokątów – skanowanie liniami poziomymi
Przypadki szczególne
Wielokąt posiada odcinek poziomy - nieokreślona ilość
przecięć z linią skanującą spowoduje błędne działanie
algorytmu.
Rozwiązanie: Eliminacja odcinków poziomych (ta sama
wartość y początku i końca) z listy.
->
Efekt uboczny: wypełnienie nie obejmuje krawędzi poziomej
Podstawowe operacje rastrowe
Wypełnianie obszarów
Metoda wypełniania wielokątów – skanowanie liniami poziomymi
Przypadki szczególne
Natrafienie linii skanującej na końce odcinków
Może (ale nie musi) spowodować błędne działanie algorytmu
Podstawowe operacje rastrowe
Wypełnianie obszarów
Metoda wypełniania wielokątów – skanowanie liniami poziomymi
Przypadki szczególne
Natrafienie linii skanującej na końce odcinków
Trzy możliwości:
- oba odcinki są powyżej linii skanującej
- oba odcinki są poniżej linii skanującej
- jeden odcinek jest powyżej
linii skanującej a drugi poniżej
Podstawowe operacje rastrowe
Wypełnianie obszarów
Metoda wypełniania wielokątów – skanowanie liniami poziomymi
Przypadki szczególne
Natrafienie linii skanującej na końce odcinków
-jeden odcinek jest powyżej
linii skanującej a drugi poniżej
Efekt: „dodatkowy” odcinek lub
nieparzysta ilość współrzędnych
odcinków
Podstawowe operacje rastrowe
Wypełnianie obszarów
Metoda wypełniania wielokątów – skanowanie liniami poziomymi
Przypadki szczególne
Natrafienie linii skanującej na końce odcinków
-jeden odcinek jest powyżej
linii skanującej a drugi poniżej
Rozwiązanie:
Linie skanujące przemieszczają się
w jednym kierunku. Eliminowanie
z listy odcinków stykających się z linią,
takich które leżą powyżej linii.
Efekt uboczny 1: optymalizacja algorytmu
Efekt uboczny 2: możliwa utrata niektórych pikseli wypełnienia
Podstawowe operacje rastrowe
Wypełnianie obszarów
Metoda wypełniania wielokątów – skanowanie liniami poziomymi
Obliczanie przecięcia linii z odcinkiem
Kolejne wykorzystanie algorytmu przyrostowego:
- odcinek ma współrzędne (x1,y1, x2,y2)
- współrzędna ys linii skanującej wzrasta o 1
- Jeżeli ys=y1 to współrzędna xp przecięcia = x1
Dla każdej kolejnej wartości ys aż do ys=y2, xp przecięcia można
wyliczyć ze wzoru: xp(y+1)=xp(y)+dx
gdzie dx=(x2-x1)/(y2-y1)
Podstawowe operacje rastrowe
Obcinanie
Obcinanie ma miejsce w sytuacji gdy obraz nie mieści się
na ekranie / w oknie wyświetlania.
Sensowną i często niezbędną praktyką jest usunięcie elementów
obrazu leżących poza obszarem wyświetlania
Obcięcie obrazu rastrowego jest sprawą trywialną. Sytuacja
komplikuje się gdy obraz zawiera obiekty zdefiniowane wektorowo
a algorytm ma wybrać tylko te obiekty i ich części, które znajdują się
w oknie wyświetlania
Podstawowe operacje rastrowe
Obcinanie
Jednym z najbardziej rozpowszechnionych algorytmów obcinania
odcinków jest algorytm Cohena-Sutherlanda.
Bazuje on na podziale obrazu na 9 części i przypisaniu im
odpowiednich kodów bitowych
Algorytm obcinania odcinków Cohena-Sutherlanda
1001 1000 1010
0001 0000 0010
0101 0100 0110
Okno wyświetlania
/ pole obcinania
Podstawowe operacje rastrowe
Obcinanie
Kody poszczególnych pól
dobrane zostały w określony
sposób
Dwie pierwsze cyfry definiują
wiersz (10xx, 00xx, 01xx)
dwie kolejne kolumnę pola
(xx01, xx00, xx10)
Końce odcinków przyjmują kody
pól, w których leżą.
Algorytm obcinania odcinków Cohena-Sutherlanda
1001 1000 1010
0001 0000 0010
0101 0100 0110
xxx1
1xxx
Podstawowe operacje rastrowe
Obcinanie
Odcinki mogą być usytuowane różnie
względem pola obcinania
A. Odcinek leży po jednej stronie poza
obszarem obcinania.
B. Odcinek leży „ukośnie” poza
obszarem obcinania
C. Odcinek leży jednym końcem
w obszarze obcinania
D. Odcinek przechodzi przez obszar
obcinania
E. Odcinek zawiera się w obszarze
obcinania
Algorytm obcinania odcinków Cohena-Sutherlanda
1001 1000 1010
0001 0000 0010
0101 0100 0110
A
B
C
D
E
Podstawowe operacje rastrowe
Obcinanie
Procedura wykonuje dwa przebiegi,
w jednym przebiegu:
Korzystając z prostych testów można
rozpoznać odcinki typu E
- Kod obu końców odcinka = 0000
Oraz odcinki typu A
- Bitowy iloczyn logiczny kodów obu
końców odcinka będzie > 0
Algorytm obcinania odcinków Cohena-Sutherlanda
1001 1000 1010
0001 0000 0010
0101 0100 0110
A
B
C
D
E
A 1001 1010 = 1000
B 0001 1000 = 0000
C 0000 0010 = 0000
itd..
Oba rodzaje odcinków można wyeliminować z dalszego sprawdzania
Podstawowe operacje rastrowe
Obcinanie
Algorytm obcinania odcinków Cohena-Sutherlanda
1001 1000 1010
0001 0000 0010
0101 0100 0110
B
C
D
Pozostałe odcinki musza być poddane
procedurze obcinania.
1. Wybierany jest punkt końca o kodzie
różnym od 0000
Podstawowe operacje rastrowe
Obcinanie
Algorytm obcinania odcinków Cohena-Sutherlanda
1001 1000 1010
0001 0000 0010
0101 0100 0110
B
C
D
Pozostałe odcinki musza być poddane
procedurze obcinania.
1. Wybierany jest punkt końca o kodzie
różnym od 0000
2. W zależności od kodu punktu
wybierana jest linia obcinania (0010).
xk
Podstawowe operacje rastrowe
Obcinanie
Algorytm obcinania odcinków Cohena-Sutherlanda
Pozostałe odcinki musza być poddane
procedurze obcinania.
1. Wybierany jest punkt końca o kodzie
różnym od 0000
2. W zależności od kodu punktu
wybierana jest linia obcinania (0010)
3. Znajdowany jest punkt przecięcia
odcinka z linią
xk
(x2,y2)
(x1,y1)
k
k
xx
xx
xxyyyy
'
'12
1121
Podstawowe operacje rastrowe
Obcinanie
Algorytm obcinania odcinków Cohena-Sutherlanda
1001 1000 1010
0001 0000 0010
0101 0100 0110
B
D
Pozostałe odcinki musza być poddane
procedurze obcinania.
1. Wybierany jest punkt końca o kodzie
różnym od 0000
2. W zależności od kodu punktu
wybierana jest linia obcinania (0010)
3. Znajdowany jest punkt przecięcia
odcinka z linią
4. Nowy punkt przyjmowany jest za
koniec odcinka, obliczany jest nowy
kod tego końca.
xk
C
Podstawowe operacje rastrowe
Obcinanie
Algorytm obcinania odcinków Cohena-Sutherlanda
1001 1000 1010
0001 0000 0010
0101 0100 0110
B
D
Pozostałe odcinki musza być poddane
procedurze obcinania.
1. Wybierany jest punkt końca o kodzie
różnym od 0000
2. W zależności od kodu punktu
wybierana jest linia obcinania (0010)
3. Znajdowany jest punkt przecięcia
odcinka z linią
4. Nowy punkt przyjmowany jest za
koniec odcinka, obliczany jest nowy
kod tego końca.
Analogicznie dla wszystkich pozostałych odcinków
C
Podstawowe operacje rastrowe
Obcinanie
Algorytm obcinania odcinków Cohena-Sutherlanda
1001 1000 1010
0001 0000 0010
0101 0100 0110
D
Drugi przebieg eliminuje w początkowej
fazie odcinki typu B i C
Dla procedury obcinania pozostają odcinki
typu D.
Podstawowe operacje rastrowe
Obcinanie
Algorytm obcinania wieloboków Sutherlanda-Hodgmana
W przypadku wieloboków mamy do czynienia z listą odcinków
tworzących zamknięty obszar (często wypełniony).
Obcięcie wiąże się więc nie tylko z usunięciem bądź skróceniem
odpowiednich odcinków ale również z uzupełnieniem krawędzi
wieloboku aby nadal tworzył obszar zamknięty.
Algorytm Sutherlanda-Hodgmana wykorzystuje zapis wieloboku
w postaci listy punktów – wierzchołków wieloboku.
Przetwarza on zbiór P(p1,p2,…,pn) w zbiór Q(q1,q2,…,qm) gdzie n nie
musi być równe m
Podstawowe operacje rastrowe
Obcinanie
Algorytm obcinania wieloboków Sutherlanda-Hodgmana
Wielobok może być w jednej z 4 pozycji w stosunku do obszaru
obcinania. Pierwsze 3 pozycje nie stanowią problemu.
Podstawowe operacje rastrowe
Obcinanie
Algorytm obcinania wieloboków Sutherlanda-Hodgmana
Kłopotliwa jest sytuacja 4 gdy wielokąt
zawiera się częściowo o obszarze obcinania.
Algorytm wykonuje 4 przebiegi po
wierzchołkach, zawsze w tą samą stronę.
Za każdym przebiegiem brana jest pod
uwagę jedna z linii obcinania.
w1
w2
w3
Podstawowe operacje rastrowe
Obcinanie
Algorytm obcinania wieloboków Sutherlanda-Hodgmana
Wierzchołek znajdujący się po wewnętrznej stronie linii obcinania jest
przepisywany do nowego zbioru.
Wierzchołek znajdujący się po zewnętrznej stronie jest usuwany.
Testowane jest również to czy poprzedni wierzchołek znajduje się po
tej samej stronie linii. Jeżeli nie, wyliczany jest punkt przecięcia
odcinka z linią i dodawany do zbioru
Nw1
w3 w4
w2
Podstawowe operacje rastrowe
Obcinanie
Algorytm obcinania wieloboków Sutherlanda-Hodgmana
Cztery przebiegi algorytmu są wykonywane dla czterech linii
obcinania
Podstawowe operacje rastrowe
Obcinanie
Algorytm obcinania wieloboków Sutherlanda-Hodgmana
Szczególnym przypadkiem obcinania jest sytuacja gdy obcinany
obiekt jest wielokątem wklęsłym. W takim przypadku algorytm może
wytworzyć zdegenerowany obiekt pochodny, zawierający kilka
obszarów połączonych liniami.