1 / 22
Elementy grafiki komputerowej. Elementy algorytmów obcinania i okienkowania
Aleksander Denisiuk
Uniwersytet Warmi ´nsko-Mazurski Olsztyn, ul. Słoneczna 54
denisjuk@matman.uwm.edu.pl
Elementy algorytmów obcinania i okienkowania
Obcinanie odcinków i prostych
Obcinanie wielok ˛atów
Najnowsza wersja tego dokumentu dost ˛epna jest pod adresem
http://wmii.uwm.edu.pl/~denisjuk/uwm
Obcinanie odcinków i prostych
Obcinanie odcinków i prostych
❖Obcinanie
odcinków i prostych
❖Algorytm
Sutherlanda-Cohena
❖Algorytm
Lianga-Barsky’ego Obcinanie
wielok ˛atów
3 / 22
Obcinanie odcinków i prostych
Obcinanie odcinków i prostych
❖Obcinanie
odcinków i prostych
❖Algorytm
Sutherlanda-Cohena
❖Algorytm
Lianga-Barsky’ego Obcinanie
wielok ˛atów
● wyznaczenie fragmentu odcinka lub prostej, który le˙zy wewn ˛ atrz okna na ekranie
● wyznaczenie fragmentu odcinka lub prostej, który le˙zy
wewn ˛ atrz ustalonej bryły wielo´sciennej
Przeci ˛ecie odcinka i prostej
Obcinanie odcinków i prostych
❖Obcinanie
odcinków i prostych
❖Algorytm
Sutherlanda-Cohena
❖Algorytm
Lianga-Barsky’ego Obcinanie
wielok ˛atów
5 / 22
● p 1 = (x 1 , y 1 ), p 2 = (x 2 , y 2 )
● ax + by = c
● t = a (x c−ax
1−by
12
−x
1)+b(y
2−y
1)
✦ je´sli t / ∈ [0, 1], to prosta i odcinek s ˛ a rozł ˛ aczne
✦ je´sli t ∈ [0, 1], to mo˙zna znale´z´c punkt wspólny
■
x = c
■
y = c
Przeci ˛ecie odcinka i płaszczyzny
Obcinanie odcinków i prostych
❖Obcinanie
odcinków i prostych
❖Algorytm
Sutherlanda-Cohena
❖Algorytm
Lianga-Barsky’ego Obcinanie
wielok ˛atów
● p 1 = (x 1 , y 1 , z 1 ), p 2 = (x 2 , y 2 , z 2 )
● ax + by + cz = d
Algorytm Sutherlanda-Cohena
Obcinanie odcinków i prostych
❖Obcinanie
odcinków i prostych
❖Algorytm
Sutherlanda-Cohena
❖Algorytm
Lianga-Barsky’ego Obcinanie
wielok ˛atów
7 / 22
● Dane s ˛ a punkty ko ´ncowe odcinka i prostok ˛ atne okno.
● Proste, na których le˙z ˛ a kraw ˛edzie okna, dziel ˛ a płaszczyzn ˛e na 9 obszarów.
● Przyporz ˛ adkujemy im czterobitowe kody:
Algorytm Sutherlanda-Cohena
Obcinanie odcinków i prostych
❖Obcinanie
odcinków i prostych
❖Algorytm
Sutherlanda-Cohena
❖Algorytm
Lianga-Barsky’ego Obcinanie
wielok ˛atów
● Wyznaczamy kody obszarów, do których nale˙z ˛ a ko ´nce odcinka
● je´sli oba kody na dowolnej pozycji maj ˛ a jedynk˛e, to cały
odcinek le˙zy poza oknem
Algorytm Sutherlanda-Cohena
Obcinanie odcinków i prostych
❖Obcinanie
odcinków i prostych
❖Algorytm
Sutherlanda-Cohena
❖Algorytm
Lianga-Barsky’ego Obcinanie
wielok ˛atów
9 / 22
● Je´sli oba punkty ko ´ncowe maj ˛ a kod 0, to cały odcinek le˙zy wewn ˛ atrz okna
● Je´sli kody s ˛ a ró˙zne od 0, ale nie maj ˛ a jedynki
jednocze´snie na ˙zadnej pozycji, to odcinek mo˙ze mie´c
cz˛e´sci wewn ˛ atrz okna
Wła ´sciwie algorytm
Obcinanie odcinków i prostych
❖Obcinanie
odcinków i prostych
❖Algorytm
Sutherlanda-Cohena
❖Algorytm
Lianga-Barsky’ego Obcinanie
wielok ˛atów
Wej ´scie: odcinek [p 1 , p 2 ]
Wynik: cz˛e´s´c odcinka wewn ˛ atrz okna c 1 ← kod(p 1 ), c 2 ← kod(p 2 )
while c 1 or c 2 do if c 1 and c 2 then
return ∅ end if
if c 1 then
Zamie ´n (p 1 , c 1 ) else
Zamie ´n (p 2 , c 2 ) end if
end while
Procedura Zamie ´n
Obcinanie odcinków i prostych
❖Obcinanie
odcinków i prostych
❖Algorytm
Sutherlanda-Cohena
❖Algorytm
Lianga-Barsky’ego Obcinanie
wielok ˛atów
11 / 22
Wej ´scie: c = kod(p), c 6= 0, c&c ′ = 0
Wynik: p le˙zy na tym samym odcinku, c = kod(p), c ma mniej niezerowych bitów
if pierwszy bit jest niezerowy then
p zamieniamy na przeci ˛ecie z y = top c ← kod(p)
else if drugi bit jest niezerowy then
p zamieniamy na przeci ˛ecie z y = bottom c ← kod(p)
else if trzeci bit jest niezerowy then
p zamieniamy na przeci ˛ecie z x = right c ← kod(p)
else if czwarty bit jest niezerowy then p zamieniamy na przeci ˛ecie z x = left c ← kod(p)
end if
Przykłady
Obcinanie odcinków i prostych
❖Obcinanie
odcinków i prostych
❖Algorytm
Sutherlanda-Cohena
❖Algorytm
Lianga-Barsky’ego Obcinanie
wielok ˛atów
1001 1000 1010
0001 0000 0010
A
B
C
D
F H
G
Algorytm Lianga-Barsky’ego
Obcinanie odcinków i prostych
❖Obcinanie
odcinków i prostych
❖Algorytm
Sutherlanda-Cohena
❖Algorytm
Lianga-Barsky’ego Obcinanie
wielok ˛atów
13 / 22
( x = x 1 + s(x 2 − x 1 ) = x 1 + s∆x,
y = y 1 + s(y 2 − y 1 ) = y 1 + s∆y, dla s ∈ [0, 1],
● odcinek le˙zy w oknie je˙zeli l 6 x 1 + s∆x 6 r oraz b 6 y 1 + s∆y 6 t
● czyli sp k 6 q k , k = 1, 2, 3, 4, gdzie
✦ p 1 = −∆x, q 1 = x 1 − l
✦ p 2 = ∆x, q 2 = r − x 1
✦ p 3 = −∆y, q 3 = y 1 − b
✦ p 4 = ∆y, q 4 = t − y 1
Dla ka˙zdej kraw ˛edzi
Obcinanie odcinków i prostych
❖Obcinanie
odcinków i prostych
❖Algorytm
Sutherlanda-Cohena
❖Algorytm
Lianga-Barsky’ego Obcinanie
wielok ˛atów
● je˙zeli p k = 0, to odcinek jest równoległy do tej kraw˛edzi
✦ je˙zeli q k < 0, to odcinek trzeba odrzuci´c
● je˙zeli p k < 0, to odcinek wchodzi do okna
✦ obliczamy u k = max n
0, p q
kko
● je˙zeli p k > 0, to odcinek wychodzi z okna
✦ obliczamy v k = min n
q
kp
k, 1 o
Wniosek
Obcinanie odcinków i prostych
❖Obcinanie
odcinków i prostych
❖Algorytm
Sutherlanda-Cohena
❖Algorytm
Lianga-Barsky’ego Obcinanie
wielok ˛atów
15 / 22
● u = max u k , v = min v k
● przedział odcinka s ∈ [u, v] le˙zy w oknie
● je˙zeli u > v, odcinek jest poza oknem
Przykład
Obcinanie odcinków i prostych
❖Obcinanie
odcinków i prostych
❖Algorytm
Sutherlanda-Cohena
❖Algorytm
Lianga-Barsky’ego Obcinanie
wielok ˛atów
Obcinanie prostych
Obcinanie odcinków i prostych
❖Obcinanie
odcinków i prostych
❖Algorytm
Sutherlanda-Cohena
❖Algorytm
Lianga-Barsky’ego Obcinanie
wielok ˛atów
17 / 22
● Modyfikacja algorytmu Lianga-Barsky’ego:
✦ parametr s nale˙zy do całej prostej R, a nie do
przedziału [0, 1]
Obcinanie wielok ˛ atów
Obcinanie odcinków i prostych
Obcinanie wielok ˛atów
❖Algorytm Sutherlanda- Hodgmana
❖Przykład
❖Wielok ˛at niewypukły
❖Algorytm
Weilera-Athertona
Algorytm Sutherlanda-Hodgmana
Obcinanie odcinków i prostych
Obcinanie wielok ˛atów
❖Algorytm Sutherlanda- Hodgmana
❖Przykład
❖Wielok ˛at niewypukły
❖Algorytm
Weilera-Athertona
19 / 22
● Obcinaj ˛ acy wielok ˛ at (okno) jest wypukłym (przeci ˛eciem półpłaszczyzn)
● Obcinamy kolejno ka˙zd ˛ a kraw ˛edzi ˛ a (półpłaszczyzn ˛ a):
✦ modyfikujemy ci ˛ ag wierzchołków stosownie do
wzajemnego poło˙zenia
Przykład
Obcinanie odcinków i prostych
Obcinanie wielok ˛atów
❖Algorytm Sutherlanda- Hodgmana
❖Przykład
❖Wielok ˛at niewypukły
❖Algorytm
Weilera-Athertona
Wielok ˛ at niewypukły
Obcinanie odcinków i prostych
Obcinanie wielok ˛atów
❖Algorytm Sutherlanda- Hodgmana
❖Przykład
❖Wielok ˛at niewypukły
❖Algorytm
Weilera-Athertona
21 / 22
● wynik mo˙ze by´c niespójny
✦ mamy krotn ˛ a kraw ˛ed´z
✦ mo˙zna wyeleminowa´c
Algorytm Weilera-Athertona
Obcinanie odcinków i prostych
Obcinanie wielok ˛atów
❖Algorytm Sutherlanda- Hodgmana
❖Przykład
❖Wielok ˛at niewypukły
❖Algorytm
Weilera-Athertona