• Nie Znaleziono Wyników

Algorytmy rastrowe

N/A
N/A
Protected

Academic year: 2021

Share "Algorytmy rastrowe"

Copied!
23
0
0

Pełen tekst

(1)

Grafika Komputerowa. Algorytmy rastrowe

Aleksander Denisiuk

Polsko-Japo ´nska Akademia Technik Komputerowych Wydział Informatyki w Gda ´nsku

ul. Brzegi 55 80-045 Gda ´nsk

(2)

Algorytmy rastrowe

Rasteryzacja odcinka Rasteryzacja okr ˛egu Rasteryzacja elipsy Rasteryzacja krywej Wypełnienie obszaru

Najnowsza wersja tego dokumentu dost ˛epna jest pod adresem

(3)

Rasteryzacja odcinka

Rasteryzacja odcinka

Rasteryzacja okr ˛egu Rasteryzacja elipsy Rasteryzacja krywej Wypełnienie obszaru A B C D

(4)

Zało˙zenia

Rasteryzacja odcinka

Rasteryzacja okr ˛egu Rasteryzacja elipsy Rasteryzacja krywej Wypełnienie obszaru



(x, y)

— współrz˛edne „abstrakcyjne”, liczby rzeczywiste 

(i, j)

— współrz˛edne ekranowe, liczby całkowite



x

2

> x

1

, y

2

>

y

1 

y

2

− y

1

6

x

2

− x

1

 Zaokr ˛aglenie:

i

1

= round(x

1

)

,

i

2

= round(x

2

)

,

j

1

= round(y

1

)

,

(5)

Algorytm

Rasteryzacja odcinka

Rasteryzacja okr ˛egu Rasteryzacja elipsy Rasteryzacja krywej Wypełnienie obszaru 

y(i) = j

1

+

i−i1 i2−i1

(j

2

− j

1

)



j = round(y)

 Kod:

Wej ´scie:

(i

1

, j

1

)

— pocz ˛atek odcinka,

(i

2

, j

2

)

— koniec odcinka,

i

2

> i

1

, j

2

>

j

1,

j

2

− j

1

6

i

2

− i

1 Wynik: Odcinek został wy´swietlony

m ←

j2−j1 i2−i1 writePixel(

i

1,

j

1)

y ← j

1 for

i = i

1

+ 1

to

i

2 do

y ← y + m

j ← round(y)

writePixel(

i

,

j

) end for

(6)

Kumulacja przyrostu

y

Rasteryzacja odcinka

Rasteryzacja okr ˛egu Rasteryzacja elipsy Rasteryzacja krywej Wypełnienie obszaru

 na ka˙zdym kroku do przyrostu

y

dodaje si ˛e

m

(7)

Algorytm 2

Rasteryzacja odcinka

Rasteryzacja okr ˛egu Rasteryzacja elipsy Rasteryzacja krywej Wypełnienie obszaru

Wej ´scie:

(i

1

, j

1

)

— pocz ˛atek odcinka,

(i

2

, j

2

)

— koniec odcinka,

i

2

> i

1

, j

2

>

j

1,

j

2

− j

1

6

i

2

− i

1

Wynik: Odcinek został wy´swietlony

m ←

j2−j1 i2−i1

b ← 0

writePixel(

i

1,

j

1)

j ← j

1 for

i = i

1

+ 1

to

i

2 do

b ← b + m

if

b >

12 then

j ← j + 1

b ← b − 1

end if writePixel(

i

,

j

) end for

(8)

Eliminacja liczb rzeczywistych

Rasteryzacja odcinka

Rasteryzacja okr ˛egu Rasteryzacja elipsy Rasteryzacja krywej Wypełnienie obszaru

 przyrost jest wielokrotno´sci ˛a

m =

j2−j1

i2−i1 :



b = k

j2−j1

i2−i1



b <

1

2

⇐⇒ 2k(j

2

− j

1

) < i

2

− i

1

 zamieniamy przyrost na przyrost całkowity

 przyrost całkowity na ka˙zdym kroku zwi ˛eksza si ˛e

o

2∆j = 2(j

2

− j

1

)

 przechodzimy na wy˙zszy poziom w

j

, je˙zeli przyrost całkowity

(9)

Algorytm Bresenhama

Rasteryzacja odcinka

Rasteryzacja okr ˛egu Rasteryzacja elipsy Rasteryzacja krywej Wypełnienie obszaru

Wej ´scie:

(i

1

, j

1

)

— pocz ˛atek odcinka,

(i

2

, j

2

)

— koniec odcinka,

i

2

> i

1

, j

2

>

j

1,

j

2

− j

1

6

i

2

− i

1

Wynik: Odcinek został wy´swietlony

m ← 2(j

2

− j

1

)

b ← 0

writePixel(

i

1,

j

1)

j ← j

1

P ← i

2

− i

1 for

i = i

1

+ 1

to

i

2 do

b ← b + m

if

b > P

then

j ← j + 1

b ← b − 2P

end if writePixel(

i

,

j

) end for

(10)

Osiem symetrii okr ˛egu

Rasteryzacja odcinka

Rasteryzacja okr ˛egu

Rasteryzacja elipsy Rasteryzacja krywej Wypełnienie obszaru



x

2

+ y

2

= R

2

 je˙zeli

(x, y)

le˙zy na okr ˛egu, to



(y, x)

,

(x, −y)

,

(y, −x)

,

(−x, y)

,

(−y, x)

,

(−x, −y)

,

(11)

Wybór nast ˛epnego piksela

Rasteryzacja odcinka

Rasteryzacja okr ˛egu

Rasteryzacja elipsy Rasteryzacja krywej Wypełnienie obszaru  Zaczynamy od wierzchołka

(0, R)

 Analizujemy

f (x, y) = 4 (x + 1)

2

+ (y −

1 2

)

2

− R

2



 je˙zeli

f (x, y) > 0

to przechodzimy w prawo i w dół

 je˙zeli

f (x, y) < 0

to przechodzimy tylko w prawo



f (x + 1, y) = f (x, y) + 8x + 12



f (x + 1, y − 1) = f (x, y) + 8x − 8y + 20



f (0, R) = 5 − 4R

(12)

Algorytm

Rasteryzacja odcinka

Rasteryzacja okr ˛egu

Rasteryzacja elipsy Rasteryzacja krywej Wypełnienie obszaru

Wej ´scie: ´Srodek okr ˛egu jest w

(0, 0)

, promie ´n

R ∈ N

Wynik: Okr ˛ag został wy´swietlony

i ← 0

,

j ← R

,

f ← 5 − 4R

writePixel(

i

,

j

) while

i 6 j

do if

f > 0

then

f ← f + 8i − 8j + 20

j ← j − 1

else

f ← f + 8i + 12

end if

i ← i + 1

writePixel(

i

,

j

) end while

(13)

Rasteryzacja elipsy

Rasteryzacja odcinka Rasteryzacja okr ˛egu

Rasteryzacja elipsy Rasteryzacja krywej Wypełnienie obszaru

x

2

a

2

+

y

2

b

2

= 1

 Zaczynamy od wierzchołka

(0, b)

 Analizujemy

f (x, y) = 4a

2

b

2



(x+1)2 a2

+

(y−12)2 b2

− 1



 je˙zeli

f (x, y) > 0

to przechodzimy w prawo i w dół

 je˙zeli

f (x, y) < 0

to przechodzimy tylko w prawo



f (x + 1, y) = f (x, y) + 8b

2

x + 12b

2



f (x + 1, y − 1) = f (x, y) + 8b

2

x − 8a

2

y + 12b

2

+ 8a

2 

f (0, b) = 4b

2

− 4a

2

b + a

2

(14)

Zmiana kierunku

Rasteryzacja odcinka Rasteryzacja okr ˛egu

Rasteryzacja elipsy

Rasteryzacja krywej Wypełnienie obszaru

 Je˙zeli

b

2

x > a

2

y

, to zmienia si ˛e kierunek ratserizacji

 Analizujemy

g(x, y) = 4a

2

b

2



(x+1 2)2 a2

+

(y−1)2 b2

− 1



 je˙zeli

g(x, y) > 0

to przechodzimy w prawo i w dół

 je˙zeli

g(x, y) < 0

to przechodzimy tylko w dół



g(x, y) = f (x, y) − 4b

2

x − 3b

2

− 4a

2

y + 3a

2 

g(x, y − 1) = g(x, y) − 8a

2

y + 12a

2

(15)

Algorytm

Rasteryzacja odcinka Rasteryzacja okr ˛egu

Rasteryzacja elipsy

Rasteryzacja krywej Wypełnienie obszaru

Wej ´scie: ´Srodek elipsy jest w

(0, 0)

, promienie

a, b ∈ N

Wynik: Elipsa została wy´swietlona

i ← 0

,

j ← b

,

f ← 4b

2

− 4a

2

b + a

2 writePixel(

i

,

j

) while

b

2

i 6 a

2

j

do if

f > 0

then

f ← f + 8b

2

i − 8a

2

j + 12b

2

+ 8a

2

j ← j − 1

else

f ← f + 8b

2

i + 12b

2 end if

i ← i + 1

writePixel(

i

,

j

) end while

(16)

Algorytm. Zmiana kierunku

Rasteryzacja odcinka Rasteryzacja okr ˛egu

Rasteryzacja elipsy Rasteryzacja krywej Wypełnienie obszaru

g ← f − 4b

2

i − 3b

2

− 4a

2

j + 3a

2 while

j > 0

do if

g 6 0

then

g ← g + 8b

2

i − 8a

2

j + 8b

2

+ 12a

2

i ← i + 1

else

g ← g − 8a

2

j + 12a

2 end if

j ← j − 1

writePixel(

i

,

j

) end while

(17)

Rasteryzacja krywej

Rasteryzacja odcinka Rasteryzacja okr ˛egu Rasteryzacja elipsy

Rasteryzacja krywej

Wypełnienie obszaru

 Przybli˙zenie przez łaman ˛a

 Metoda Eulera dla równania

˙x = f

1

(x, y),

˙y = f

2

(x, y),

x(0) = x

0

,

y(0) = y

0

.

(18)

Wypełnienie wieloboku

Rasteryzacja odcinka Rasteryzacja okr ˛egu Rasteryzacja elipsy Rasteryzacja krywej

(19)

Przegl ˛

adanie liniami poziomymi (Scanline interpolation)

Rasteryzacja odcinka Rasteryzacja okr ˛egu Rasteryzacja elipsy Rasteryzacja krywej

Wypełnienie obszaru

Wej ´scie: lista kraw ˛edzi wieloboku

{

(x

i

, y

i

), (x

i+1

, y

i+1

) }

,

i = 0, . . . , n

,

x

n

= x

0,

y

n

= y

0

Wynik: wypełniono wn ˛etrze wieloboku

uporz ˛adkuj wierzchołki w kraw ˛edziach aby

y

i

< y

i+1, usu ´n kraw ˛edzie poziome

uporz ˛adkuj kraw ˛edzie w kolejno´sci rosn ˛acych

y

i

TAK ← ∅

(Tabela Aktywnych Kraw ˛ezi)

y ← y

i pierwszej kraw ˛edzi

repeat

TAK ← TAK ∪ {

kraw ˛edzie, których pierwszy koniec jest na linii

y}

Opracowanie poziomu

y

y

++;

TAK ← TAK \ {

kraw ˛edzie, których drugi koniec jest na linii

y}

(20)

Opracowanie poziomu

y

Rasteryzacja odcinka Rasteryzacja okr ˛egu Rasteryzacja elipsy Rasteryzacja krywej

Wypełnienie obszaru

Wej ´scie:

TAK 6= ∅

(zawiera parzyst ˛a ilo´s´c elementów)

Wynik: wypełniony poziom

y

for all kraw ˛edzi z

TKA

do

Oblicz współrz˛edn ˛a

x

punktu przeci ˛ecia z lini ˛a poziom ˛a

y

end for

Posortuj

TKA

w kolejno´sci rosn ˛acych współrz˛ednych

x

punktów

przeci ˛ecia

for all kolejnych par kraw ˛edzi z

TKA

do

rysuj odcinek poziomy na linii

y

, mi ˛edzy ich punktami przeci ˛ecia

z lini ˛a

y

;

(21)

Wypełnianie przez zalewanie

Rasteryzacja odcinka Rasteryzacja okr ˛egu Rasteryzacja elipsy Rasteryzacja krywej

Wypełnienie obszaru

 obszar jest czterospójny

(22)

Procedura rekurencyjna

Rasteryzacja odcinka Rasteryzacja okr ˛egu Rasteryzacja elipsy Rasteryzacja krywej

Wypełnienie obszaru

Wej ´scie: punkt

(i, j)

zawiera si ˛e w obszarze

Wynik: zamalowany cały obszar

if niezamalowany wewn ˛etrzny piksel

(i, j)

then

Zamaluj

(i, j)

Wypełnij poczynaj ˛ac z

(i − 1, j)

Wypełnij poczynaj ˛ac z

(i, j − 1)

Wypełnij poczynaj ˛ac z

(i + 1, j)

Wypełnij poczynaj ˛ac z

(i, j + 1)

(23)

Stos zawieszonych zada ´n

Rasteryzacja odcinka Rasteryzacja okr ˛egu Rasteryzacja elipsy Rasteryzacja krywej

Wypełnienie obszaru

Wej ´scie: punkt

(i, j)

zawiera si ˛e w obszarze

Wynik: zamalowany cały obszar

Stos

S ← ∅

zamaluj

(i, j)

;

S ← S ∪ (i, j)

while

S 6= ∅

do

S ← S \ (i, j)

if niezamalowany wewn ˛etrzny piksel

(i − 1, j)

then

zamaluj

(i − 1, j)

;

S ← S ∪ (i − 1, j)

end if

if niezamalowany wewn ˛etrzny piksel

(i, j − 1)

then

zamaluj

(i, j − 1)

;

S ← S ∪ (i, j − 1)

end if

if niezamalowany wewn ˛etrzny piksel

(i + 1, j)

then

zamaluj

(i − 1, j)

; Stos

S ← S ∪ (i + 1, j)

end if

if niezamalowany wewn ˛etrzny piksel

(i, j + 1)

then

zamaluj

(i − 1, j)

;

S ← S ∪ (i, j + 1)

Obraz

Figure II.24: The line segment AB has slope j =i  1 . The line segment C D

Cytaty

Powiązane dokumenty

RDF Schema Wprowadzenie RDF Semantic Web Składnia Kontenery Kolekcje RDFS DCMI RDFa Microdata JSON-LD ✔ Rozszerzenie RDF. ✔ Zawiera język do opisania zestawów predykatów

JQuery Wprowadzenie Dostęp Modyfikacjia Łańcuch 2 / 23 Najnowsza wersja tego dokumentu dostępna jest pod

je˙zeli serwer nie rozpoznał metody ˙z ˛ adania, on zwraca kod odpowiedzi 501 (Not implemented). je˙zeli serwer rozpoznał metod ˛e, ale one nie mo˙ze zosta´c zastosowana do

[r]

Znajdź równanie parametryczne krzywej, którą tworzy punkt okręgu o promieniu r, toczącego się bez. poślizgu wzdłuż

Najnowsza wersja tego dokumentu dostępna jest pod adresem http://users.pjwstk.edu.pl/~denisjuk/.

Znajdź kąt między przekątnymi płaszczyzn Oxy oraz Oyz kartezjańskiego układu współrzędnych.. Udowodnij, że ABCD jest równole- głobokiem i znajdź

Najnowsza wersja tego dokumentu dostępna jest pod adresem http://users.pjwstk.edu.pl/~denisjuk/..