Download as pdf or txt
Download as pdf or txt
You are on page 1of 202

MARKO UPI

SKRIPTA IZ RAUNALNE GRAFIKE

SKRIPTA IZ RAUNALNE GRAFIKE

SADRAJ
1.0

UVOD U OSNOVNE MATEMATIKE POJMOVE_________________________ 8

1.1

NAINI OZNAAVANJA __________________________________________ 8

1.2

TOKA __________________________________________________________ 8

1.3

VEKTOR _________________________________________________________ 9

2.0

PRAVAC ___________________________________________________________ 10

2.1
JEDNADBA PRAVCA____________________________________________ 10
2.1.1
PARAMETARSKA JEDNADBA ________________________________ 10
2.1.2
RAUNANJE JEDNADBE PRAVCA KROZ DVIJE TOKE _________ 11
2.2
POSEBNI SLUAJEVI JEDNADBE PRAVCA_______________________ 12
2.2.1
2D PROSTOR _________________________________________________ 12
2.2.2
3D PROSTOR _________________________________________________ 13
2.2.3
POTEKOE _________________________________________________ 14
3.0
3.1

HOMOGENI PROSTOR. HOMOGENE KOORDINATE. ___________________ 15


IDEJA___________________________________________________________ 15

3.2 JEDNADBA PRAVCA U 2D U HOMOGENOM PROSTORU _____________ 16


3.3 JEDNADBA PRAVCA U 3D U HOMOGENOM PROSTORU _____________ 16
3.4 ALTERNATIVNI OBLIK JEDNADBE PRAVCA U 2D U HOMOGENOM
PROSTORU____________________________________________________________ 17
4.0

RAVNINA__________________________________________________________ 20

4.1

JEDNADBA RAVNINE___________________________________________ 20

4.2

JEDNADBA RAVNINE KROZ TRI TOKE ________________________ 23

5.0 BRESENHAMOV POSTUPAK CRTANJA LINIJE ___________________________ 24


5.1 UVOD ______________________________________________________________ 24
5.2 JEDNADBA PRAVCA_______________________________________________ 24
5.3 BRESENHAMOV POSTUPAK ________________________________________ 25
5.4 BRESENHAMOV POSTUPAK ________________________________________ 26
5.5 MODIFIKACIJA BRESENHAMOVOG POSTUPKA _____________________ 28
5.6 KUTOVI OD 0 DO 90 _______________________________________________ 30
5.7 KUTOVI OD 0 DO -90 ______________________________________________ 31
5.8 SVI KUTOVI ________________________________________________________ 32
6.0 KONVEKSNI POLIGONI ________________________________________________ 33
6.1 DEFINICIJA KONVEKSNOG POLIGONA______________________________ 33
6.2 MATEMATIKI OPIS POLIGONA ____________________________________ 33
6.3 ORIJENTACIJA VRHOVA POLIGONA ________________________________ 34
6.4 ODNOS TOKE I POLIGONA ________________________________________ 37

SKRIPTA IZ RAUNALNE GRAFIKE

6.5 BOJANJE KONVEKSNOG POLIGONA ________________________________ 38


6.6 STRUKTURA PODATAKA ZA PAMENJE KONVEKSNOG POLIGONA __ 40
6.7 FUNKCIJE ZA RAD SA POLIGONIMA ________________________________ 41
7 KONKAVNI POLIGON ___________________________________________________ 44
7.1 DEFINICIJA KONKAVNOG POLIGONA_______________________________ 44
7.2 PROVJERA KONKAVNOSTI POLIGONA I ORIJENTACIJA VRHOVA____ 44
7.3 MATEMATIKI OPIS KONKAVNOG POLIGONA ______________________ 45
7.4 ODNOS TOKE I KONKAVNOG POLIGONA __________________________ 45
7.5 MATEMATIKI OPIS PROBLEMA ___________________________________ 49
7.6 C IMPLEMENTACIJA PROVJERE ODNOSA TOKE I POLIGONA ______ 50
7.7 BOJANJE KONKAVNOG POLIGONA _________________________________ 51
7.8 C IMPLEMENTACIJA BOJANJA KONKAVNOG POLIGONA (1) _________ 53
7.9 BOJANJE KONKAVNOG POLIGONA PO DRUGI PUTA _________________ 55
7.10 C IMPLEMENTACIJA BOJANJA KONKAVNOG POLIGONA (1) ________ 60
7.11 KORAK DALJE U PRAVOM SMJERU ________________________________ 61
7.12 ZAKLJUAK ______________________________________________________ 63
8. KRIVULJE - OPENITO _________________________________________________ 64
8.1 UVOD ______________________________________________________________ 64
8.2 ZADAVANJE KRIVULJA ____________________________________________ 64
8.3. KLASIFIKACIJA KRIVULJA ________________________________________ 65
8.4. POELJNA SVOJSTVA KRIVULJA___________________________________ 65
8.5. RED NEPREKINUTOSTI ____________________________________________ 65
8.5.1. C KONTINUITETI ________________________________________________ 65
8.5.2. G KONTINUITETI________________________________________________ 66
9. KRIVULJE ZADANE PARAMETARSKIM OBLIKOM _________________________ 67
9.1. UVOD _____________________________________________________________ 67
9.2. UPORABA PARAMETARSKOG OBLIKA______________________________ 67
9.3. PRIMJER CRTANJA KRUNICE _____________________________________ 69
9.4. PRIMJER CRTANJA ELIPISE________________________________________ 70
9.5. KONSTRUKCIJA KRIVULJE OBZIROM NA ZADANE TOKE __________ 71
9.6. ZAKLJUAK_______________________________________________________ 73
10. BEZIEROVE KRIVULJE ________________________________________________ 74
10.1. UVOD ____________________________________________________________ 74
10.2 APROKSIMACIJSKA BEZIEROVA KRIVULJA _______________________ 74
10.2.1 OZNAKE _______________________________________________________ 74
10.2.2 BEZIEROVE TEINSKE FUNKCIJE ________________________________ 75
10.2.3. BERNSTEINOVE TEINSKE FUNKCIJE____________________________ 77

SKRIPTA IZ RAUNALNE GRAFIKE

10.2.4. VEZA BEZIEROVIH I BERNSTEINOVIH TEINSKIH FUNKCIJA ______ 80


10.2.5. CRTANJE APROKSIMACIJSKE KRIVULJE POMOU BERNSTEINOVIH
POLINOMA __________________________________________________________ 80
10.2.6. SVOJSTVA APROKSIMACIJSKIH BEZIEROVIH KRIVULJA __________ 82
10.3 INTERPOLACIJSKA BEZIEROVA KRIVULJA ________________________ 82
11. PRIKAZ KRIVULJA POMOU RAZLOMLJENIH FUNKCIJA ________________ 86
11.1. UVOD ____________________________________________________________ 86
11.2. PRIKAZ POMOU KVADRATNIH RAZLOMLJENIH FUNKCIJA_______ 86
11.3. PARAMETARSKE DERIVACIJE U HOMOGENOM PROSTORU ________ 87
11.4. PRIKAZ POMOU KUBNIH RAZLOMLJENIH FUNKCIJA ____________ 89
11.5. PARAMETARSKE DERIVACIJE U HOMOGENOM PROSTORU ________ 90
11.6. VEZA IZMEU PARAMETARSKIH DERIVACIJA U RADNOM I
HOMOGENOM PROSTORU _____________________________________________ 91
11.7. PRIMJERI ________________________________________________________ 92
11.8. ODREIVANJE MATRICE A _______________________________________ 93
11.9. HERMITOVA KRIVULJA __________________________________________ 95
11.10. ODREIVANJE MATRICE A - PRIMJER____________________________ 96
12. 2D TRANSFORMACIJE_________________________________________________ 99
12.1. UVOD ____________________________________________________________ 99
12.2. TRANSLACIJA ___________________________________________________ 100
12.3. ROTACIJA _______________________________________________________ 101
12.4. SKALIRANJE ____________________________________________________ 103
12.5. SMIK ____________________________________________________________ 105
12.6. PRIMJENA TRANSFORMACIJA ___________________________________ 107
13. 3D TRANSFORMACIJE________________________________________________ 109
13.1. UVOD ___________________________________________________________ 109
13.2. TRANSLACIJA ___________________________________________________ 109
13.3. ROTACIJA _______________________________________________________ 110
13.3.1. ROTACIJA OKO OSI X__________________________________________ 110
13.3.2. ROTACIJA OKO OSI Y__________________________________________ 110
13.3.3. ROTACIJA OKO OSI Z __________________________________________ 111
13.4. SKALIRANJE ____________________________________________________ 111
13.5. SMIK ____________________________________________________________ 112
13.7. PRIMJER ________________________________________________________ 113
14. PROJEKCIJE I TRANSFORMACIJE POGLEDA ___________________________ 114
14.1. PROJEKCIJE_____________________________________________________ 114
14.1.1. PARALELNA PROJEKCIJA ______________________________________ 114

SKRIPTA IZ RAUNALNE GRAFIKE

14.1.2. PERSPEKTIVNA PROJEKCIJA ___________________________________ 117


14.2. TRANSFORMACIJE POGLEDA ____________________________________ 120
14.3. PRIMJENA NA POOPENJE PERSPEKTIVNE PROJEKCIJE _________ 127
14.3.1. KORAK 1 _____________________________________________________ 127
14.3.2. KORAK 2 _____________________________________________________ 128
14.3.3. KORAK 3 _____________________________________________________ 129
14.3.4. VIEW-UP VEKTOR_____________________________________________ 131
14.4. TRANSFORMACIJE POGLEDA NA DRUGI NAIN __________________ 132
14.4.1. MALI IZVOD __________________________________________________ 132
14.4.2. PRIMJENA NA PERSPEKTIVNU PROJEKCIJU _____________________ 134
15. OSVJETLJAVANJE ___________________________________________________ 135
15.1 UVOD ____________________________________________________________ 135
15.2. PHONGOV REFLEKSIJSKI MODEL ________________________________ 135
15.2.1. OPENITO O MODELU _________________________________________ 135
15.2.2. DIFUZNA KOMPONENTA ______________________________________ 135
15.2.3. ZRCALNA KOMPONENTA ______________________________________ 136
15.2.4. AMBIJENTNA KOMPONENTA __________________________________ 138
15.2.5. UKUPAN UTJECAJ_____________________________________________ 138
15.2.6. ZBIRNI PREGLED MODELA ____________________________________ 139
15.2.7. PRIMJER _____________________________________________________ 139
15.3. GOURAUDOVO SJENANJE POLIGONA ___________________________ 141
15.4. PHONGOVO SJENANJE _________________________________________ 144
16. UKLANJANJE NEVIDLJIVIH ELEMENATA _____________________________ 147
16.1. UVOD ___________________________________________________________ 147
16.2. UKLANJANJE STRANJIH POLIGONA PROVJERA NORMALE_____ 147
16.3. MINIMAX PROVJERE ____________________________________________ 148
16.4. Z BUFFER _______________________________________________________ 150
17. FRAKTALI ___________________________________________________________ 153
17.1. UVOD ___________________________________________________________ 153
17.2. SAMOPONAVLJAJUI FRAKTALI_________________________________ 153
17.3. MANDELBROTOV FRAKTAL _____________________________________ 156
17.4. JULIJEVA KRIVULJA ____________________________________________ 160
17.5. FRAKTAL "by" GINGER __________________________________________ 165
18. PREGLED OSNOVNIH UREAJA VEZANIH UZ RAUNALA I SLIKU _______ 167
18.1. UVOD ___________________________________________________________ 167
18.2. MONITORI ______________________________________________________ 167
18.2.1. OSNOVE RADA KATODNE CIJEVI (CRT) _________________________ 167
18.2.2. CRT SA FST ___________________________________________________ 168
18.2.3. CRT SA TRINITRON CIJEVI _____________________________________ 169
18.2.4. CROMACLEAR ________________________________________________ 170
18.2.5. LCD ZASLONI_________________________________________________ 170

SKRIPTA IZ RAUNALNE GRAFIKE

18.2.6. ZASLONI S PLAZMOM _________________________________________ 171


18.3. PISAI __________________________________________________________ 172
18.3.1. OPENITO ____________________________________________________ 172
18.3.2. LASERSKI PISAI _____________________________________________ 172
18.3.3. Tintni pisai____________________________________________________ 173
18.4. SKENERI ________________________________________________________ 174
19. BOJE________________________________________________________________ 175
19.1. UVOD ___________________________________________________________ 175
19.2. SHEME ZA PRIKAZ BOJA PROSTORI BOJA ______________________ 175
19.2.1. MODELI ______________________________________________________ 175
19.2.2. RGB MODEL __________________________________________________ 176
19.2.3. CMY/CMYK MODEL ___________________________________________ 179
19.2.4. HLS MODEL __________________________________________________ 180
19.3. GAMMA KOREKCIJA ____________________________________________ 181
19.4. PAMENJE BOJA NA RAUNALU _________________________________ 184
20. DODATAK A. _________________________________________________________ 186
RJEENI ZADACI _______________________________________________________ 190
ZADATAK 1.__________________________________________________________ 190
ZADATAK 2.__________________________________________________________ 193
ZADATAK 3.__________________________________________________________ 195
ZADATAK 4.__________________________________________________________ 196
ZADATAK 5.__________________________________________________________ 197
ZADATAK 6.__________________________________________________________ 197
ZADATAK 7.__________________________________________________________ 198
ZADATAK 8.__________________________________________________________ 199
ZADATAK 9.__________________________________________________________ 200
ZADATAK 10._________________________________________________________ 201

SKRIPTA IZ RAUNALNE GRAFIKE

Nekoliko rijei...
tovani itatelji! Osobito mi je zadovoljstvo to Vam mogu ponuditi ovaj tekst na
raspolaganje. Raunalna grafika je podruje koje se u dananje doba razvija strahovitom
brzinom, i poznavanje osnova raunalne grafike polako se moe poistovjeivati sa
raunalnom pismenou. U ovoj skripti naglasak je baen na koncepte i ideje kako bi se to
lake mogli uoiti problemi koji se tu pojavljuju, i naini na koje se oni rjeavaju, ukoliko isti
postoje. Kroz tekst e se pojaviti i nekoliko primjera napisanih u C programskom jeziku koji
e demonstrirati izlaganja i ideje koje se obrauju. Primjeri su napisani tako da rade, i da se
vrlo lagano mogu uoiti pojedini dijelovi koda. Primjeri nisu pisani tako da nude apsolutnu
otpornost na pogreke, i oporavak na razna, malo vjerojatna stanja. Ova poboljanja ostavljaju
se Vama da ih implementirate ukoliko mislite da su potrebna...
Da biste mogli pratiti skriptu potrebna je odreena podloga iz matematike, i to
naroito linearne matematike, iako sam se trudio da, gdje je to god bilo mogue, krenem od
samih osnova i objasnim zato se rade pojedini koraci. Zbog ovih zahtjeva, skripta je
namjenjena prvenstveno studentima koji su sluali ove predmete, ili kojima matematika nije
velika nepoznanica. Naravno, to ne znai da je nitko drugi ne smije itati.
Ovim putem posebno bih se zahvalio profesorici eljki Mihajlovi za pruenu pomo,
kao i prijateljima koji su mi bili potpora.

SKRIPTA IZ RAUNALNE GRAFIKE

1.0 UVOD U OSNOVNE MATEMATIKE POJMOVE


1.1 NAINI OZNAAVANJA
Prije nego to krenemo sa gradivom, potrebno je objasniti na koji e se nain u tekstu
oznaavati pojedini elementi.
Toka e se obino oznaavati kao Tx, pri emu e slovo X biti zamijenjeno u S ukoliko se
govori o poetnoj toci pravca, u E ukoliko se govori o zavrnoj toci pravca, odnosno u P
ukoliko se govori o proizvoljnoj toci pravca. (Termini poetna toka pravca i zavrna toka
pravca biti e jasniji nakon poglavlja 1.4).
Zapis toke Tx po komponentama biti e (Tx1, Tx2,..., Txn) pri emu je Txi i-ta komponenta
toke.
Vektori e se oznaavati slino kao i toke. Vektor pravca biti e oznaen kao v p , odnosno po
komponentama (v P1 , v P 2 ,..., v Pn ) .

Matrice e se oznaavati velikim tampanim slovima i podvlakom. Npr. karakteristina


matrica pravca nositi e oznaku L.
Slike u pojedinim poglavljima oznaavane su brojem poglavlja iza kojeg slijedi redni broj
slike u poglavlju. Npr. oznaka slike 5.1.1.1. oznaava sliku u poglavlju 5.1.1. pod rednim
brojem 1.
Relacije (jednadbe; formule) oznaavane su na slian nain: uz svaku relaciju u zagradi se
nalazi oznaka koja zapoinje sa "r:" iza koje slijedi oznaka poglavlja, kosa crta i redni broj
relacije u tom poglavlju. Npr. oznaka (r:2.1.1/1) oznaava relaciju broj 1 u poglavlju 2.1.1.
Ovakav nain oznaavanja uveden je da bi se maksimalno olakalo pronalaenje relacije kada
se ona referencira u tekstu.

1.2 TOKA
Toka je matematiki pojam koji se u pravilu ne definira. No potrebno je uvesti neke osnovne
pojmove. Toka je svojstvo prostora (element prostora; osnovna graevna nedjeljiva cjelina).
Zbog toga oznaavanje toke ovisi o prostoru u kojem se ta toka nalazi. Ono osnovno to
odreuje oznaavanje toke je dimenzionalnost prostora. Svaka toka biti e oznaena svojim
koordinatama, i to sa toliko koordinata kolika je dimenzija prostora. Tako e toka u 2D
"prostoru" biti oznaena pomou dvije koordinate: x i y. U 3D toka e biti oznaena pomou
tri koordinate: x, y i z. U nastavku emo toke oznaavati kao ureene n-torke koordinata,
npr. (x,y,z) ili kao matricu [x y z].

SKRIPTA IZ RAUNALNE GRAFIKE

1.3 VEKTOR
Vektor emo promatrati kao usmjerenu duinu, iako rije "duina" moda i nije ba
najprikladnija. Naime, vektor e nam obino sluiti kao gradijent, tj. pokazatelj koji govori za
koliko se neto mijenja. Vektore emo oznaavati pomou strelice iznad imena to je
uobiajena matematika notacija. Zapis vektora, isto kao i toke ovisi o prostoru u kojem taj
vektor opisuje, te e imati onoliko komponenti kolika je dimenzionalnost prostora. Zbog toga
emo vektore takoer zapisivati kao ureene n-torke, npr. ( x, y, z ) . Kako emo u nastavku
govoriti o raunalnoj grafici, vektore emo obino razapinjati izmeu dvije toke, i to na
slijedei nain: vektor razapet izmeu toke TS i TE kree iz toke TS, i zavrava u toku TE.
Ovime je odreen smjer vektora, a njegov iznos se rauna pomou relacije:

r
v = TE TS

(r:1.2/1)

TE

TS

Pri tome se toke oduzimaju na taj nain da se odgovarajue komponente toaka oduzmu.

SKRIPTA IZ RAUNALNE GRAFIKE

10

2.0 PRAVAC
2.1 JEDNADBA PRAVCA
2.1.1 PARAMETARSKA JEDNADBA
Pravac se takoer ne definira, no najopenitije govorei moe se rei da je pravac skup
toaka. Ovakva definicija vodi na najopenitiji zapis pravca: parametarski zapis. Ideja
parametarskog zapisa je da se pomou konanog broja parametara opiu sve toke koje
pripadaju dotinoj krivulji. Za opis pravca dovoljan je samo jedan parametar, a jednadbu
moemo dobiti iz slike:

TS

TE

TP

r
TP = (TE TS ) + TS = v + TS
(r:2.1.1/1)
r
Formula zapravo kae: vektor v skaliran parametrom dodaj toci TS i dobiti e jednu
toku pravca. Ovo napravi za svaki R i dobiti e sve toke pravca.
r
Pojam "skalirati" parametrom znai svaku komponentu vektora v pomnoiti realnim
r
brojem . Time se norma vektora v poveava puta, te vrijedi:

v = v

r
Npr. prema gornjoj slici, ukoliko toci TS dodamo v uz =1 doi emo do toke TE. No
ukoliko je vei od jedan, tada emo doi do neke toke koja se krenuvi od toke TS nalazi
iza toke TE.

U jednadbi pravca koju smo prethodno napisali krije se zapravo onoliko jednadbi koliko
toke imaju komponenata. Vano je za uoiti da ovakav zapis pravca donekle i usmjerava
r
pravac. Naime, porastom parametra toka TP giba se u smjeru vektora v odnosno od toke
TS prema toki TE i dalje. Ovaj oblik zapisa pravca pogodan je i za odreivanje gdje se neka
zadana toka pravca nalazi u odnosu na toke TS i TE. Vrijedi slijedee. Ukoliko je za zadanu
toku TP parametar :

negativan, toka TP je ispred toke TS.


nula, toka TP se upravo poklapa sa tokom TS.
pozitivan i manji od 1, toka TP je izmeu toke TS i toke TE.
jedan, toka TP se upravo poklapa sa tokom TE.
pozitivan i vei od 1, toka TP je iza toke TS i iza toke TE.

SKRIPTA IZ RAUNALNE GRAFIKE

11

r
Raspiemo li jednadbu TP = (TE TS ) + TS = v + TS po komponentama, dobivamo:
(TP1 , TP 2 ,..., TPn ) = (v P1 , v P 2 ,..., v Pn ) + (TS1 , TS 2 ,..., TSn )

(r:2.1.1/2)

ili u matrinom zapisu:

[TP1 , TP1 ,..., TPn ] = [ 1]

v P1

vP2

TS 1 TS 2

... v Pn
= [ 1] L
... TSn

(r:2.1.1/3)

gdje L stoji za karakteristinu matricu pravca. Kako jednadba mora biti zadovoljena za
svaku komponentu zasebno, gornji zapisi jednadbe raspadaju se na n jednadbi.

2.1.2 RAUNANJE JEDNADBE PRAVCA KROZ DVIJE TOKE


Neka su zadane dvije toke kroz koje prolazi pravac. Toka TS neka bude poetna toka
pravca, toka TE neka bude zavrna toka pravca. Jednadbu pravca kroz te dvije toke
moemo izraunati temeljem relacije:

r
TP = (TE TS ) + TS = v + TS

(r:2.1.2/1)

r
r
tako da izraunamo vektor v pomou relacije (r:1.2/1) koja glasi: v = TE TS .

No do slinog se rjeenja moe doi i ovako. Krenimo iz parametarskog oblika jednadbe


pravca zapisanog matrino (r:2.1.1/3):

[TP1 , TP1 ,..., TPn ] = [ 1] L


U gornjoj relaciji jedina je nepoznanica matrica L koju treba odrediti. Budui da pravac kojeg
traimo za neki parametar prolazi kroz toku TS, i za neki parametar prolazi kroz toku
TE, ostavljena nam je sloboda izbora da sami odluimo za koje e se to vrijednost parametra
dogoditi. Zbog toga emo se odluiti na najjednostavniji mogui izbor: neka pravac proe
kroz toku TS za =0, a kroz toku TE za =1. Tada moemo pisati:
TS = [0 1] L
TE = [1 1] L

gdje su matrice TS i TE jednoretane matrice sa onoliko stupaca koliko imamo koordinata.


Gornje dvije jednadbe moemo stopiti u jednu jednadbu:
TS 0 1
T = 1 1 L

SKRIPTA IZ RAUNALNE GRAFIKE

12

Treba uoiti da TS i TE na lijevoj strani jednadbe predstavljaju matrice 1xn pa matrica na


lijevoj strani nije 2x1 ve 2xn! Kako je u jednadbi sve poznato osim matrice L, mnoei
jednadbu s lijeva inverznom matricom uz L dobiva se:
1

0 1 TS 1 1 TS TE TS
L=

=
=
1 1 TE 1 0 TE TS

(r:2.1.2/2)

pri emu je matrica L dimenzija 2xn.

2.2 POSEBNI SLUAJEVI JEDNADBE PRAVCA


2.2.1 2D PROSTOR
Svaka toka ima po dvije komponente, pa relacija (r:2.1.1/2):
(TP1 , TP 2 ,..., TPn ) = (v P1 , v P 2 ,..., v Pn ) + (TS1 , TS 2 ,..., TSn )
prelazi u:
(TP1 , TP 2 ) = (v P1 , v P 2 ) + (TS1 , TS 2 )

(r:2.2.1/1)

Umjesto oznaka TP1 i TP2 mogli smo koristi i oznake xp, yp, a umjesto oznaka TS1 i TS2
mogli smo koristi i oznake xs, ys. Gornja jednadba raspada se na dvije jednadbe po
komponentama:
r
TP1 = v P1 + TS 1
r
TP 2 = v P 2 + TS 2

Eliminacijom parametra dobiva se eksplicitni oblik jednadbe pravca:


T P 2 TS 2 =

vP2
(TP1 TS 1 )
v P1

(r:2.2.1/2)

r
r
Budui da je vektor v definiran kao v = TE TS (r:1.2/1), ili po komponentama:

v P1 = TE1 TS 1
v P 2 = T E 2 TS 2
uvrtavanjem u eksplicitni oblik dobiva se:
TP 2 TS 2 =

T E 2 TS 2
(TP1 TS 1 )
T E 1 TS 1

(r:2.2.1/3)

SKRIPTA IZ RAUNALNE GRAFIKE

13

to nakon promjene imena odgovarajuih varijabli u "kolska" imena daje:


y y1 =

y 2 y1
( x x1 )
x 2 x1

(r:2.2.1/3')

Pomnoimo li ovo sa zajednikim nazivnikom i sredimo, dobiti emo implicitni oblik


jednadbe pravca:
(TE 2 TS 2 ) TP1 (TE1 TS1 ) TP 2 (TE 2 TS 2 ) TS1 + (TE1 TS1 ) TS 2 = 0

(r:2.2.1/4)

ili:

( y 2 y1 ) x ( x 2 x1 ) y ( y 2 y1 ) x1 + ( x 2 x1 ) y1 = 0

(r:2.2.1/4')

Openito implicitni oblik zapisujemo kao:


a TP1 + b TP 2 + c = 0

(r:2.2.1/5)

Od zanimljivijih oblika vrijedno je jo spomenuti i segmentni oblik jednadbe pravca, koji


direktno daje odsjeke pravca na obje osi. Dobije se svoenjem implicitnog oblika na oblik:
TP1 TP 2
+
=1
lx
ly

(r:2.2.1/6)

Pri tome vrijednosti lx i ly predstavljaju odsjeke na obje osi. Iz eksplicitnog se oblika dobije:
TP1
TP 2
+
=1
TS 2 v P1 TS 1v P 2 TS 2 v P1 TS 1v P 2
vP2
v P1

(r:2.2.1/7)

2.2.2 3D PROSTOR
U 3D prostoru nije mogue pravac prikazati jednadbom u eksplicitnom obliku. Naime,
parametarski oblik jednadbe pravca (r:2.1.1/2)
(TP1 , TP 2 ,..., TPn ) = (v P1 , v P 2 ,..., v Pn ) + (TS1 , TS 2 ,..., TSn )
u tom sluaju prelazi u
(TP1 , TP 2 , TP 3 ) = (v P1 , v P 2 , v P 3 ) + (TS 1 , TS 2 , TS 3 )

(r:2.2.2/1)

pri emu se svaka toka (ili vektor) opisuje pomou tri koordinate. Ova jednadba ekvivalent
je tri jednadbe (po jedna za svaku koordinatu), te je parametar nemogue eliminirati tako
da se dobije jedna jednadba. No eliminacijom parametra iz dva para jednadbi mogue je
dobiti implicitni sustav jednadbe pravca u tri dimenzije:

SKRIPTA IZ RAUNALNE GRAFIKE

14

TP1 TS1 TP 2 TS 2 TP 3 TS 3
=
=
v P1
vP2
vP3

(r:2.2.2/2)

TP1 TS 1 TP 2 TS 2 TP 3 TS 3
=
=
TE1 TS 1 TE 2 TS 2 TE 3 TS 3

(r:2.2.2/3)

odnosno

2.2.3 POTEKOE
Kada zadajemo jednadbu pravca, elimo biti u stanju pomou nje prikazati sve mogue
pravce. Pa krenemo li od segmentnog oblika (uz ogranienje razmatranja na zapisa pravca
samo u 2D prostoru), vidimo da on ne moe prikazati niti jedan pravac paralelan sa bilo
kojom osi. Eksplicitni oblik ima potekoa s pravcima paralelnim s ordinatom. Jedini oblik
koji nema problema je implicitni oblik. Meutim, implicitni oblik pravca za primjenu u
raunalima nije praktian. Zbog toga se kao relativno dobar oblik pokazuje parametarski
oblik. Dodatan "plus" ovom obliku nosi i mogunost matrinog zapisa, koji je idealan za
primjenu u raunalima.

SKRIPTA IZ RAUNALNE GRAFIKE

15

3.0 HOMOGENI PROSTOR. HOMOGENE KOORDINATE.


3.1 IDEJA
Dijeljenje sa nulom jo je jedan od estih problema pri geometrijskim proraunima. Npr.
traenje sjecita dva pravca koji su paralelni rezultirati e dijeljenjem sa nulom budui da se
sjecite nalazi u beskonanosti. Da bi se ovakvi problemi izbjegli, uvodi se homogeni prostor
i homogene koordinate. Evo razmiljanja. Ukoliko je neka od koordinata jednaka beskonano,
to znai da se moe dobiti dijeljenjem sa nulom. Da bi se ovo izbjeglo, potrebno je sve
koordinate napisati u obliku razlomka:
TP1 =

TPh1
T
TP 2 = Ph 2
h
h

(r:3.1/1)

pri emu su TP1 i TP2 standardne ( ili radne) koordinate, a TPh1 i TPh2 su homogene koordinate.
Uvrtavanjem ovih izraza u implicitni oblik jednadbe pravca dobivamo:
a

TPh1
T
b Ph 2 + c = 0
h
h

odnosno
a TPh1 b TPh 2 + c h = 0

(r:3.1/2)

U ovom sluaju koordinate TPh1 i TPh2 nikada nee biti jednake beskonano. Openito se moe
rei ovako. Zadana je neka proizvoljna toka T u n-dimenzionalnom prostoru. Ta toka T u
homogenom e se prostoru opisivati pomou n+1 koordinate, i takvih homogenih toaka bit
e beskonano. Npr. toka (12,24,12) u radnom prostoru u tri dimenzije imati e u
homogenom prostoru zapise: (12,24,12,1), (6,12,6,0.5), (24,48,24,2), ...
Poseban sluaj je zapis beskonanosti: ukoliko je homogena koordinata h toke jednaka 0,
toka lei u beskonanosti! Ako dobijemo da se dva pravca sijeku u homogenoj toci
(6,6,4,2), to znai da se u radnom prostoru sijeku u toci (3,3,2). Ukoliko se sijeku u
homogenoj toci (10,10,3,0), tada su ti pravci u radnom prostoru paralelni i nemaju sjecita.
Ukratko da ponovimo najvanije. Ukoliko je toka u radnom prostoru zadana kao:
TP = (TP1 , TP 2 ,..., TPn )
tada ta toka u homogenom prostoru ima zapis:
TPh = (TPh1 , TPh 2 ,..., TPhn , h)
pri emu je definirana veza:

SKRIPTA IZ RAUNALNE GRAFIKE


TPi =

TPhi
odnosno TPhi = TPi h
h

16

(r:3.1/3)

3.2 JEDNADBA PRAVCA U 2D U HOMOGENOM PROSTORU


U poglavlju 2.2.1 dana je jednadba pravca u 2D u radnom prostoru (r:2.2.1/1):
(TP1 , TP 2 ) = (v P1 , v P 2 ) + (TS1 , TS 2 )
Proirivanjem te jednadbe uz relaciju (r:3.1/3):

TPi =

TPhi
odnosno TPhi = TPi h
h

dolazi se do jednadbe:
(TP1 , TP 2 , hP ) = (v P1 , v P 2 , v Ph ) + (TS 1 , TS 2 , hS )

(r:3.2/1)

pri tome treba obratiti panju na hP i hS komponente toaka. Nepaljiva uporaba gornje
relacije moe dovesti do nepoeljnih posljedica (vidi zadatak 1).

Comment: Pogledaj je li ovo


dobro povezano sa zadatkom 1.1
(homogeni pravac...)

3.3 JEDNADBA PRAVCA U 3D U HOMOGENOM PROSTORU


U poglavlju 2.2.2 dana je jednadba pravca u 3D u radnom prostoru (r:2.2.2/1):
(TP1 , TP 2 , TP 3 ) = (v P1 , v P 2 , v P 3 ) + (TS1 , TS 2 , TS 3 )
Proirivanjem te jednadbe uz relaciju (r:3.1/3):
TPi =

TPhi
odnosno TPhi = TPi h
h

dolazi se do jednadbe:
(TP1 , TP 2 , TP 3 , hP ) = (v P1 , v P 2 , v P 3 , v Ph ) + (TS 1 , TS 2 , TS 3 , hS )

(r:3.3/1)

pri tome treba obratiti panju na hP i hS komponente toaka. Nepaljiva uporaba gornje
relacije moe dovesti do nepoeljnih posljedica (vidi zadatak 1).

Comment: Pogledaj je li ovo


dobro povezano sa zadatkom 1.1
(homogeni pravac...)

SKRIPTA IZ RAUNALNE GRAFIKE

17

3.4 ALTERNATIVNI OBLIK JEDNADBE PRAVCA U 2D U


HOMOGENOM PROSTORU
Krenemo li od implicitnog oblika jednadbe pravca u 2D (r:2.2.1/5):

a TP1 + b TP 2 + c = 0
i uvrstimo u jednadbu relaciju za homogene koordinate (r:3.1/3)
TPi =

TPhi
odnosno TPhi = TPi h
h

dolazimo do jednadbe

TPh1
T
+ b Ph 2 + c = 0
h
h

odnosno nakon sreivanja

a TPh1 + b TPh 2 + c h = 0

(r:3.4/1)

Ova se jednadba moe prikazati i u matrinom obliku, to je dosta est sluaj. Tada ona
glasi:

[TPh1

TPh 2

a
h] b = 0
c

(r:3.4/2)

Uvoenjem uobiajenih oznaka


TP = [TPh1 TPh2

h]

a
G = b
c

(r:3.4/3)

dolazi se do jednadbe
TP G = 0

(r:3.4/4)

Ovdje se moe razmotriti jo jedan interesantan sluaj. Ukoliko odaberemo toku TP takvu da
lei na pravcu, tada e gornja relacija biti zadovoljena. No to ako ubacimo proizvoljnu toku
u jednadbu pravca? Gornja relacija oito nee biti jednaka nuli, i na temelju tog rezultata
moemo definirati odnos toke i pravca prema slijedeem kriteriju:

SKRIPTA IZ RAUNALNE GRAFIKE

18

> 0, TP je iznad pravca

TP G = 0, TP je na pravcu
< 0, T je ispod pravca
P

(r:3.4/5)

Poznavanjem dviju toaka TA i TB na jednostavan se nain moe doi do pravca ako se


napravi x-produkt tih toaka:
T A = (T A1 , T A 2 , h A )
TB = (TB1 , TB 2 , hB )

r
r
i
j
T A TB = T A1 T A2
TB1 TB 2

r
k
r
r
r
h A = i (TA 2 hB TB 2 h A ) j (T A1 hB TB1 h A ) + k (T A1TB 2 T A 2TB1 )
hB

T h TB 2 h A
r r A2 B
r
j k (T A1 hB TB1 h A ) = i
T A1TB 2 T A 2TB1

r
= i

r r
j k G

Slino se poznavanjem dvaju pravaca moe odrediti toka u kojoj se oni sijeku ako se napravi
x-produkt:
a1
G 1 = b1
c1

a 2
G 2 = b2
c 2

r
i
G 1T G T2 = a1

r
j
b1

r
k
r
r
r
c1 = i (b1c 2 b2 c1 ) j (a1c 2 a 2 c1 ) + k (a1b2 a 2 b1 ) =

a2

b2

c2

r
i

b c b2 c1
r r 1 2
j k (a1c 2 a 2 c1 ) = TPT
a1b2 a 2 b1

Operacija transponiranja nuna je ukoliko se ele napisati jednadbe u skladu sa pravilima


matematike. Ovdje se moe prodiskutirati opravdanost uvoenja homogenih koordinata.
Naime, zahvaljujui homogenim koordinatama, matrini raun ne daje niti jedno dijeljenje.
Ovo znai da e i paralelni pravci imati sjecite! Doista, ukoliko su pravci paralelni, tada su
im koeficijenti smjera jednaki i trea komponenta toke TP iznositi e nula, to prema
definiciji znai toku u beskonanosti! Evo jednostavnog dokaza. Jednadba pravca u 2D sa
homogenim koordinatama glasi

a TPh,1 + b TPh, 2 + c h = 0
to se moe napisati kao:

SKRIPTA IZ RAUNALNE GRAFIKE

19

c
c
a
TPh, 2 = TPh,1 h = k TPh,1 h
b
b
b
gdje je k koeficijent smjera pravca. Ukoliko pravci G1 i G2 imaju jednake koeficijente smjera,
to znai prema gornjoj relaciji da vrijedi:

a1
a
= 2 a1b2 = a 2 b1 a1b2 a 2 b1 = 0
b1
b2

kako je poslijednja relacija upravo jednadba zadnje koordinate toke sjecita, slijedi da je uz
paralelne pravce zadnja koordinata (tj. homogeni faktor) toke sjecita jednaka 0.

SKRIPTA IZ RAUNALNE GRAFIKE

20

4.0 RAVNINA
4.1 JEDNADBA RAVNINE
Ravnine opet moemo definirati u n-dimenzijskim prostorima, no kako se u raunalnoj grafici
koriste jedino ravnine u 3D, razmatranja emo ograniiti na taj tip. U 3D prostoru ravnina je
odreena s dva vektora koji lee u njoj i nisu kolinearni, te jednom tokom ravnine. Krenuvi
ovakvom definicijom dolazimo vrlo jednostavno do jednadbe ravnine u parametarskom
obliku:
r
r
T R = v A + v B + TS

(r:4.1/1)

ili rijeima:
r
r
krenuvi od toke TS svaka toka ravnine moe se dobiti pomakom za v A i v B , pri emu
su i realni parametri.

TR predstavlja bilo koju toku ravnine. Slijedea slika jasno ilustrira relaciju (r:4.1/1).

A
TS

B
TR

Zapis relacije (r:4.1/1) ekvivalentan je sustava od tri jednadbe:

TR1 = v A1 + v B1 + TS 1
T R 2 = v A 2 + v B 2 + TS 2
T R 3 = v A 3 + v B 3 + TS 3
Ovo se moe prikazati i matrinim zapisom:

SKRIPTA IZ RAUNALNE GRAFIKE

TR = [TR1 TR 2

TR 3 ] = [

21

v A1

v A2

1] v B1 v B 2
TS 1 TS 2

v A3
v B 3
TS 3

r
No ovaj se oblik moe i pojednostavniti. Ukoliko naemo vektor v n koji je okomit i na vektor
r
r
v A i na vektor v B , a u parametarskoj jednadbi TS prebacimo na lijevu stranu
r
r
TR TS = v A + v B
r
te razliku toaka na lijevoj strani proglasimo vektorom v R

r
r
r
vR = v A + vB
r
Zatim sve pomnoimo vektorom v n , dobiti emo
r r
v R vn = 0

(r:4.1/2)

r
r
r
Cijela desna strana jednadbe je nestala jer vektori v A i v B pomnoeni sa v n daju nulu (jer
r
r
r
smo zahtijevali da vektor v n bude okomit i na vektor v A i na vektor v B )! Ovo nas vodi na
zapis ravnine pomou njezine normale:
r
(TR TS ) v n = 0

(r:4.1/3)

O
n
A
TS
B

A
TR - TS

B
TR

r
r
r
Vektor v n naziva se normala ravnine iz oitih razloga. Ukoliko znamo vektore v A i v B ,
r
vektor v n moemo dobiti na razliite naine (i taj vektor nije jednoznaan; postoji
beskonano mnogo vektora koji su okomiti na ravninu; istina, svi su kolinearni i razlika
izmeu njih je iskljuivo u njihovoj duljini, odnosno normi), a jedan od naina je i x-produkt.
Moemo odabrati:

Comment: Pogledaj je li ovo


dobro povezano sa zadatkom 1.1
(homogeni pravac...)

SKRIPTA IZ RAUNALNE GRAFIKE

22

r
r r
vn = v A v B

(r:4.1/4)

r
Ukoliko u zapis ravnine pomou njezine normale (r:4.1/3) (TR TS ) v n = 0 uvrstimo
vrijednosti po komponentama, dobivamo:

(TR1 TS1 ) v n1 + (TR 2 TS 2 ) v n 2 + (TR 3 TS 3 ) v n 3 = 0


odnosno nakon mnoenja i grupiranja:

TR1 v n1 + TR 2 v n 2 + TR 3 v n 3 (TS 1 v n1 + TS 2 v n 2 + TS 3 v n 3 ) = 0

(r:4.1/5)

ili

A TR1 + B TR 2 + C TR 3 + D = 0

(r:4.1/6)

Ako sada u dobivenu jednadbu ubacimo homogene koordinate, dobiva se:

TRh1
T
T
+ B Rh 2 + C Rh 3 + D = 0
hR
hR
hR

ili nakon sreivanja

A TRh1 + B TRh 2 + C TRh 3 + D h = 0

(r:4.1/7)

to moemo prikazati i matrino

[TRh1

TRh 2

TRh 3

A
B
hR ] = 0
C

D

(r:4.1/8)

Ova relacija koristi se vrlo esto i korisno ju je poznavati. No ona je bitno iz jo jednog
razloga. Kod jednadbe pravca na temelju sline relacije definirali smo odnos toke i pravca.
Pomou ove relacije definirati emo odnos toke i ravnine! Jednadbu (r:4.1/8) simboliki
moemo zapisati:

TRh R = 0

(r:4.1/9)

Dakle, za svaku toku koja je na ravnini relacije je zadovoljena. No ako uvrstimo za TR neku
toku koja ne pripada ravnini, gornja relacija nee biti zadovoljena. Na temelju tog rezultata
definira se odnos toke i ravnine:

SKRIPTA IZ RAUNALNE GRAFIKE

23

> 0, TRh je iznad ravnine R

TRh R = 0, TRh je na ravnini R


< 0, T je ispod ravnine R
Rh

(r:4.1/10)

4.2 JEDNADBA RAVNINE KROZ TRI TOKE


Ravnina je jednoznano odreena sa tri toke. Da bismo odredili jednadbu ravnine kroz tri
toke, krenuti emo od parametarskog oblika ravnine u homogenom prostoru:

TRh = [TRh1 TRh 2

TRh 3

hR ] = [

v A1 v A 2
1] v B1 v B 2
TS1 TS 2
(r:4.2/1)

v A3
v B3
TS 3

hA
hB = [
hS

1] R

Ovdje je dakle ravnina odreena sa dva vektora i tokom. Pri tome su vektori i toke
etverokomponentni jer radimo u tri dimenzije (3 komponente) u homogenom prostoru (jo
jedna komponenta).
Kao i kod odreivanja jednadbe pravca, i ovdje moemo raditi istom filozofijom. Jednadba
e kroz toku TA proi za neki i neki , kroz toku TB proi za neki drugi i neki drugi , i
kroz toku TC proi za neki trei i neki trei . No tada idemo mi odabrati za koje e to i
ravnina proi kroz koje toke. Odabrati emo da ravnina prolazi kroz TA za =0 i =0, kroz
TB za =1 i =0 te kroz TC za =1 i =1. Tada e vrijediti:
T Ah = [T Ah1 T Ah 2
TBh = [TBh1 TBh 2

TCh = [TCh1 TCh 2

T Ah 3
TBh 3
TCh 3

h A ] = [0 0 1] R

hB ] = [1 0 1] R
hC ] = [1 1 1] R

odnosno nakon stapanja u jednu jednadbu:


T Ah 0 0 1
T = 1 0 1 R
Bh

TCh 1 1 1
odakle slijedi:
1

0 0 1 T Ah 1 1 0 T Ah TBh T Ah
R = 1 0 1 TBh = 1 0 1 TBh = TCh T Ah
1 1 1 TCh 1 0 0 TCh T Ah

(r:4.2/2)

SKRIPTA IZ RAUNALNE GRAFIKE

24

5.0 BRESENHAMOV POSTUPAK CRTANJA LINIJE


5.1 UVOD
Kada na monitoru elimo nacrtati liniju, za to obino pozivamo ugraenu funkciju jezika u
kojem piemo program, i pri tome zadajemo koordinate poetne toke i zavrne toke. Pri
tome se podrazumijeva da e funkcija sama u to kraem vremenu nacrtati tu liniju. No na
koji nain se izvodi to brzo crtanje linije? Postupak kojim se to danas radi obino je
implementacija Bresenhamovog postupka. Pri tome treba imati u vidu da je monitor
dvodimenzionalna prikazna jedinica, odnosno sve se dogaa u jednoj ravnini.
Monitor je takoer rasterska prikazna jedinica. Ovo znai da se slika koju prikazuje monitor
sastoji od niza elementarnih djelia slike - pixela (picture element). Ovo znai da je slika koju
prikazuje monitor diskretna. Mogue je osvijetliti pixel na poziciji npr. (0,0) , no nije mogue
osvijetliti pixel na poziciji (1.13,2.52) jer takav pixel ne postoji. Posljedica ovakve
diskretizacije slike je da prilikom crtanja npr. linija dolazi do nazubljenosti iste. Vie o ovoj
pojavi rei emo u nastavku.

Slika 5.1.1. Nazubljenost linije uslijed rasterizacije

5.2 JEDNADBA PRAVCA


Prilikom crtanja linije poznate su nam koordinate poetne i zavrne toke. Isto tako znamo da
liniju crtamo u ravnini. Zaboravimo na tren da liniju crtamo na zaslonu. Zamislimo da imamo
idealnu prikaznu jedinicu koja moe prikazati sve to poelimo. Prva stvar koju moramo
napraviti je izraunati koje sve toke moramo osvijetliti. Da bismo si olakali razmatranje,
zadajmo toke na slijedei nain:

Poetna toka TS ima koordinate (xs,ys).


Zavrna toka TE ima koordinate (xe,ye).
Vrijedi: xs<xe, ys<ye.
Pravac je pod kutom manjim ili jednakim 45.

SKRIPTA IZ RAUNALNE GRAFIKE

25

Kasnije emo se osloboditi ovih ogranienja no za poetak neka ogranienja vrijede.


Koordinate toaka TS i TE u ovom sluaju nisu oznaene standardnim oznakama (TS,1,TS,2) i
(TE,1,TE,2) ve su iskoritene oznake (xs,ys) i (xe,ye) budui da emo cijeli postupak izvoditi
imajui na umu raunala gdje su zasloni dvodimenzijski sa standardnim oznakama x i y za
pojedine osi.
Jednadba pravca kroz dvije toke moe se napisati prema relaciji (r:2.2.1/3') u obliku:
y ys =

ye y s
( x xs )
xe x s

ili nakon sreivanja i uvoenja oznake a za tangens smjera pravca, te oznake b za odsjeak na
osi y:
y ys
y = a x + b pri emu je a = e
, b = a x s + y s
xe x s
a i b su izdvojeni kao zasebne konstante jer se mogu izraunati samo jednom na poetku,
obzirom da ovise samo o konstantama. Umjesto oznaka a i b esto su u uporabi i oznake k za
tangens smjera i l za odsjeak na osi y.
Uz ovu posljednju formulu pravac se moe nacrtati slijedeim trivijalnim algoritmom:
a = (ye-ys)/(double)(xe-xs); b = -a*xs+ys;
for( x = xs; x <= xe; x++ ) {
y = a*x + b;
y = zaokrui(y);
osvijetli_pixel(x,y);
}

Obzirom na diskretiziranost monitora potrebno je za svaki x pronai odgovarajui y i tu toku


osvijetliti. No ovaj algoritam, iako radi, ima jedan veliki nedostatak: sporost. Osnovni
problem ovog algoritma je mnoenje u petlji. Za svaki x odgovarajui y rauna se mnoenjem
i to u aritmetici pominog zareza! Algoritam vapi za poboljanjem!

5.3 BRESENHAMOV POSTUPAK


Pogledamo jo jednom to prethodno opisani algoritam radi. Varijabla x mijenja se u petlji od
vrijednosti xs do vrijednosti xe po jedan i za svaki x se rauna odgovarajui y uz uporabu
operacije mnoenja. Pogledajmo malo bolje to to program zapravo rauna:
y( x = xs ) = a xs + b = y s
y ( x = x s + 1) = a ( x s + 1) + b = a x s + b + a = y s + a = y ( x = x s ) + a
y ( x = x s + 2) = a ( x s + 2) + b = a x s + b + 2a = y ( x = x s + 1) + a
y ( x = x s + 3) = a ( x s + 3) + b = a x s + b + 3a = y ( x = x s + 2) + a
...

SKRIPTA IZ RAUNALNE GRAFIKE

26

Pogledamo li desne strane u svakom retku, moemo vidjeti da se svaki redak moe dobiti tako
da se prethodnom doda vrijednost varijable a. To je izvrstan rezultat jer nam ukazuje na to da
nam vie ne treba vremenski zahtjevno mnoenje! Moda bi bio problem sa prvim retkom, jer
po naoj filozofiji on nema prethodnika pa bismo tu trebali koristiti mnoenje, no nije tako.
Vrijednost prvog retka ve nam je zadana i iznosi ys. Pogledajmo sada to smo dobili.

int x,y_pom,;
double a,y;
a = (ye-ys)/(double)(xe-xs);
y=ys;
for( x = xs; x <= xe; x++ ) {
y_pom = zaokrui(y);
osvijetli_pixel(x,y_pom);
y = y + a;
}
Poboljanje je ve znaajno. Izvan petlje vrijednost varijable y postavlja se na poetnu
vrijednost. U petlji je uvedena pomona varijabla y_pom koja pamti vrijednost varijable y
nakon zaokruivanja jer varijablu y ne smijemo dirati budui da nam treba i u nastavku.
Pogledajmo to jo ne valja. Preesto zovemo funkciju zaokrui(y)! Bilo bi jako zgodno kada
bismo mogli i bez zaokruivanja znati koja je zaokruena vrijednost y koordinate, ili ako nita
drugo, pokuati funkciju zvati rjee. I to se moe! Evo kako.

5.4 BRESENHAMOV POSTUPAK


Ideja je slijedea. Poetnu zaokruenu vrijednost y koordinate znamo: to je ys, tj. y=ys.
Trebamo dakle osvijetliti pixel na poziciji (xs,ys). Kada se pomaknemo za jedan pixel udesno,
vrijednost y koordinate povea se za koeficijent a. Kako smo postavili ogranienje da je
pravac pod kutom manjim ili jednakim 45, to znai da se vrijednost varijable a kree izmeu
0 i 1. Uzmimo za primjer da a iznosi 0.2. Tada nakon jednog pomaka u desno y se je poveao
za 0.2 te iznosi y=ys+0.2. Zaokruivanjem ove vrijednosti dolazi se do vrijednosti ys te se y
koordinata toke koju trebamo osvijetliti ne razlikuje od prethodnog koraka. Znai, trebamo
osvijetliti pixel na poziciji (xs+1,ys). Pomaknimo se za jo jedan pixel u desno. Y koordinatu
opet treba uveati za vrijednost varijable a. Sada to iznosi y=ys+0.2+0.2= ys+0.4. No
zaokruivanjem se opet dolazi do vrijednosti y=ys. Znai da trebamo osvijetliti pixel na
poziciji (xs+2,ys). Idemo za jo jedan pixel u desno: y=ys+0.4+0.2= ys+0.6. I konano
zaokruivanjem ove vrijednosti penjemo se za jedan pixel prema gore: y=ys+1, i
osvijetljavamo pixel na poziciji (xs+2,ys+1).
Oznaimo cjelobrojnu vrijednost koordinate y sa yc, a pridodani decimalni dio sa yf. Tada
gornji postupak moemo opisati ovako: osvjetljavamo toke na poziciji (xs+k,yc). Na poetku
je yc=ys a yf=0. Svakim pomakom u desno yf uveavamo za koeficijent a. Onog trenutka kada
yf pree (ili doe na) 0.5, uveavamo yc za jedan.
U ovom trenutku moemo nastaviti na dva naina:

SKRIPTA IZ RAUNALNE GRAFIKE

27

1. Moemo nastaviti prilikom pomaka u desno sa dodavanjem vrijednosti varijable a


varijabli yf. U tom sluaju slijedee uveavanje yc-a za jedan biti e kada yf prekorai
1.5, pa slijedee kada prekorai 2.5 itd. No ova ideja i nije ba najbolja jer opet
dozvoljava da yf postane vei od jedan pa moramo voditi rauna da svaki puta
cjelobrojni dio "zaboravimo" i sl. to je opet vremenski zahtjevno.
2. Moemo od yf oduzeti 1, i time ponititi nagomilanu pogreku te yf zadrati u opsegu
od -0.5 do 0.5 ime nam je usporedba znatno olakana.
Budui da je drugi postupak bolji, odluiti emo se za njega. No u tom sluaju treba jo
pojasniti zato se od yf oduzima ba 1. Razmislimo malo to nam predstavlja yf. Crtajmo
liniju iz poetne toke sa y koordinatom jednakom 0, i ponovimo ukratko gore opisani
postupak. Prvo smo bili u y=0, odnosno yc=0, yf=0. Zatim smo doli u y=0.2, tj. yc=0, yf=0.2.
Zatim y=0.4, tj. yc=0, yf=0.4, i konano y=0.6, tj. yc=1, yf=0.6. Vrijednost pohranjena u yf
nam zapravo govori koliko smo pobjegli od cjelobrojne koordinate. Npr. za y=0.4, tj. yc=0,
yf=0.4, osvijetliti emo pixel sa y koordinatom 0, dok smo realno gledajui ve 0.4 pixela
iznad. Onog trena kada od pixela pobjegnemo za 0.5 ili vie (npr. za yf=0.6), prema dogovoru
uveavamo yc za jedan. No tada vie nismo u toci sa y koordinatom 0, ve sa y koordinatom
1. A to za pogreku (yf) znai da vie nismo 0.6 pixela iznad, nego 0.4 pixela ispod trenutnog
pixela odreenog sa yc, to znai pogreka sa yf=0.6 prelazi u yf=0.6-1=-0.4.
Implementacija ovog algoritma dana je u nastavku.

int x,yc;
double a,yf;
a = (ye-ys)/(double)(xe-xs);
yc=ys; yf=0.;
for( x = xs; x <= xe; x++ ) {
osvijetli_pixel(x,yc);
yf=yf+a;
if(yf>=0.5) {
yf=yf-1.;
yc=yc+1;
}
}
Uvedemo li jo samo jednu minornu modifikaciju, a to je da inicijalno za yf uzmemo
vrijednost -0.5, te poslije usporedbu radimo sa 0.5-0.5=0, dakle nulom, dobili smo
Bresenhamov algoritam!

Bresenhamov algoritam
int x,yc;
double a,yf;
a = (ye-ys)/(double)(xe-xs);
yc=ys; yf=-0.5;
for( x = xs; x <= xe; x++ ) {

SKRIPTA IZ RAUNALNE GRAFIKE

28

osvijetli_pixel(x,yc);
yf=yf+a;
if(yf>=0.) {
yf=yf-1.;
yc=yc+1;
}
}
Moe li bolje? Naravno...

5.5 MODIFIKACIJA BRESENHAMOVOG POSTUPKA


Do osnovnog Bresenhamovog postupka doli smo iz samo jednog zahtjeva: brzina! Pogledom
na sam algoritam postavlja se pitanje moe li jo bolje? Trn u oku u opisanom algoritmu
svakako su brojevi sa pominim zarezom. Pokazuje se da se cijeli algoritam moe prebaciti u
cjelobrojnu domenu, a ope je poznato da su operacije sa cijelim brojevima daleko bre od
aritmetike u pominom zarezu. Stoga emo ovo poglavlje posvetiti prilagodbi osnovnog
Bresenhamovog algoritma tako da proradi sa cijelim brojevima.

Osnovni element koji je uveo decimalne brojeve u igru bio je koeficijent smjera koji smo
raunali prema formuli:
y ys
a= e
xe x s
Ovaj koeficijent koristili smo prilikom izrauna pogreke (yf varijabla). Pogreku smo
raunali prema formuli:
yf = yf + a
Idemo to malo raspisati. Uvrtavanjem izraza za a dobiva se:
y y s y f (xe x s ) + y e y s
yf = yf + e
(xe x s )
=
xe x s
xe x s
y f (xe x s ) = y f (xe x s ) + y e y s

Uvoenjem
y 'f = y f ( x e x s )
dobivamo
y 'f = y 'f + y e y s .
Ovaj posljednji redak nam govori da umjesto dosadanje pogreke moemo pamtiti pogreku
pomnoenu sa koeficijentom xe-xs. Kako su to sve cijeli brojevi, ovdje smo se rijeili sporih
decimalnih brojeva. Slijedei korak je rjeavanje inicijalnih uvjeta. Naime, inicijalno
1
vrijednost pogreke postavljamo na . To opet moemo raspisati:
2

SKRIPTA IZ RAUNALNE GRAFIKE

29

1
(xe x s )
2
x xs
y f (xe x s ) = e
2

x
x
s
y 'f = e
2

yf =

Skoro pa dobro. Jo da se rijeimo dvojke u nazivniku i svi nai problemi su rijeeni. Dvojke
emo se jednostavno rijeiti tako da sve pomnoimo sa 2. No tada na lijevoj strani umjesto
nove pogreke stoji njezina dvostruka vrijednost! To e nas jo prisiliti da kod izvoda nove
pogreke sve pomnoimo sa dvojkom, te e se dobiti redom:

za pogreku emo koristiti izraz


y y s y f (xe x s ) + y e y s
yf = yf + e
2( xe x s )
=
xe x s
xe x s
2 y f (xe x s ) = 2 y f (xe x s ) + 2 ( y e y s )
y 'f = 2 y f ( x e x s )
y 'f = y 'f + 2 ( y e y s )

tada inicijalno dodjeljivanje prelazi u


1
y f = 2( xe x s )
2
2 y f ( x e x s ) = ( x e x s )
y 'f = ( xe x s )

uz ove oznake oduzimanje jedinice od pogreke moe se zapisati


y f = y f 1 2( xe xs )
2 y f ( xe xs ) = 2 y f ( xe xs ) 2( xe xs )
y 'f = y 'f 2( xe xs )

Imajui u vidu ove izmjene, moe se napisati Bresenhamov algoritam sa cijelim brojevima.
Pri tome e se umjesto oznake y 'f koristiti standardna yf oznaka podrazumijevajui da se pri
tome govori o novoj pogreki.

Bresenhamov algoritam sa cijelim brojevima


int x,yc;
int a,yf;
a = 2*(ye-ys);
yc=ys; yf=-(xe-xs);
for( x = xs; x <= xe; x++ ) {
osvijetli_pixel(x,yc);
yf=yf+a;
if(yf>=0) {

SKRIPTA IZ RAUNALNE GRAFIKE

30

yf=yf-2*(xe-xs);
yc=yc+1;
}
}

5.6 KUTOVI OD 0 DO 90
Sada kada smo se rijeili decimalnih brojeva, vrijeme da se rijeimo i ogranienja vezanih uz
kutove. Pa idemo postupno. Razmatranje emo raditi za postupak sa cijelim brojevima, ali
emo imati stalno u vidu kako smo do toga postupka zapravo doli. Pravac pod kutom od 90
za algoritam da decimalnim brojevima (osnovna izvedba) bio je neizvediv. Naime, tangens
kuta je tada beskonano i mi imamo dijeljenje sa nulom (i vjerojatno nasilni prekid
programa). No algoritam sa cijelim brojevima nema dijeljenja pa ovo vie nije problem. Za
kutove od 0 do 45 algoritam smo ve izveli. No zato smo se ograniili na to podruje?
Odgovor opet treba traiti u iznosu tangensa kuta. Naime, na tom intervalu on se kree u
granicama od nula do jedan, osiguravajui pri tome da emo se pomakom za jedan pixel u
desno pomaknuti maksimalno za jedan pixel prema gore. No to ako dopustimo da tangens
postane vei od 1? To znai da bismo se jednim pomakom u desno mogli pomaknuti i za vie
pixela prema gore (vodei rauna o tome da ih sve treba osvijetliti). Meutim, pojavljuje se
problem u odreivanju koje sve pixele pri tom penjanju treba osvijetliti. Da ne ulazimo dublje
u prazne rasprave o ovome, rjeenje emo potraiti na jedan drugi nain. Ako je kut izmeu
pravca i apscise vei od 45, tada je oito kut izmeu pravca i ordinate manji od 45! Znai,
ukoliko sada jednostavno zamijenimo osi prilikom postupka crtanja, umjesto problematinog
viepixelnog pomaka prema gore sa svakim pomakom u desno dobivamo maksimalno
jednopixelni pomak u desno sa svakim pomakom prema gore. I to je rjeenje! Sve to treba
napraviti je ispitati je li tangens kuta vei od 1 (tj. kut vei od 45). Ako nije, koristimo ve
poznati algoritam; ako je mijenjamo uloge osima i kopiramo algoritam. Evo implementacije:

void crtaj_liniju2(int xs, int ys, int xe, int ye) {


int x,yc;
int a,yf;
if(ye-ys <= xe-xs) {
a = 2*(ye-ys);
yc=ys; yf=-(xe-xs);
for( x = xs; x <= xe; x++ ) {
osvijetli_pixel(x,yc);
yf=yf+a;
if(yf>=0) {
yf=yf-2*(xe-xs);
yc=yc+1;
}
}
} else {
x=xe; xe=ye; ye=x;
x=xs; xs=ys; ys=x;
a = 2*(ye-ys);
yc=ys; yf=-(xe-xs);

SKRIPTA IZ RAUNALNE GRAFIKE

31

for( x = xs; x <= xe; x++ ) {


osvijetli_pixel(yc,x);
yf=yf+a;
if(yf>=0) {
yf=yf-2*(xe-xs);
yc=yc+1;
}
}
}
}
Funkcija krene sa ispitivanjem da li je razlika po y-u manja od razlike po x-u. Ako je, pravac
je pod kutom manjim od 45 i koristi se ve izvedeni algoritam. Ukoliko je razlika po y-u
vea od razlike po x-u, koristei pomonu varijablu x zamjenjuju se x i y koordinate toaka i
nastavlja se sa crtanjem. U petlji se u ovom sluaju moe uoiti jo jedna razlika: funkciji
osvijetli_pixel predajemo na prvi pogled zamijenjene koordinate. No imajui u vidu da smo
ve prethodno napravili jednu zamjenu, ono to se mijenja u varijabli yc zapravo je vrijednost
x komponente toke i obrnuto.

5.7 KUTOVI OD 0 DO -90


Osnovna razlika od prethodnog sluaja je okomito gibanje koje sada ide prema dolje, umjesto
prema gore. Zbog toga yc treba umanjivati, a ne uveavati za jedan. Isto tako postupak pri
raunanju pogreke se poneto modificira, no modifikacije su isto kozmetike prirode. Evo
algoritma:

void crtaj_liniju3(int xs, int ys, int xe, int ye) {


int x,yc;
int a,yf;
if(-(ye-ys) <= xe-xs) {
a = 2*(ye-ys);
yc=ys; yf=(xe-xs);
for( x = xs; x <= xe; x++ ) {
osvijetli_pixel(x,yc);
yf=yf+a;
if(yf<=0) {
yf=yf+2*(xe-xs);
yc=yc-1;
}
}
} else {
x=xe; xe=ys; ys=x;
x=xs; xs=ye; ye=x;
a = 2*(ye-ys);
yc=ys; yf=(xe-xs);
for( x = xs; x <= xe; x++ ) {
osvijetli_pixel(yc,x);

SKRIPTA IZ RAUNALNE GRAFIKE

32

yf=yf+a;
if(yf<=0) {
yf=yf+2*(xe-xs);
yc=yc-1;
}
}
}
}
Od izmjena u odnosu na kod koji crta pravce pod kutovima od 0 do 90 mogu se navesti
slijedee:
inicijalna vrijednost pogreke promijenila je predznak
y komponenta se ne uveava za jedan ve se smanjuje za jedan
kako je ys>ye ispitivanje (ye-ys)<=(xe-xs) pretvoreno je -(ye-ys)<=(xe-xs) da bi se
ponitio negativan predznak rezultata na lijevoj strani

5.8 SVI KUTOVI


Do sada smo obradili sluajeve kada smo se pri crtanju pravca gibali od lijeva u desno. Ostalo
nam je obraditi crtanje pravca kojeg bismo trebali crtati s desna u lijevo. No za ovo nam ne
trebaju posebni algoritmi: ukoliko je pravac zadan tako da se crta s desna u lijevo, zamjenom
poetne i zavrne koordinate dobivamo pravac koji se crta s lijeva u desno.

void crtaj_liniju4(int xs, int ys, int xe, int ye) {


if( xs <= xe ) {
if( ys <= ye ) crtaj_liniju2(xs,ys,xe,ye);
else crtaj_liniju3(xs,ys,xe,ye);
} else {
if( ys >= ye ) crtaj_liniju2(xe,ye,xs,ys);
else crtaj_liniju3(xe,ye,xs,ys);
}
}
Funkcija ovisno o predanim tokama poziva odgovarajuu funkciju i pri tome po potrebi
zamijeni poetnu i krajnju toku. Prisjetimo se to smo ve implementirali:

funkcija crtaj_liniju2 crta linije pod kutovima od 0 do 90, uz xs<xe


funkcija crtaj_liniju3 crta linije pod kutovima od 0 do -90, uz xs<xe
funkcija crtaj_liniju4 kombinirajui prethodne dvije crta linije pod svim kutovima, uz
proizvoljan odnos koordinata xs i xe

SKRIPTA IZ RAUNALNE GRAFIKE

33

6.0 KONVEKSNI POLIGONI


6.1 DEFINICIJA KONVEKSNOG POLIGONA
Poligon je lik koji nastaje slijednim povezivanjem zadanih toaka koje predstavljaju vrhove
poligona. Pri tome se povezuje i zavrna toka sa poetnom. Toke koje predstavljaju vrhove
poligona oznaavati emo oznakom Ti, gdje je i indeks vrha. Toke emo zadavati u radnom
prostoru, i redoslijed zadavanja biti e tono definiran, jer taj redoslijed odreuje kako emo
povezivati toke poligona. Povezivanje vrhova poligona obavlja se linijama (pravcima), koje
ine bridove poligona. Bridove emo oznaavati oznakom bi, gdje je i indeks brida. Moe se
uoiti da je broj bridova uvijek jednak broju vrhova poligona. Poligon je konveksan, ukoliko
ne postoji spojnica proizvoljnih dviju toaka poligona koja bi prolazila izvan poligona. Jasnije
tumaenje daje slika 6.1.1.

a) Konveksni poligon

b) Konkavni poligon

6.1.1.

6.2 MATEMATIKI OPIS POLIGONA


Osnovno to e nas kod poligona interesirati, i pomou ega emo donositi razne zakljuke
jesu jednadbe bridova poligona. U ovom razmatranju ograniiti emo se na poligone u dvije
dimenzije. Prema slici 6.2.1, brid bi odreen je sa vrhovima
Ti , Ti +1 za 0 < i < n
bi ...
Ti , T1 za i = n
Pri tome emo bridove prikazivati u homogenom prostoru. Sve koordinate poligona prije
uporabe proiriti emo homogenim parametrom 1, budui da vrhove poligona zadajemo u
radnom prostoru.

SKRIPTA IZ RAUNALNE GRAFIKE

34

T4

b3

b4

T3
T5

b2
b5

T2
b1

b6

T1

T6

6.2.1.

Parametarska jednadba pravca (u radnom prostoru) glasi:


(Ti +1 Ti ) + Ti za 0 < i < n
Tb =
(Ti T1 ) + Ti za i = n
gdje je Tb proizvoljna toka pravca.
Jednadba pravca u homogenom prostoru moe se dobiti kao x-produkt vrhova pravca, kao
to je opisano u matematikom uvodu:
r
r
r
Ti , 2 Ti +1, 2
i
j
k
r r r
r r r
Ti Ti +1 = Ti ,1
Ti , 2 1 = i j k (Ti ,1 Ti +1,1 ) = i j k bi za 0 < i < n
Ti ,1Ti +1, 2 Ti , 2Ti +1,1
Ti +1,1 Ti +1, 2 1
r
r r
Ti , 2 T1, 2
i
j k
r r r
r r r
Ti T1 = Ti ,1 Ti , 2 1 = i j k (Ti ,1 T1,1 ) = i j k bi za i = n
Ti ,1T1, 2 Ti , 2T1,1
T1,1 T1, 2 1

Oznaka Ti,k predstavlja k-tu komponentu toke Ti. Kako smo se ogradili na 2D prostor,
umjesto Ti,1 mogli smo pisati Ti,x a umjesto Ti,2 mogli smo pisati Ti,y.

6.3 ORIJENTACIJA VRHOVA POLIGONA


Poligon moe imati vrhove zadane tako da se njihovim obilaskom gibamo u smjeru kazaljke
na satu, ili u smjeru suprotnom od kazaljke na satu. Orijentacija vrhova biti e nam bitna u
daljnjim razmatranjima, pa je nuno objasniti kako se ista moe ispitati. U poglavlju 6.2
izraunali smo jednadbe bridova. Na temelju tih jednadbi moe se ustanoviti u kojem su
odnosu toka i zadani brid, odnosno pravac na kojem brid lei (iznad pravca, na pravcu, ispod
pravca). Mudrim odabirom ispitne toke jednostavno emo doi do spoznaje o orijentaciji
vrhova. Pogledajmo sliku 6.3.1.

SKRIPTA IZ RAUNALNE GRAFIKE

35

T3
b2

b3

T2
T4

b1
b4
T1
b 2 je ispod b 1
(uz oznaeni smjer kretanja nalazi se desno)
6.3.1.

Brid b1 odreen je vrhovima T1 i T2. U kakvom je odnosu taj brid s tokom T3? Toka T3
nalazi ispod brida! Isto vrijedi i za brid b2 odreen vrhovima T2 i T3 i toku T4. Toka T4 je
ispod brida b2. Obiemo li tako sve bridove u krug ispitujui odnos tog brida i prvog
slijedeeg vrha poligona, rezultat je isti! Pogledamo li kako su zadani vrhovi naeg poligona,
vidimo da su zadani u smjeru kazaljke na satu. Ovo otkrie daje naslutiti kriterij koji bi se
mogao koristiti, no prije nego to proglasimo kriterij ispravnim, pogledajmo i drugi sluaj. Na
slici 6.3.2. prikazan je poligon sa vrhovima zadanim u smjeru suprotnom od smjera kazaljke
na satu.

T3
b3

b2

T4
T2

b4
b1
T1
b 2 je iznad b 1
(uz oznaeni smjer kretanja nalazi se lijevo)
6.3.2.

SKRIPTA IZ RAUNALNE GRAFIKE

36

Pogledamo sada odnos brida b1 odreenog vrhovima T1 i T2 i toke T3. Toka T3 nalazi se
iznad brida b1. Slino se opet moe vidjeti da ovo vrijedi za svaki brid i prvi slijedei vrh
poligona. Dakle, kriterij je ispravan! Evo naina kako provjeriti orijentaciju vrhova poligona:

Vrhovi poligona zadani su u smjeru kazaljke na satu ukoliko vrijedi:


j = i + 2, za 0 < i < n 1
(i ) T j bi 0 j =
j = i n + 2, za n - 1 i n
Vrhovi poligona zadani su u smjeru suprotnom od smjera kazaljke na satu ukoliko
vrijedi:
j = i + 2, za 0 < i < n 1
(i ) T j bi 0 j =
j = i n + 2, za n - 1 i n

Ukoliko ustanovimo da je poligon zadan uz jednu orijentaciju vrhova, a nama treba suprotna
orijentacija vrhova, tada se jednostavno moe zamijeniti redoslijed vrhova poligona i ponovno
preraunati jednadbe bridova.
Imajui u vidu da radimo s konveksnim poligonom, moe se jednostavno pokazati slijedee:
ukoliko vrijedi da
j = i + 2, za 0 < i < n 1
(i ) T j bi < 0 j =
j = i n + 2, za n - 1 i n
dakle da postoji bar jedan vrh (prvi iza dva koja odreuju brid) takav da se nalazi
ispod brida, tada mora vrijediti:
j = i + 2, za 0 < i < n 1
(i ) T j bi 0 j =
j = i n + 2, za n - 1 i n
odnosno da to vrijedi za svaki vrh. Ovo proizlazi iz injenice da je poligon konveksan.
Isto tako se moe pokazati i da
ukoliko vrijedi
j = i + 2, za 0 < i < n 1
(i ) T j bi > 0 j =
j = i n + 2, za n - 1 i n
dakle da postoji bar jedan vrh (prvi iza dva koja odreuju brid) takav da se nalazi
iznad brida, tada mora vrijediti:
j = i + 2, za 0 < i < n 1
(i ) T j bi 0 j =
j = i n + 2, za n - 1 i n
odnosno da to vrijedi za svaki vrh.

KRITERIJ ZA ODREIVANJE TIPA POLIGONA


Prethodna dva uvjeta mogu se sloiti u kriterij koji odreuje tip poligona: konveksan ili
konkavan. Moemo rei ovako: poligon je konveksan ukoliko vrijedi:
j = i + 2, za 0 < i < n 1
(i ) T j bi 0 j =
j = i n + 2, za n - 1 i n
ili
j = i + 2, za 0 < i < n 1
(i ) T j bi 0 j =
j = i n + 2, za n - 1 i n
Konveksnost zahtijeva da ukoliko za neki vrh Ti+2 utvrdimo da je ispod (iznad) brida bi
(odreenog vrhovima Ti i Ti+1) tada i svi vrhovi Tj+2 moraju biti ispod (iznad) svih bridova bj

SKRIPTA IZ RAUNALNE GRAFIKE

37

poligona. Ukoliko pak utvrdimo da su neki vrhovi iznad, a neki ispod odgovarajueg brida,
tada je poligon sigurno konkavan!
No ovdje izreeni kriterij moemo iskoristiti i na drugi nain. Ukoliko sigurno znamo da je
poligon konveksan, tada se odreivanje orijentacije vrhova svodi na jedno jedino ispitivanje!
Npr. uzmemo toku T3 i brid b1 (odreen tokama T1 i T2). Ukoliko je T3 ispod b1, orijentacija
je u smjeru kazaljke na satu; ukoliko je T3 iznad b1, orijentacija je u smjeru suprotnom od
smjera kazaljke na satu. Jedino to se ovdje nepredvienoga moe dogoditi jest da je poligon
zadan "udno" pa da vrh T3 lei na bridu b1. No tada se jednostavno pomaknemo na slijedei
brid i slijedeu toku.

6.4 ODNOS TOKE I POLIGONA


elimo utvrditi u kakvom je odnosu proizvoljna toka T i poligon (je li toka unutar poligona
ili izvan). To moemo napraviti slinim postupkom kao i kod provjere orijentacije bridova.
Potrebno je pogledati odnos svakog brida i zadane toke T. Isto tako je potrebno poznavati
orijentaciju bridova poligona. Prema slikama 6.4.1, 6.4.2 i 6.4.3, kriterij glasi:

Toka T je unutar poligona ukoliko su vrhovi poligona zadani su u smjeru kazaljke na


satu, i vrijedi:
(i ) T bi 0 za 1 i n
odnosno rijeima: toka je unutar poligona ako su vrhovi poligona zadani u smjeru
kazaljke na satu, i toka je ispod svakog brida.
Toka T je unutar poligona ukoliko su vrhovi poligona zadani su u smjeru suprotnom
od smjera kazaljke na satu, i vrijedi:
(i ) T bi 0 za 1 i n
odnosno rijeima: toka je unutar poligona ako su vrhovi poligona zadani u smjeru
suprotnom od smjera kazaljke na satu, i toka je ispod svakog brida.
I matematiki "pametno" za kraj: toka T je izvan poligona ukoliko nije unutra.

SKRIPTA IZ RAUNALNE GRAFIKE

38

T3

T3

b2

b3

b3
T

T2

b2
T

T4
T4

b1

T2

b4

b4

b1

T1

T1

T je ispod b 1
(uz oznaeni smjer kretanja nalazi se desno)

T je iznad b 1
(uz oznaeni smjer kretanja nalazi se lijevo)

6.4.1.

6.4.2.

T3
b2

b3

T2
T4

b1
b4

T
T1

T je iznad b 1 ali je ispod b 2


6.4.3.

6.5 BOJANJE KONVEKSNOG POLIGONA


Postoji nekoliko naina za bojanje poligona. U nastavku e biti opisan postupak sa putujuom
vodoravnom zrakom. Ideja je slijedea: putati emo vodoravne zrake i pratiti gdje se sijeku s
poligonom (tj. njegovim bridovima). Dobiti emo ili nula ili dva sjecita. Ukoliko sjecita
postoje, spojiti emo ih vodoravnom linijom zadane boje. Da bismo osigurali da za svaku
zraku sjecita uvijek postoje, prije bojanja proi emo kroz sve vrhove poligona i zapamtiti
najveu i najmanju y-koordinatu. S ovim podatkom vodoravnu zraku emo putati za sve y-e
od ymin do ymax (budui da je zraka zapravo pravac y=konst, traenjem sjecita sa svim
zrakama iji se y kree od ymin do ymax proi emo cijeli poligon). Prilikom prolaska kroz
toke korisno e biti i zapamtiti najmanju i najveu x koordinatu.
Opisana ideja ini se vrlo jednostavnom, no raunski je dosta zahtjevna. Stoga emo si uvesti
dodatne olakice i iskoristiti injenicu da bojimo konveksan poligon. U tom sluaju ideja je
slijedea. Poligon nekako intuitivno moemo podijeliti na lijevi dio (gdje vrhovi rastu prema

SKRIPTA IZ RAUNALNE GRAFIKE

39

veim y vrijednostima) i desni dio (gdje vrhovi padaju prema niim y vrijednostima) prema
slici 6.5.1.

V4

V3
V5
V2
V1
Lijevi bridovi oznaeni su podebljano,
dok su desni povueni obinom linijom.
6.5.1.
Traiti emo sjecita sa svim bridovima (slika 6.5.2), i pamtiti njihove x koordinate (y ve
znamo; to je y koordinata same zrake), i to na slijedei nain:

za lijeve bridove pamtiti emo ono sjecite koje ima najveu x koordinatu, i taj x
oznaiti sa L
za desne bridove pamtiti emo ono sjecite koje ima najmanju x koordinatu, i taj x
oznaiti sa D

Nakon to naemo sjecite sa svim bridovima, iscrtati emo liniju izmeu L i D koordinata na
visini y.
Formalno bridove moemo podijeliti na lijeve i desne na slijedei nain:
brid bi odreen vrhovima Ti i Ti+1 je lijevi ukoliko je Ti,y < Ti+1,y.
brid bi odreen vrhovima Ti i Ti+1 je desni ukoliko je Ti,y > Ti+1,y.

SKRIPTA IZ RAUNALNE GRAFIKE

V4

y max

b3

b4

V3
y

V5

b2
L3

L1

L2
V2

y min

40

D5

D4

b5

b1
V1

x min

x max

6.5.2.

6.6 STRUKTURA PODATAKA ZA PAMENJE KONVEKSNOG


POLIGONA
Pri opisu poligona rekli smo da poligon ima onoliko bridova koliko ima vrhova. Stoga za
elementarni dio strukture koja pamti podatke o poligonu moemo uzeti pamenje jednog vrha,
i jednog brida. Poligon e se tada sastojati od n ovakvih struktura. Kako vrhove poligona
zadajemo u pixelima, za pamenje koordinata mogu posluiti cijeli brojevi. Isto tako obzirom
da jednadbe bridova raunamo bez dijeljenja, svi koeficijenti mogu biti cjelobrojni.
Napomena: strukture su pisane za 32-bitni operacijski sustav te oznaka int podrazumijeva 32bitni cijeli broj sa predznakom; za rad pod DOS-om oznake int treba promijeniti u long.
Pamenje toke u 2D sa cjelobrojnim koordinatama:
typedef struct {
int x;
int y;
} iTocka2D;
Pamenje koeficijenata brida u 2D sa cjelobrojnim koeficijentima:
typedef struct {
int a;
int b;
int c;
} iBrid2D;

SKRIPTA IZ RAUNALNE GRAFIKE

41

Pamenje elementarnog dijela poligona:


typedef struct {
iTocka2D Vrh;
iBrid2D Brid;
int lijevi;
} iPolyElem;

Elementu lijevi pridruen je tip int u nedostatku prikladnijeg tipa. Tip koji bi najbolje
odgovarao bio bi boolean koji u C-u ne postoji.

6.7 FUNKCIJE ZA RAD SA POLIGONIMA


Iscrtavanje poligona na zaslonu:
void CrtajPoligonKonv(iPolyElem *polel,int n) {
int i,i0;
i0 = n-1;
for( i = 0; i < n; i++ ) {
crtaj_liniju4(polel[i0].Vrh.x, polel[i0].Vrh.y, polel[i].Vrh.x,
polel[i].Vrh.y);
i0 = i;
}
}

Funkcija jednostavno spaja dva po dva vrha u smjeru kako su zadani. Spaja se i zavrni i
poetni vrh kako bi se poligon zatvorio. Argumenti funkcije su polje elemenata poligona te
broj elemenata polja.
Raunanje koeficijenata poligona:
void RacunajKoefPoligonKonv(iPolyElem *polel,int n) {
int i,i0;
i0 = n-1;
for( i = 0; i < n; i++ ) {
polel[i0].Brid.a =polel[i0].Vrh.y-polel[i].Vrh.y;
polel[i0].Brid.b =-(polel[i0].Vrh.x-polel[i].Vrh.x);
polel[i0].Brid.c =polel[i0].Vrh.x*polel[i].Vrh.y
- polel[i0].Vrh.y*polel[i].Vrh.x;
polel[i0].lijevi = polel[i0].Vrh.y < polel[i].Vrh.y;
i0 = i;
}
}

Funkcija rauna koeficijente bridova radei pri tome x-produkt dva po dva vrha. Jednadba se
dobije u homogenom prostoru, a toke se u homogene pretvaraju proirivanjem sa
homogenim parametrom iznosa 1. Dodatno se brid klasificira kao lijevi ukoliko je zadan sa
vrhovima od kojih je prvi ispod drugoga. Ova klasifikacija biti e ispravna samo ukoliko je
poligon zadan vrhovima u smjeru kazaljke na satu. Ukoliko su vrhovi zadani suprotno, tada e
postavljena zastavica lijevi zapravo oznaavati da je brid desni.
Bojanje konveksnog poligona:
void PopuniPoligonKonv(iPolyElem *polel,int n) {
int i,i0,y;

SKRIPTA IZ RAUNALNE GRAFIKE

42

int xmin, xmax, ymin, ymax;


double L,D,x;
/* Traenje
xmin = xmax
ymin = ymax
for( i = 1;
if( xmin >
if( xmax <
if( ymin >
if( ymax <
}

minimalnih i maksimalnih koordinata */


= polel[0].Vrh.x;
= polel[0].Vrh.y;
i < n; i++ ) {
polel[i].Vrh.x ) xmin = polel[i].Vrh.x;
polel[i].Vrh.x ) xmax = polel[i].Vrh.x;
polel[i].Vrh.y ) ymin = polel[i].Vrh.y;
polel[i].Vrh.y ) ymax = polel[i].Vrh.y;

/* Bojanje poligona: za svaki y izmeu ymin i ymax radi... */


for( y = ymin; y<=ymax; y++ ) {
/* Pronadi najvee lijevo i najmanje desno sjecite... */
L = xmin; D = xmax;
i0=n-1;
for( i = 0; i < n; i0=i++ ) {
if(polel[i0].Brid.a==0.) {
if(polel[i0].Vrh.y == y) {
if(polel[i0].Vrh.x<polel[i].Vrh.x) {
L = polel[i0].Vrh.x;
D = polel[i].Vrh.x;
} else {
L = polel[i].Vrh.x;
D = polel[i0].Vrh.x;
}
break;
}
} else {
x = (-polel[i0].Brid.b*y-polel[i0].Brid.c)/(double)polel[i0].Brid.a;
if(polel[i0].lijevi) {
if( L < x ) L = x;
} else {
if( D > x ) D = x;
}
}
}
crtaj_liniju4(zaokruzi(L),y,zaokruzi(D),y);
}
}

Funkcija je implementacija opisanog postupka u poglavlju 6.5. Funkcija oekuje da su


koeficijenti bridova ve izraunati. Pogledajmo trenutak kako se raunaju sjecita sa
bridovima. Postoje dva sluaja:

Brid je vodoravan (i zraka vodoravna!) te postoji opasnost da se brid i zraka sijeku u


puno(!!!) toaka. Brid je vodoravan ukoliko mu je koeficijent a jednak nuli. Tada opet
imamo dva sluaja: ili se brid i zraka uope ne sijeku jer su na razliitim y-ima, ili se
sijeku u svim tokama jer su na istim y-ima. Ukoliko se ne sijeku, tada jednostavno
preskaemo danju analizu i nastavljamo sa obradom slijedeeg brida. Ukoliko se
sijeku, tada kao lijevo sjecite uzimamo x koordinatu onog vrha kod kojeg je ona
manja, a kao desno sjecite uzimamo x koordinatu onog vrha kod kojeg je ona vea.
Zatim prestajemo sa danjom analizom sjecita (jer kod konveksnog poligona ona
ionako ne postoje) i crtamo liniju odreenu sa pronaenim lijevim i desnim sjecitem.

SKRIPTA IZ RAUNALNE GRAFIKE

43

Brid nije vodoravan te postoji tono jedno sjecite. Tada pronalazimo to sjecite, i
ovisno o tome je li brid lijevi ili desni, pamtimo to sjecite kao lijevo ili desno
(odnosno pamtimo ga samo ukoliko je lijevo, i vee od trenutno zapamenog lijevog,
odnosno ukoliko je desno i manje od trenutno zapamenog desnog).

Provjera je li poligon konveksan, te koja je orijentacija vrhova poligona:


void ProvjeriPoligonKonv(iPolyElem *polel,int n, int *konv, int *orij) {
int i,i0,r;
int iznad, ispod, na;
ispod = iznad = na = 0;
i0 = n-2;
for( i = 0; i < n; i++,i0++ ) {
if(i0>=n) i0=0;
r = polel[i0].Brid.a*polel[i].Vrh.x + polel[i0].Brid.b*polel[i].Vrh.y +
polel[i0].Brid.c;
if( r == 0 ) na++;
else if( r > 0 ) iznad++;
else ispod++;
}
*konv = 0; *orij = 0;
if( ispod == 0 ) {
*konv = 1;
} else if( iznad == 0 ) {
*konv = 1; *orij = 1;
}
}

Funkcija se zasniva na brojanju koliko vrhova lei iznad odgovarajuih bridova, koliko ispod
a koliko na njima. Podatak koliko vrhova lei na odgovarajuim bridova redundantan je i
trebao bi biti nula. Zakljuivanje je slijedee:
ispod = 0
Poligon je konveksan jer su tada svi vrhovi iznad odgovarajuih bridova. Orijentacija
je u smjeru suprotnom od smjera kazaljke na satu.
iznad = 0
Poligon je konveksan jer su tada svi vrhovi ispod odgovarajuih bridova. Orijentacija
je u smjeru kazaljke na satu.
iznad != 0 && ispod != 0
Neki su vrhovi iznad a neki ispod odgovarajuih bridova. Poligon je konkavan i
informaciju o orijentaciji u varijabli orij treba ignorirati.

Slika 7.1.a

Slika 7.1.b

SKRIPTA IZ RAUNALNE GRAFIKE

44

7 KONKAVNI POLIGON
7.1 DEFINICIJA KONKAVNOG POLIGONA
Prilikom upoznavanja sa konveksnim poligonima ve smo u vie navrata spominjali
konkavne poligone - kao neto to komplicira stvari. Da je ovo istina, uvjeriti emo se u ovom
poglavlju. Konkavni poligon nema nikakvih ogranienja na odnose izmeu svojih bridova i
prvog slijedeeg vrha. Konveksni poligon ovdje je postavljao jasne zahtjeve: krenuvi od
prvog brida poligona svaki slijedei brid skree nas ili ulijevo, ili udesno (ali uvijek isto; npr.
svi bridovi nas skreu u lijevo to odmah govori i o orijentaciji vrhova u smjeru kazaljke na
satu). Konkavni poligon ovdje nam daje potpunu slobodu. Drugi nain definicije
konveksnosti zahtijevao je da spojnica bilo koje dvije toke poligona lei iskljuivo unutar
poligona. Konkavni poligon se odrie i ovog zahtjeva. Spojnica bilo koje dvije toke moe
konaan broj puta izlaziti iz poligona i ponovno ulaziti u njega (pri emu je broj izlazaka
jednak broju ulazaka jer se zavrna toka spojnice ipak nalazi unutar poligona). Primjer i
jasnu razliku izmeu ove dvije vrste poligona daje slika 7.1.1. Pod a) je prikazan konveksni
poligon, pod b) konkavni poligon.

a) Konveksni poligon

b) Konkavni poligon

7.1.1.

7.2 PROVJERA KONKAVNOSTI POLIGONA I ORIJENTACIJA


VRHOVA
Da li je poligon konkavan, moe se provjeriti vrlo jednostavno. Naime, dovoljno je provjeriti
da poligon nije konveksan prema kriteriju navedenom u poglavlju 7.3. Ukoliko je konveksan,
tada nije konkavan; ukoliko nije konveksan, tada jest konkavan. S druge strane, na
konkavnost i konveksnost moe se gledati kao na realne i prirodne brojeve. Svaki prirodni
broj ujedno je i realan. Isto tako svaki konveksni poligon ujedno je i konkavan; konveksnost
je samo skup pravila koja ograniavaju konkavnost na ono to zovemo konveksnim likovima
(a u ovom sluaju poligonima). No svaki algoritam koji radi za konkavne poligone, raditi e i
za konveksne jer su ovi samo specifian podskup konkavnih.

Comment: Ovo se odnosi na


poglavlje o konveksnim
poligonima, a ne na ovo! Pazi koji
X stavljas!

SKRIPTA IZ RAUNALNE GRAFIKE

45

Orijentaciju vrhova poligona moemo provjeriti na slijedei nain.

Ukoliko su vrhovi poligona zadani u smjeru kazaljke na satu, tada postoji barem jedan
brid takav da su svi vrhovi (a time i bridovi) ispod tog brida, odnosno matematiki
formulirano:

(i )(j )

bi T j < 0

Prisjetimo li se konveksnih poligona, uoiti emo da je tamo uvjet bio gotovo


identian. Razlika je bila samo u injenici da zbog konveksnosti, ukoliko je postojao
barem jedan i, tada je to vrijedilo za sve i!

Ukoliko su vrhovi poligona zadani u smjeru suprotnom od smjera kazaljke na satu,


tada postoji barem jedan brid takav da su svi vrhovi (a time i bridovi) iznad tog brida,
odnosno matematiki formulirano:

(i )(j )

bi T j > 0

Prisjetimo li se opet konveksnih poligona, uoiti emo da je tamo razlika bila samo u
injenici da zbog konveksnosti, ukoliko je postojao barem jedan i, tada je to vrijedilo
za sve i!

7.3 MATEMATIKI OPIS KONKAVNOG POLIGONA


Za konkavne poligone koristiti emo identine strukture i jednadbe kao i za konveksne
poligone. I ovdje je svaki brid odreen sa dvije toke. Bridova takoer ima tono toliko
koliko i vrhova. Svaki brid odreen je relacijom:
(Ti +1 Ti ) + Ti za 0 < i < n
Tb =
(Ti T1 ) + Ti za i = n
gdje je Tb proizvoljna toka pravca na kojem lei i brid, a za 0 1 upravo proizvoljna
toka samog brida.

7.4 ODNOS TOKE I KONKAVNOG POLIGONA


Da bismo ispitali u lei li proizvoljno zadana toka unutar poligona ili ne lei, kod konveksnih
smo poligona dali jednostavan algoritam koji je radio ovu provjeru oslanjajui se na
konveksnost i olakice koje ona donosi. Ovdje emo, naalost, morati posegnuti za drugim
kompliciranijim metodama. Jedna od njih zasniva se na ideji da se iz zadane toke pusti zraka
(polupravac koji poinje u zadanoj toci) te se izbroji koliko puta zraka sjee poligon (slika
7.4.1).

SKRIPTA IZ RAUNALNE GRAFIKE

46

a) Toka je izvan poligona

b) Toka je unutar poligona

7.4.1.

Lako je ustanoviti da ukoliko je taj broj paran, toka je izvan poligona (slika 7.4.1.a), a
ukoliko je taj broj neparan, toka je unutar poligona (slika 7.4.1.b). Objanjenje je
jednostavno: krenimo po zraci od poetne toke i pratimo sva sjecita zrake i poligona.
Uzmimo npr. da je poetna toka zrake unutar poligona. Prvo sjecite na koje naiemo
oznaavati e izlaz zrake iz poligona. Ukoliko postoji jo jedno sjecite, to e oznaavati da je
zraka opet ula u poligona, no tada e sigurno postojati jo jedno sjecite gdje e zraka
napustiti poligon, i tako redom. Brojanjem ovih sjecita ustanoviti emo da ih je neparan
broj! Moemo zakljuiti: toka je unutar poligona ukoliko zraka povuena iz te toke sjee
poligon neparan broj puta. Ponovimo li prethodni postupak ali uz pretpostavku da je zraka
izvan poligona, tada e prvo sjecite oznaavati ulazak u poligon, pa e sigurno postojati jo
jedno koje e oznaavati izlazak iz poligona; i opet se sve moe ponoviti konaan broj puta.
No razlika je oita: sada je sjecita uvijek paran broj! Dakle, toka je izvan poligona ukoliko
zraka povuena iz te toke sjee poligon paran broj puta. Iz definicije se moe uoiti da se ne
postavlja nikakvo ogranienje na smjer zrake; hoemo li ju povui prema gore, prema dolje,
ili kamo ve, potpuno je proizvoljno.
Toka je unutar poligona ukoliko zraka povuena iz te toke sjee poligon neparan broj puta.
Toka je izvan poligona ukoliko zraka povuena iz te toke sjee poligon paran broj puta.
Gornja nam definicija daje mogunost da odredimo odnos toke i poligona, no kako je
definicija jedno, a realnost neto sasvim drugo, treba pogledati nekoliko specifinih sluajeva
koji se mogu pojaviti, te vidjeti to uiniti sa njima. U razmatranjima emo vui vodoravne
zrake, jer su one najjednostavnije za matematiku obradu.
SPECIFINI SLUAJEVI
1. Zadana toka se nalazi na bridu.
U tom sluaju smatrati emo da toka pripada poligonu, odnosno da je unutar
poligona, i postupak se prekida.
2. Zadana toka se poklapa sa vrhom poligona.

SKRIPTA IZ RAUNALNE GRAFIKE

47

Takoer emo smatrati da je toka unutar poligona, i postupak se prekida.


3. Sjecite se poklapa sa vrhom poligona, a bridovi iz tog vrha nisu paralelni sa
zrakom i ne vrijedi 1. i 2.
Mogui sluajevi koji su obuhvaeni ovim pravilom prikazani su na slici 7.4.2. U
sluaju a) i b) zraka ne ulazi u poligon te sjecite treba ignorirati ili brojati kao
dvostruko. U sluaju c) i d) zraka ne naputa poligon te ovo sjecite takoer treba
ignorirati (ili brojati kao dvostruko). U sluaju e) i f) zraka iz poligona izlazi van, te
ovo sjecite treba brojati (i to kao jednostruko). I konano u sluaju g) i h) zraka
izvana ulazi u poligona, te ovo sjecite takoer treba brojati (i to kao jednostruko).
4. Sjecite se poklapa sa vrhom poligona, ali jedan od bridova iz tog vrha je
paralelan sa zrakom i ne vrijedi 1. i 2.
Sluajevi su prikazani slikom 7.4.3. Pojedini dijelovi slike poklapaju se sa dijelovima
slike 7.4.2. Prilikom odluivanja to uiniti sa sjecitima sada vie nije dovoljno
promatrati samo dva brida iz tog vrha, ve treba pratiti i bridove nakon sjecita, sve
dok su oni paralelni sa zrakom, a nakon toga pogledati prvi slijedei brid koji nije
paralelan sa zrakom. Tada se na temelju poetnog brida i pronaenog brida koji nije
paralelan sa zrakom donosi odluka.
U sluajevima a), b), c) i d) sjecita treba ili brojati kao dvostruka ili ih odbaciti, jer
zraka ili je bila izvan poligona te ostaje izvan poligona, ili je bila unutar poligona te
ostaje unutra. U sluajevima e) i f) zraka iz poligona izlazi van, a u sluajevima g) i h)
zraka izvana ulazi u poligon. U sva etiri sluajeva sjecite treba brojati kao jedno.
Jednostavan kriterij za ovaj sluaj moe se donijeti na temelju podatka koji su bridovi
lijevi a koji su desni (definicija lijevog i desnog brida dana je u 6.5 poglavlju, a
ukoliko je brid vodoravan, tada nije niti lijevi, niti desni, ve je neutralan). Pravilo je
slijedee: ukoliko se tip brida ne mijenja, sjecite treba brojati; inae ga treba odbaciti.
Npr. kreemo sa lijevim bridom, pa slijedi vodoravan brid koji nema utjecaja, i nakon
njega opet slijedi lijevi brid; tada sjecite treba brojati.
Moe se uoiti da je ovaj sluaj (4) proirenje sluaja 3 pri emu je vrh zamijenjen
vodoravnim pravcem. Zbog toga se sluaj 3 moe ignorirati jer e ga sluaj 4 ispravno
obraditi.
5. Brid je paralelan sa zrakom.
Ukoliko se brid ne poklapa sa zrakom, nema sjecita i ide se dalje. Ukoliko se brid
poklapa sa zrakom, ali zadana toka lei izvan brida, sjecita se ignoriraju jer e biti
obraena kao dio sluaja 4. Ukoliko se brid poklapa sa zrakom i lei na bridu, toka je
unutar poligona i postupak se prekida.
Ovo su vie manje svi zanimljivi sluajevi koji se mogli dogoditi. Treba ukazati na jo jedan
interesantan detalj koji moe zbuniti u poetku. Kada obilazimo brid za bridom u potrazi za
sjecitima, i naletimo na sjecite koje se poklapa sa vrhom poligona, iz tog (kao i iz svakog
vrha) izlaze tono dva brida; jednom bridu je to zavrna toka a drugom bridu je to poetna
toka. Zanemarivanje ove injenice dovelo bi nas do dvostrukog brojanja sjecita i pogrenog

Comment: misli se na poglavlje


o konveksnim poligonima! Pazi
X!

SKRIPTA IZ RAUNALNE GRAFIKE

48

rezultata. Zato emo se u nastavku drati jednostavnog pravila: ukoliko se sjecite poklopi sa
poetnom tokom brida, tada sjecite ignoriramo jer emo ga obraditi kod onog brida kojemu
e to biti zavrna toka. Zapravo, tada smo sjecite ve obradili jer kojim god smjerom ili
prema vrhu poligona (i naem sjecitu), prvo emo naii na brid koji poinje u prethodnom
vrhu i kojemu je sjecite zavrna toka, te emo ga tu obraditi.
U nastavku emo pokazati primjer implementacije ovog algoritma u kod.

T i+2
b i+1
T i+1
a)

T i+2

bi

T i+1

S
b i+1
e)

Slika 7.4.2.

Ti

T i+1

bi
S

Ti

Ti

b i+1

bi
Ti

bi

T i+2

T i+1
S

c)
T i+2

T i+2

b i+1

T i+1 b i+1
S
bi
Ti

bi
Ti
f)

b i+1
T i+1
S

b)

T i+2

g)

T i+1
b i+1

bi

T i+2

Ti
d)
b i+1
T i+1
S

T i+2

bi
Ti

h)

SKRIPTA IZ RAUNALNE GRAFIKE

T i+3
T i+1 b i+1 T i+2
bi

b i+2

Ti

T i+3

Ti
bi

b i+2

T i+2 b i+1 T i+1

bi
b i+1 T
i+1

b i+2

bi

b i+2

b)
Ti

T i+3

T i+2 b i+1 T i+1

e)

b i+2
T i+1 b i+1

b i+1 T i+2

T i+1

T i+3

bi

b i+2

T i+1 b i+1 T i+2

c)

Ti
bi

Ti

Ti

T i+3

a)

T i+2

49

b i+2
T i+3

bi

d)
T i+3

T i+3
b i+2

T i+2

T i+2 b i+1
bi

Ti

f)

g)

T i+1
Ti

h)

7.4.3.

7.5 MATEMATIKI OPIS PROBLEMA


Ne uzimajui u obzir da je poligon zatvoren (radi to jednostavnije indeksacije; poslije se lako
sve prilagodi), jednadbu brida poligona moemo pisati:
Tb = (Ti +1 Ti ) + Ti , 0 1
pri emu je Tb bilo koja toka brida. Za zraku emo uzeti vodoravan polupravac koji
zapoinje u zadanoj toci Z, te jednadbu moemo pisati:
Z r = (1 0 ) + Z , 0

pri emu je Zr bilo koja toka zrake.


Brid i zraka sijeku se u nekoj toci, pa vrijedi:
Tb = Z r
odnosno uvrtavanjem izraza za Tb i Zr:
(Ti +1 Ti ) + Ti = (1 0) + Z
Raspisivanjem po komponentama dobivaju se dvije jednadbe sa dvije nepoznanice:

SKRIPTA IZ RAUNALNE GRAFIKE

50

(Ti +1, x Ti , x ) + Ti , x = + Z x
(Ti +1, y Ti , y ) + Ti , y = Z y
Prodiskutirajmo najprije drugu jednadbu. Iz nje moemo jednostavno izraunati parametar ,
ukoliko ga jednadba sadri. Naime, ukoliko je brid paralelan, tada je Ti +1, y Ti , y = 0 i
jednadba prelazi u:

0 + Ti , y = Z y
Ukoliko je Ti , y Z y , tada jednadba nema rjeenja i brid i zraka se ne sijeku.
Ukoliko je Ti , y = Z y , tj. ako se brid i zraka poklapaju, tada je rjeenje bilo koji , no
kako je odreen jednadbom brida, kao rjeenje se moe uzeti bilo koji 0 1 . Kako se
postupa u ovim sluajevima kada su brid i zraka paralelni, odreeno je u 7.4 poglavlju pod
"specifinim sluajevima".
Ukoliko brid i zraka nisu paralelni, tj. Ti +1, y Ti , y 0 , tada se iz druge jednadbe moe
izraunati parametar kao:

Z y Ti , y
Ti +1, y Ti , y

te se uvrtavanjem u prvu relaciju dobiva i parametar :

= (Ti +1, x Ti , x ) + Ti , x Z x
Da bi se brid i zraka sjekli, mora biti zadovoljeno: 0 1, i 0 . Ukoliko neto od
ovoga ne vrijedi, to ukazuje da se pravac na kojem lei brid i pravac na kojem lei zraka
sijeku, ali izvan samog brida odnosno same zrake.

7.6 C IMPLEMENTACIJA
POLIGONA

PROVJERE

ODNOSA

TOKE

Oslanjajui se na prethodni matematiki opis problema algoritam koji radi ispitivanje dade se
vrlo jednostavno implementirati. Funkciju koja e obaviti ispitivanje nazvali smo
TockaUKonkPoli. Funkcija oekuje da su prethodno izraunate jednadbe bridova i odreeni
lijevi i desni bridovi (dakle da je pozvana funkcija RacunajKoefPoligonKonv). Funkcija
vraa true ukoliko je toka unutar poligona, odnosno false ukoliko nije.
bool TockaUKonkPoli(iPolyElem *polel,int n, int Zx, int Zy) {
int i, j, j0, i0, sjec;
int i_mi, i_la;
double mi, la;
i0 = n-1; sjec = 0;
for( i = 0; i < n; i++,i0++ ) {
if( i0 >= n ) i0 = 0;

SKRIPTA IZ RAUNALNE GRAFIKE

51

if(polel[i].Vrh.y==polel[i0].Vrh.y) {
// Brid je vodoravan, pa ako nije na zraci, odbacimo ga
if(polel[i].Vrh.y != Zy ) continue;
i_la = polel[i0].Vrh.x - Zx;
i_mi = polel[i].Vrh.x - Zx;
if( i_mi == 0 || i_la == 0 ) return true; //slika kop_1
if( i_mi>0 && i_la<0 || i_mi<0 && i_la>0 ) return true; //slika kop_1
// inace odbaci brid jer ga obradujemo drugdje
continue;
}
la = (double)(Zy-polel[i0].Vrh.y)/(polel[i].Vrh.y-polel[i0].Vrh.y);
mi = la*(polel[i].Vrh.x-polel[i0].Vrh.x)+polel[i0].Vrh.x-Zx;
if( mi<0 ) continue; // ne pripada zraci
if( la<=0 || la > 1 ) continue; // ne pripada bridu
if( mi == 0 ) return true; // bas je trazena tocka
if( la < 1 ) { sjec++; continue; }
// Ukoliko je la == 1, trebamo pogledati jos nekoliko stvari
j0 = i; j=j0+1;
while(1) {
if( j>=n ) j=0;
if( j0>=n ) j0=0;
if(polel[j0].Vrh.y!=polel[j].Vrh.y) break;
j++; j0++;
}
if(polel[i0].lijevi == polel[j0].lijevi) sjec++;
}
return ((sjec%2)==1);
}

Varijable mi i la, te njihove cjelobrojne inaice i_mi i i_la predstavljaju parametre i .


Varijabla i0 ima ulogu indeksa i iz formula, a varijabla i ima ulogu indeksa i+1 u formulama.

7.7 BOJANJE KONKAVNOG POLIGONA

a)
Oznaka

b)

c)

oznaava nepopunjeni pixel (slika c).

7.7.1.

Problem bojanja konkavnog poligona rijeiti emo oslanjajui se na ve steena znanja o


odnosu toke i poligona. Naime, tamo smo nauili kako pronalaziti sjecita zrake i poligona, a
to e nam u nastavku biti od kljunog znaaja. Pogledajmo najprije jedan jednostavan sluaj
prikazan na slici 7.7.1. Uz tu sliku, ideja za rjeavanje problema bojanja mogla bi glasiti

SKRIPTA IZ RAUNALNE GRAFIKE

52

ovako. Umjesto zrake predstavljene kao polupravac, uzeti emo zraku - pravac. Postaviti
emo zraku na odreeni y, i pronai sva sjecita zrake i poligona. Ovih e sjecita naravno biti
paran broj! Neka sjecita ima 2n. Sortirati emo sjecita po x koordinatama. Zatim emo
dobivenih 2n sjecita promatrati kao n segmenata, te emo svaki segment obojiti
jednostavnim povlaenjem linije izmeu poetne i zavrne toke segmenta, i na visini y.
Postupak emo ponoviti za svaki y izmeu ymin i ymax, pri emu su ymin i ymax odreeni
minimalnom i maksimalnom koordinatom vrhova poligona. U nastavku treba pojasniti zato
sjecita sortiramo i zato ih grupiramo u segmente po dva sjecita. Odgovor na prvo pitanje
proizlazi iz injenice da ovisno o tome od kuda krenemo traiti sjecita, i ovisno o tome kako
je poligon zadan, kretati emo se po x osi na nepoznat nain. Jednom kada pronaemo sva
sjecita, sortiranjem po x vrijednostima (y-i su svima isti) osiguravamo da prvo sjecite bude
ono koje predstavlja ulazak zrake u poligon, slijedee njezin izlazak, pa slijedee opet ulazak,
pa izlazak, ... Odgovor na drugo pitanje slijedi iz prethodne reenice: zraku treba bojati samo
u onom dijelu gdje prolazi kroz poligon. A kroz poligon prolazi izmeu sjecita koje
oznaava ulazak, i sjecita koje oznaava izlazak. Znai, izmeu prva dva, pa izmeu druga
dva (treeg i etvrtog), pa izmeu trea dva (petog i estog), itd. Uvesti emo si jo jednu
dodatnu pogodnost: ukoliko sjecite pada u sam iljak poligona, sjecite emo odbaciti
("iljak" emo definirati kao svaki vrh iz kojeg izlaze bridovi suprotnih usmjerenja: lijevi i
desni ili desni i lijevi). Slika 7.7.1.a) pokazuje odreivanje sjecita za zraku na visini y, dok
7.7.1.b) pokazuje bojanje segmenata koji se nalaze u poligonu. Slika 7.7.1.c) prikazuje
obojani cijeli poligon.
Pogledate li malo paljivije obojani poligon, uoiti ete da niti jedan vrh-iljak koji gleda iz
poligona prema van (i to prema gore ili prema dolje) nije obojan, dok vrhovi-iljci koji
gledaju u poligon jesu obojani. Kako to objasniti? Pa to proizlazi iz odbacivanja svih sjecita
koja se poklope sa iljkom. Tako upravo spomenuti vrhovi-iljci usmjereni prema gore ili
dolje se ignoriraju i ne boja ih se. Ukoliko bismo ove vrhove uzeli u obzir, morali bismo ih
uzeti kao dvostruke! U suprotnom, ukoliko ih brojimo ali kao jednostruke, dogoditi e nam se
situacija prikazana na slici 7.7.2.a). Svaki iljak slui kao jedna toka segmenta. Pogledamo li
lik na slici 7.7.2., tada prvi iljak zapone segment, drugi iljak ga zavri; trei ga zapone, i
dalje ga nitko ne zavri. No zbog toga bojimo segment koji se uope ne nalazi u poligonu!
Pogledamo li iljke koji gledaju u tijelo, tada izmeu prvog i drugog iljka poligon uope nije
obojan. Razlog je opet jednostavan: vanjski brid poligona zapoeo je segment koji je prvi
iljak zavrio. Sve do drugog iljka nita se ne boja, i tek drugi iljak zapone segment koji se
zavri izlaskom iz poligona i to se oboji u redu.
Ovdje opisani problem moe se ispraviti vrlo jednostavno: svaki iljak treba uzeti u obzir, i to
kao dvostruko sjecite! U tom sluaju, vanjski iljci prema gore ili dolje biti e proglaeni
segmentom duljine 1 pixel; posljedica je bojanje samog vrha. iljci prema unutranjosti
poligona takoer nee kvariti bojanje: svaki e iljak zbog svoje dvostrukosti zavriti trenutni
segment, i odmah iz iste toke zapoeti novi! Tako emo izbjei sve probleme sa slike
7.7.2.a) i dobiti ispravno obojani poligon (slika 7.7.2.b).

SKRIPTA IZ RAUNALNE GRAFIKE

a)

53

b)

7.7.2.

Jednostavan algoritam koji moe posluiti za demonstraciju ovoga naveden je u nastavku.

7.8 C IMPLEMENTACIJA BOJANJA KONKAVNOG POLIGONA (1)


Funkcija koja implementira ideju danu u poglavlju 7.7 prikazana je u nastavku. Funkcija
oekuje da su bridovi poligona ve izraunati.

void ObojiKonkPoli1(iPolyElem *polel,int n) {


int i, j, i0, sjec, x, y;
double mi, la;
int ymin, ymax;
int *sjecista;
int s;
sjecista = (int*)malloc(sizeof(int)*n);
/* Trazenje
ymin = ymax
for( i = 1;
if( ymin >
if( ymax <
}

minimalnih i maksimalnih koordinata */


= polel[0].Vrh.y;
i < n; i++ ) {
polel[i].Vrh.y ) ymin = polel[i].Vrh.y;
polel[i].Vrh.y ) ymax = polel[i].Vrh.y;

for( y = ymin; y<=ymax; y++ ) {


i0 = n-1; sjec = 0;
for( i = 0; i < n; i++,i0++ ) {
if( i0 >= n ) i0 = 0;
if(polel[i].Vrh.y==polel[i0].Vrh.y) {
// Brid je vodoravan
continue;
}
la = (double)(y-polel[i0].Vrh.y)/(polel[i].Vrh.y-polel[i0].Vrh.y);
mi = la*(polel[i].Vrh.x-polel[i0].Vrh.x)+polel[i0].Vrh.x;
if( la<=0 || la > 1 ) continue; // ne pripada bridu
if( la < 1 ) {
sjecista[sjec++]=zaokruzi(mi);

SKRIPTA IZ RAUNALNE GRAFIKE

54

continue;
}
// Ukoliko je la == 1, trebamo pogledati je li vrh iljak
if(polel[i0].lijevi == polel[i].lijevi) {
// nije siljak, broji jednostruko
sjecista[sjec++] = polel[i].Vrh.x;
} else {
// je siljak, broji dvostruko
sjecista[sjec++] = polel[i].Vrh.x;
sjecista[sjec++] = polel[i].Vrh.x;
}
}
// Sada su poznata sva sjecista;
// 1) treba ih sortirati
for( i = 0; i < sjec; i++ ) {
i0 = i;
for( j = i+1; j < sjec; j++ ) {
if(sjecista[j]<sjecista[i0]) i0=j;
}
if( i0 != i ) {
s = sjecista[i0];
sjecista[i0]=sjecista[i];
sjecista[i] = s;
}
}
// 2) i vodoravnim linijama pospajati segmente
for( i = 0; i < sjec; i=i+2 ) {
for(x=sjecista[i]; x<=sjecista[i+1]; x++ ) {
osvijetli_pixel(x,y);
}
}
}
free(sjecista);
}

Na slici 7.8.1.a) prikazan je neobojani poligon, a na slici 7.8.1.b) prikazan je taj isti poligon
obojan ovom funkcijom. Funkcija je sastavljena od ve opisanih osnovnih dijelova:
1. traenje minimalne i maksimalne y koordinate
2. presijecanje poligona sa svim zrakama u pronaenom y intervalu
3. traenje sjecita za svaku zraku, njihovo sortiranje i bojanje segmenata vodoravnim
linijama na trenutnom y-u.
Za potrebe pamenja sjecita dinamiki se alocira spremnik jer unaprijed nije mogue znati
kakav se poligon boja. to se tie broja elemenata koje spremnik mora pamtiti, lako je
pokazati da poligon i zraka ne mogu imati vei broj sjecita nego to poligon ima vrhova, pa
ak i uz brojanje nekih sjecita kao dvostruka (iljci u naem primjeru). Zato se alocira
spremnik koji moe prihvatiti onoliko sjecita koliko poligon ima vrhova, ime se izbjegava
potreba stalnog dinamikog realociranja spremnika svakim pronaenim sjecitem.

SKRIPTA IZ RAUNALNE GRAFIKE

Slika 7.8.1.a

55

Slika 7.8.1.b

Slika 7.8.2 takoer nam doarava rezultate bojanja jednog poligona. Pod a) je iscrtan
neobojani poligon, pod b) njegova obojana verzija... Zapravo, moram se ispriati ali ono pod
b) sigurno nije njegova obojana verzija, ve neto... U emu je problem? Poligon sa slike
7.8.2 donio je naoj funkciji neto novoga - vodoravne bridove! I to je mjesto gdje se naa
funkcija - raspada! Zato je to tako i to sve vodoravni bridovi donose sa sobom, objasniti
emo u slijedeem poglavlju.

Slika 7.8.2.a

Slika 7.8.2.b

7.9 BOJANJE KONKAVNOG POLIGONA PO DRUGI PUTA


U prethodnim poglavljima dali smo ideju za bojanje konkavnog poligona, i proanalizirali
njezinu realizaciju. Vidjeli smo da algoritam radi, tako dugo dok nemamo u igri vodoravne
bridove. Ukoliko ste ve zaboravili zato su nam problematini ba vodoravni bridovi, evo
malog podsjetnika: ve pri analizi odnosa toke i poligona imali smo problema sa istima!
Razlog tome bila je paralelnost zrake i brida, jer smo tada imali ili niti jedno, ili beskonano
mnogo sjecita! Taj se je problem prenio i ovdje. Da smo koristiti zraku pod kutom od 45,
tada nam vodoravni bridovi ne bi bili problem - problem bi bili bridovi pod kutom od 45.
Kakvu god zraku odabrali, ovo ne moemo izbjei. Zato smo uzeli najjednostavniju moguu
zraku - i zavrili sa problematinim vodoravnim bridovima.
Pogledajmo sada sve sluajeve presijecanja zrake i brida.

SKRIPTA IZ RAUNALNE GRAFIKE

56

1. Zraka i brid su paralelni (tj. brid je vodoravan).


Brid se odbacuje jer e biti analiziran u jednom od slijedeih koraka.
2. Zraka i brid se ne sijeku.
Brid se odbacuje.
3. Zraka i brid se sijeku po unutranjosti brida, i brid nije vodoravan.
Sjecite se broji kao jednostruko.
4. Zraka i brid se sijeku u poetnoj toki brida, i brid nije vodoravan.
Sjecite se odbacuje jer e biti obraeno u jednom od slijedeih koraka.
5. Zraka i brid se sijeku u zavrnoj toki brida i brid nije vodoravan.
Za analizu ovog sluaja pogledati slijedeu listu.

Definirajmo prije nastavka proiren pojam iljka. Vodoravne bridove smatrati emo
neutralnima, a u razmatranje emo uzeti ostale bridove. Vrh je iljak, ukoliko dolazni brid i
odlazni (prvi koji nije vodoravan) brid imaju suprotna usmjerenja, tj. lijevi i desni ili desni i
lijevi. Primjeri ovako shvaenih iljaka prikazani su na slici 7.4.3. a) do d).
Ukoliko se zraka i brid sijeku prema toki 5 iz gornje liste, tada su mogui slijedei sluajevi:
a) brid nakon vrha-sjecita nije vodoravan, tj. imamo iljak u uem smislu
SJECITE JE
ILJAK

ZRAKA SE PRIJE
SJECITA NALAZI

ZRAKA SE POSLIJE
SJECITA NALAZI

SLIKA

AKCIJA

DA

IZVAN

IZVAN

broji sjecite dvostruko

DA

UNUTAR

UNUTAR

NE

UNUTAR

IZVAN

NE

IZVAN

UNUTAR

7.4.2.a
7.4.2.b
7.4.2.c
7.4.2.d
7.4.2.e
7.4.2.f
7.4.2.g
7.4.2.h

odbaci sjecita
broji sjecite jednostruko
broji sjecite jednostruko

b) brid nakon vrha-sjecita je vodoravan, tj. imamo iljak u proirenom smislu


SJECITE JE
ILJAK

ZRAKA SE PRIJE
SJECITA NALAZI

ZRAKA SE POSLIJE
SJECITA NALAZI

SLIKA

AKCIJA

DA

IZVAN

IZVAN

pamti poetno i zavrno sjecite

DA

UNUTAR

UNUTAR

NE

UNUTAR

IZVAN

NE

IZVAN

UNUTAR

7.4.3.a
7.4.3.b
7.4.3.c
7.4.3.d
7.4.3.e
7.4.3.f
7.4.3.g
7.4.3.h

odbaci sjecita
pamti zavrno sjecite
pamti poetno sjecite

Pogledom na obje tablice lako se uoi razlika: svi su odgovarajui elementi tablica isti, osim
to je iljak iz a) dijela u b) dijelu vodoravnim bridovima razvuen u dvije toke: poetnu
toku iljka i zavrnu toku iljka.
Analizom prva tri stupca tablice moe se doi do slijedeeg zakljuka: iljak ne mijenja
"boravite" zrake, tj. ako je zraka prije dolaska na iljak bila u poligonu, i nakon odlaska ostati
e u njemu.
Iz tablica se takoer vidi da je za odreivanje naina postupanja sa bridovima potrebno
poznavati gdje se je zraka nalazila prije dolaska u sjecite, i kamo ide nakon toga. Ove
podatke za vrijeme traenja sjecita, naalost, ne znamo!

SKRIPTA IZ RAUNALNE GRAFIKE

57

Situacija na prvi pogled izgleda beznadno. No samo na prvi pogled. Kljuno za odluivanje
to uiniti sa sjecitima je poznavanje "boravita" zrake u tom trenutku. Prisjetimo li se kako
traimo sjecita, oito je da u tom trenutku ne raspolaemo tom informacijom. No umjesto
toga moemo napraviti neto drugo: moemo pronai sva sjecita, bez da ita ignoriramo.
Naime, prilikom traenja sjecita znamo da li je slijedei brid vodoravan ili nije; to je
najmanji problem. Ukoliko naiemo na iljak u uem smislu (dakle niti jedan brid nije
vodoravan) pamtiti emo sjecite kao dvostruko. Ukoliko naiemo na vrh iz kojega odlazi
vodoravan brid, pamtiti emo poetnu toku (sjecite) i zavrnu toku (poetak prvog nevodoravnog brida). Uz to, za svako sjecite emo pamtiti pripada li iljku ili ne, te pripada li
"obinom" sjecitu (toka 3 iz prethodne liste), ili iznimci (sjecita prema toki 5 iz prethodne
liste). Primjer ovakvog odreivanja bridova prikazan je na slici 7.9.1. Oznaka s uz oznaku
sjecita oznaava pripadnost iljku, dok oznaka ! oznaava sjecite-iznimku. Sa slike je jasno
vidljivo da se sjecita-iznimke odreene na ovaj nain uvijek pojavljuju u parovima. Nakon
to na ovaj nain pronaemo sva sjecita, u skladu sa algoritmom emo ih i sortirati. I sada se
postavlja pitanje: "to sada znamo o zraci"?
Gdje je zraka bila prije dolaska u prvo sjecite? Budui da zraka dolazi iz negativne
beskonanosti a poligon poinje u nekoj konanoj toki, zraka je oito bila izvan poligona! I
sa ovom informacijom, i tipizacijom sjecita provedenih u prethodnom koraku znamo sve!
Naime, ako sada naie sjecite iljak, zraka ostaje vani! Ako naie sjecite koje nije iljak,
zraka e ui u poligon. Na ovaj nain moemo jednostavno pratiti to se dogaa sa zrakom i
tu moemo provesti filtriranje nepotrebnih sjecita. Dijagram odluivanja prikazan je u
nastavku.

SKRIPTA IZ RAUNALNE GRAFIKE

58

Je li
sjecite
iznimka?

NE

DA

P rihvat i sjecit e.
Invert iraj bo ravit e
zrake.
Nast avi sa slijedeim
sjecit em .

Jesmo li
izvan
poligona?

NE

DA

Je li
sjecite
iljak?

Je li
sjecite
iljak?

DA

P rihvat i o vo i
slijedee sjecit e.
Idi dalje sa sjecit em
nakon ov a dva.

NE

Kopiraj prvo sjecite i


ignoriraj slijedee.
Invertiraj boravite zrake.
Idi dalje sa sjecitem nakon
ova dva.

DA

Ignoriraj slijedea
dva sjecit a.
Nast avi sa sjecit em
iza ova dv a.

NE

Odbaci ovo sjecite a


prihvati slijedee. Invertiraj
boravite zrake.
Nastavi sa sjecitem iza ova
dva.

SKRIPTA IZ RAUNALNE GRAFIKE

59

Nakon to smo proveli sortiranje sjecita, prema prethodnom dijagramu potrebno je provjeriti
svako sjecite i po potrebi neka odbaciti. Ovo se moe izvesti kao dodatni korak prije samog
spajanja segmenata. Isto tako, kako postupkom ne umeemo nova sjecita, cijeli postupak
moemo izvesti koristei samo polje koje smo ve alocirali za pamenje sjecita.
Evo i nekoliko modifikacija koje treba provesti da bi se omoguio rad ovog algoritma. O
sjecitu smo do sada pamtili samo x koordinatu. Zbog potrebe tipizacije sjecita moramo
uvesti dodatnu zastavicu koja e uvati opis sjecita. Zbog toga emo uvesti jednu
jednostavnu strukturu koja e opisivati svako sjecite:

typedef struct {
int x;
unsigned char Vrsta;
} Sjecista;
Pri tome e element Vrsta uvati informaciju o sjecitu:

VRSTA_OBICAN
VRSTA_SIJECE
VRSTA_DIRA

Sjecite nije iznimka


Sjecite je iznimka, i nije iljak.
Sjecite je iznimka, i jest iljak.

Ovakvom organizacijom izbjegavamo potrebu za dvije zastavice: 1) je li iznimka i 2) je li


iljak. Naime, prema dijagramu odluivanja, ukoliko sjecite nije iznimka, druga nam
informacija i ne treba. Tek ukoliko jest iznimka, koristimo "drugu" zastavicu. Ovo se u kodu
moe ispitati vrlo jednostavno; neka je sjec varijabla tipa Sjecista. Tada vrijedi:

if( sjec.Vrsta == VRSTA_OBICAN ) {


// sjecite nije iznimka
} else {
if( sjec.Vrsta == VRSTA_SIJECE ) {
// Sjeciste je iznimka i nije iljak
} else {
// Sjeciste je iznimka i jest iljak
}
}
Da bi se izbjeglo provoenje ovog koraka, koji ma kako bio jednostavan, ipak unosi dodatno
usporenje algoritma, uvesti emo dodatnu zastavicu koju emo resetirati na nulu za svaku
novu zraku, a uveavati svakim pronalaenjem sjecita-iznimke. Tako emo moi provjeriti
treba li izvoditi dodatni korak ili ne.

SKRIPTA IZ RAUNALNE GRAFIKE

60

7.10 C IMPLEMENTACIJA BOJANJA KONKAVNOG POLIGONA (1)


Funkcija koja implementira ideju danu u poglavlju 7.9 prikazana je u nastavku. Funkcija
oekuje da su bridovi poligona ve izraunati.

#define VRSTA_OBICAN 0
#define VRSTA_SIJECE 1
#define VRSTA_DIRA 2
void __fastcall TForm1::ObojiKonkPoli(iPolyElem *polel,int n) {
int i, j, j0, i0, sjec, x, y;
double mi, la;
int ymin, ymax;
Sjecista *sjecista;
Sjecista s;
int izvan;
int TrebaProvjeru;
sjecista = (Sjecista*)malloc(sizeof(Sjecista)*n);
/* Trazenje
ymin = ymax
for( i = 1;
if( ymin >
if( ymax <
}

minimalnih i maksimalnih koordinata */


= polel[0].Vrh.y;
i < n; i++ ) {
polel[i].Vrh.y ) ymin = polel[i].Vrh.y;
polel[i].Vrh.y ) ymax = polel[i].Vrh.y;

for( y = ymin; y<=ymax; y++ ) {


TrebaProvjeru = 0;
i0 = n-1; sjec = 0;
for( i = 0; i < n; i++,i0++ ) {
if( i0 >= n ) i0 = 0;
if(polel[i].Vrh.y==polel[i0].Vrh.y) {
// Brid je vodoravan
continue;
}
la = (double)(y-polel[i0].Vrh.y)/(polel[i].Vrh.y-polel[i0].Vrh.y);
mi = la*(polel[i].Vrh.x-polel[i0].Vrh.x)+polel[i0].Vrh.x;
if( la<=0 || la > 1 ) continue; // ne pripada bridu
if( la < 1 ) {
sjecista[sjec].x=zaokruzi(mi);
sjecista[sjec++].Vrsta=VRSTA_OBICAN;
continue;
}
// Ukoliko je la == 1, trebamo pogledati jos nekoliko stvari
j0 = i; j=j0+1;
while(1) {
if( j>=n ) j=0;
if( j0>=n ) j0=0;
if(polel[j0].Vrh.y!=polel[j].Vrh.y) break;
j++; j0++;
}
if(polel[i0].lijevi == polel[j0].lijevi) {
sjecista[sjec].x = polel[i].Vrh.x;
if(polel[i].Vrh.x!=polel[j0].Vrh.x) {
sjecista[sjec++].Vrsta=VRSTA_SIJECE;
sjecista[sjec].x = polel[j0].Vrh.x;
sjecista[sjec++].Vrsta=VRSTA_SIJECE;
TrebaProvjeru++;
} else {
sjecista[sjec++].Vrsta=VRSTA_OBICAN;
}
} else {
sjecista[sjec].x = polel[i].Vrh.x;
sjecista[sjec++].Vrsta=VRSTA_DIRA;
sjecista[sjec].x = polel[j0].Vrh.x;
sjecista[sjec++].Vrsta=VRSTA_DIRA;
TrebaProvjeru++;

SKRIPTA IZ RAUNALNE GRAFIKE

61

}
}
// Sada su poznata sva sjecista;
// 1) treba ih sortirati
for( i = 0; i < sjec; i++ ) {
i0 = i;
for( j = i+1; j < sjec; j++ ) {
if(sjecista[j].x<sjecista[i0].x) i0=j;
}
if( i0 != i ) {
s = sjecista[i0];
sjecista[i0]=sjecista[i];
sjecista[i] = s;
}
}
// 2) i treba provesti algoritam za odredivanje koja
//
sjecista ostaju
if( TrebaProvjeru != 0 ) {
izvan = 1;
i = 0; j=0;
do {
if( sjecista[i].Vrsta == VRSTA_OBICAN ) {
izvan = !izvan;
sjecista[j++] = sjecista[i++];
continue;
}
if( izvan ) {
if(sjecista[i].Vrsta == VRSTA_DIRA ) {
sjecista[j++] = sjecista[i++];
sjecista[j++] = sjecista[i++];
continue;
} else {
sjecista[j++] = sjecista[i++]; i++;
izvan = !izvan;
continue;
}
} else {
if(sjecista[i].Vrsta == VRSTA_DIRA ) {
i++; i++;
continue;
} else {
i++; sjecista[j++] = sjecista[i++];
izvan = !izvan;
continue;
}
}
} while( i < sjec );
}
for( i = 0; i < j; i=i+2 ) {
for(x=sjecista[i].x; x<=sjecista[i+1].x; x++ ) {
osvijetli_pixel(x,y);
}
}
}
free(sjecista);
}

Funkcija se od prethodne razlikuje samo po implementaciji dijagrama odluivanja, kako bi


odredila koja su sjecita nepotrebna.

7.11 KORAK DALJE U PRAVOM SMJERU

SKRIPTA IZ RAUNALNE GRAFIKE

62

Osvrnimo se malo unazad i pogledajmo kako smo traili sjecita? Za svaku zraku koristili
smo izvedenu formulu i za svako sjecite radili nekoliko oduzimanja, dijeljenje, mnoenje pa
ak i zbrajanje i sve to nad realnim brojevima! I tako za svaki brid, i za svaku zraku. No
idemo malo razmisliti... Ako zraka y sjee brid bi, da li e i zraka y+1 sjei brid bi, i ako hoe,
u kojoj toki? Odgovor na prvo pitanje je: vjerojatno hoe. Odgovor na drugo pitanje idemo
izraunati!
Brid bi odreen je:

Tb = (Ti +1 Ti ) + Ti ,

0 1

Zraka na visini y odreena je relacijom:

Tz = (1 0 ) + (0

y ),

Sjecite su one toke za koje vrijedi Tb=Tz, te se dobije da je za te toke x-koordinata jednaka:
Ti +1, x Ti , x
(y Ti, y ) + Ti, x
Tb , x ( y ) = Tz , x ( y ) =
Ti +1, y Ti , y
Gdje se sijeku taj isti brid bi i zraka y+1?

Tb , x ( y + 1) = Tz , x ( y + 1) =
=

Ti +1, x Ti , x
Ti +1, y Ti , y

Ti +1, x Ti , x
Ti +1, y Ti , y

(y T ) + T
i, y

i,x

(y + 1 T ) + T

Ti +1, x Ti , x
Ti +1, y Ti , y

i, y

i,x

= Tb , x ( y ) +

Ti +1, x Ti , x
Ti +1, y Ti , y

= Tb , x ( y ) +

Sjecitu sa prethodnom zrakom potrebno je dodati jedan jedini konstantni realni broj koji se
za svaki brid moe izraunati samo jednom!!! Ovime smo sve one raunske operacije sveli na
jednostavno zbrajanje dva realna broja. Postupak Vas podsjea na neto? Ne? Ime Bresenham
ne zvui poznato?
Ba kao kod Bresenhamovog algoritma za crtanje linije sjecita zapravo predstavljaju pixele
linije koje smo tamo vrlo uspjeno i vrlo brzo znali izraunati... Dakle, i ovaj se postupak
dade vrlo jednostavno svesti na cjelobrojno raunanje.
Krenimo dalje. Kako emo znati kada se uope zraka i brid sijeku, da moemo poeti
primjenjivati gornji postupak? Evo ideje. Sve bridove podijeliti emo u tri kategorije:
1. brid koji e biti aktivan
2. brid koji je aktivan
3. brid koji nije aktivan
Stanje brida ovisiti e o napredovanju zrake. Zraka kree od visine ymin. Prije poetka rada
algoritma svi su bridovi tipa 1 (brid koji e biti aktivan). Algoritam krene. Onog trena kada
zraka stigne do donjeg kraja brida bi, tip brida se mijenja u tip 2 (brid koji je aktivan),
postavlja se poetno sjecite zrake i brida na x koordinatu donjeg kraja brida (ovo se obavi u
internom spremniku pridruenom svakom bridu), i u ovom koraku se to sjecite ignorira

SKRIPTA IZ RAUNALNE GRAFIKE

63

(analogijom sa prethodnim algoritmima sjecite odgovara onom gdje je =0). Ukoliko je


zraka naila na brid bi tipa 2, tada se rauna sjecite (pomou zapamenoga u internom
spremniku, i pomou faktora koji se takoer pamti u tom spremniku) i sjecite se prihvaa.
Ukoliko je zraka prola brid, tip brida je postavlja u tip 3 (neaktivan brid).
Pomou ove kategorizacije odmah se vidi da prilikom prolaska kroz popis bridova:

neaktivne bridove preskaemo (tip 3)


za aktivne bridove raunamo sjecita i provjeravamo treba li brid postati neaktivan
za bridove koji e biti aktivni provjeravamo samo treba li ih aktivirati

Na ovdje opisani nain pronalaenje sjecita dade se dosta ubrzati. Ukoliko se jo i bridovi u
popisu bridova sortiraju prema y koordinatama, napredovanjem algoritma moe se postii da
odreen dio popisa uope ne treba provjeravati jer su u njemu sigurno svi bridovi neaktivni, te
se mogu dobiti i daljnja ubrzanja. Kako ovo izgleda na primjeru, moe se vidjeti na slici
7.11.1.

7.12 ZAKLJUAK
U ovom poglavlju bavili smo se openitim postupcima popunjavanja poligona. Krenuli smo
od ideje, i doli do algoritma koji se temelji na scan-line algoritmu za popunjavanje poligona.
Posljednja prikazana funkcija ak i popunjava poligon bez greke. No prikazani algoritam ima
relativno veliku manu - pronalaenje sjecita je zbog operacija sa brojevima s pominim
zarezom dosta spor postupak. Danas su razvijeni i drugi algoritmi koji ovaj problem
minimiziraju (primjer je dan u poglavlju 7.11).

SKRIPTA IZ RAUNALNE GRAFIKE

64

8. KRIVULJE - OPENITO
8.1 UVOD
Pojam krivulje promatrati emo u najirem obliku: krivulja je niz toaka (uz dodatne uvjete
koji poblie opisuju specifini tip krivulje). U ovom dijelu teksta pozabaviti emo se nainima
zadavanja krivulja, klasifikacijama krivulja te poeljnim svojstvima krivulja.

8.2 ZADAVANJE KRIVULJA


Krivulje obino opisujemo analitiki, formulom (ili formulama). Tako imamo tri osnovne
kategorije zapisa krivulje:

Eksplicitnom jednadbom y=f(x). Problemi koji se pri tome javljaju svakom su


poznati. Npr. jednadba pravca u eksplicitnom obliku glasila je y=ax+b. No ovaj oblik
zapisivanja imao je i ozbiljnih problema. Jednadbu krunice oduvijek smo pisali u
obliku: y = R 2 x 2 , ne iz razonode, ve jednostavno iz injenice da se
eksplicitnim oblikom ne mogu prikazati funkcije sa viestrukim vrijednostima! Kod
krunice je to jo nekako prolazilo dodavanjem znaka ispred korijena i preutnim
prihvaanjem da tako zapravo radimo sa dvije krivulje a ne sa jednom.
Implicitnom jednadbom f(x,y)=0. Ovakav oblik jednadbe moe prikazati viestruke
vrijednosti, no ne moe dati djelomian prikaz. Npr. implicitni oblik jednadbe
krunice je x 2 + y 2 = R 2 . Ovime su obuhvaene sve toke koje pripadaju krunici, no
sada rije sve poinje predstavljati problem. Naime, ponekad elimo prikazati samo
npr. etvrt krunice!
Parametarskim zapisom. Pri tome se uvede jedan (ili vie) parametar, te se sve
koordinate opiu kao eksplicitne funkcije parametra (ili parametara). Npr. za krunicu
moemo pisati ovako: parametar je t, koordinate su x=cos(t), y=sin(t), 0t<2. Ovaj
oblik nudi i mogunost djelominog prikaza objekta. Tako za prikaz samo prve
etvrtine krunice parametar t umjesto u intervalu 0t<2 treba birati u intervalu
0t</2.

Neovisno o analitikom prikazu krivulje, krivulje moemo zadavati prema slijedeim


kriterijima:

tako da prolaze kroz zadane toke


tako da im definiramo vrijednosti prve derivacije u pojedinim tokama (tangente)
tako da im definiramo vrijednosti viih derivacija

Pri tome se mogu ravnopravno koristiti i kombinacije navedenih kriterija; npr. moemo traiti
da krivulja prolazi kroz n zadanih toaka, te da tangenta u prvoj toci bude pod kutom /4 i sl.
No prilikom ovakvog zadavanja treba imati u vidu da ponekad nije jednostavno dobiti sve
potrebne parametre krivulje koja e ispunjavati ovakve mijeane kriterije.

SKRIPTA IZ RAUNALNE GRAFIKE

65

8.3. KLASIFIKACIJA KRIVULJA


Krivulje moemo klasificirati prema razliitim kriterijima. Najee su klasifikacije slijedee:

periodike neperiodike
racionalne neracionalne
otvorene zatvorene
interpolacijske aproksimacijske

8.4. POELJNA SVOJSTVA KRIVULJA


U nastavku e biti nabrojano to sve elimo kod krivulja.

Mogunost prikaza viestrukih vrijednosti (znai, za jedan x vie moguih y


vrijednosti).
Nezavisnost od koordinatnog sustava.
Svojstvo lokalnog nadzora (promjena jedne toke uzrokuje promjenu oblika krivulje
samo u okolini te toke).
Smanjenje varijacije (zbog visokog stupnja polinoma krivulje ponekad se umjesto
glatke krivulje pojavljuje nepoeljno istitravanje).
Red neprekinutosti to vei (vie o ovome u nastavku).
Mogunost opisa osnovnih geometrijskih oblika poput krunice, elipse i sl.

8.5. RED NEPREKINUTOSTI


Red neprekinutosti dolazi iz matematike analize i odnosi se na funkcije. Kako se krivulje
zadaju takoer preko funkcija, treba pogledati na to se odnose redovi neprekinutosti u ovom
sluaju.

8.5.1. C KONTINUITETI

C0 kontinuitet (ita se "ce nula", ne "ce na nultu"). Zahtjeva se neprekinutost u


koordinatama. Ovo je, funkcijski gledano, zahtjev na funkciju da nema
diskontinuitete. Npr. funkcija apsolutno(x) je funkcija C0 kontinuiteta.
C1 kontinuitet. Zahtjeva se neprekinutost tangente u svim tokama. Drugim rijeima,
ne smije biti iljaka, ve krivulja mora biti glatka. Npr. funkcija apsolutno(x) nije
funkcija C1 kontinuiteta, iako ima C0 kontinuitet. Razlog je iljak u ishoditu!
C2 kontinuitet. Zahtjeva se neprekinutost druge derivacije u svim tokama.
C3 kontinuitet. Zahtjeva se neprekinutost tree derivacije u svim tokama. Moe se
opisati kao neprekinutost u izvijanju.

SKRIPTA IZ RAUNALNE GRAFIKE

66

8.5.2. G KONTINUITETI
G kontinuiteti postavljaju neto blae zahtjeve. Da bi vrijedio G kontinuitet, zahtjeva se da
derivacije budu proporcionalne (dok C kontinuiteti zahtjevaju da budu iste).
Trai se da vrijedi:
f 1'

= k f 2'

SKRIPTA IZ RAUNALNE GRAFIKE

67

9. KRIVULJE ZADANE PARAMETARSKIM OBLIKOM


9.1. UVOD
U prethodnom poglavlju opisani su naini zapisivanja funkcija. U ovom poglavlju posvetiti
emo se najzanimljivijem obliku parametarskom. Ovaj oblik specifian je po tome to uvodi
dodatni parametar, zahvaljujui kojemu omoguava opisivanje i pravih funkcija, i funkcija sa
viestrukim vrijednostima. Ideja je da se sve koordinate izraze kao funkcija tog novog
parametra. Parametar emo oznaavati oznakom t. U tom se sluaju ovisnost koordinata o
parametru t moe izraziti funkcijski:
x = f (t )
y = g (t )
Funkcije f i g mogu biti razliitih oblika. Neke od oblika upoznati emo u slijedeem
poglavlju.
Parametarski oblik za svaku vrijednost parametra odreuje po jednu toku krivulje.
Zamislimo li da parametar t predstavlja vrijeme, a krivulja putanju siune estice, tada
parametarski oblik za svaki trenutak odreuje poloaj estice. Pustimo li vrijeme da tee
kontinuirano, tada e se estica gibati po zadanoj krivulji. Dakako, pri tome se moramo
osloboditi fizikalnih zakonitosti koje idu uz ovu sliku; naime, kako e izgledati ta putanja
ovisi jedino o funkcijama koje odreuju ovisnosti koordinata o parametru. Tako je mogue da
se estica u jednom trenutku giba ulijevo, pa ve u slijedeem zakrene za 90 i nastavi
gibanje, ili pak prekine gibanje na tom mjestu i nastavi na nekom sasvim drugom.
Mijenjamo li parametar t po svim dozvoljenim vrijednostima (za koje su funkcije definirane),
dobiti emo cijelu krivulju. No mijenjamo li taj parametar unutar manjeg intervala [t0,t1],
estica e opisati samo segment krivulje.

9.2. UPORABA PARAMETARSKOG OBLIKA


Krivulja je po definiciji skup toaka. Beskonaan skup toaka. Parametarski oblik nam ovisno
o parametru t daje za svaki t po jednu toku krivulje. Ukoliko elimo nacrtati cijelu krivulju
(dakle pokupiti sve toke), posao neemo obaviti nikada. Krivulje obino prikazujemo na
zaslonu, koji je rasterska jedinica. Zaslon se sastoji od niza elemenata koji mogu biti ili
upaljeni, ili ugaeni. Elementi zaslona adresiraju se cjelobrojnom adresom. Proizlazi da zaslon
ima konano mnogo elemenata, i krivulja e na zaslonu biti aproksimirana konanim brojem
elemenata. No kako emo odrediti te elemente? Jedan od naina je odreivanje konanog
broja toaka krivulje, te njihovo povezivanje pravcima. Za primjer emo uzeti prikaz
krunice. Krunica se u parametarskom obliku moe napisati:
x = R cos(t 2 ) + CenterX

y = R sin (t 2 ) + CenterY
Sve toke krunice pokupiti emo ukoliko mijenjamo parametar t u intervalu [0,1>. Sredite
krunice nalazi se u toki (CenterX,CenterY), a radijus krunice je R.

SKRIPTA IZ RAUNALNE GRAFIKE

68

Prema navedenom receptu, da bismo nacrtali krivulju (krunicu), idemo odrediti Divs toaka
krunice, te susjedne toke spojiti linijama. No postavlja se pitanje koliko toaka treba
odrediti? Pokuajmo to utvrditi eksperimentom. Na slikama 9.2.1a do 9.2.1f prikazani su
rezultati za razliite vrijednosti broja toaka.

a) Divs = 3

b) Divs = 4

c) Divs = 6

d) Divs = 8

e) Divs = 12

f) Divs = 60

9.2.1.

Iz slika je jasno vidljivo kada je prikaz bolji; to vie toaka odredimo raunski, prikaz na
zaslonu je uvjerljiviji. to nas opet vodi na zakljuak da treba uzeti beskonano finu podjelu.
No ovo ba i nije istina! Neka je krunica radijusa 100 elemenata. I pretpostavimo da smo
izraunali upravo onoliko toaka koliko je potrebno da bi svaka izraunata toka imala i
susjednu koja je isto izraunata (drugim rijeima, linije kojima spajamo te toke dugake su
tono jedan element tj. svaka spojnica degenerirala je u toku). U tom sluaju finijom
podjelom neemo nita postii osim da na zaslonu vie puta osvijetlimo iste toke. Koliko
smo toaka osvijetlili? Pa gruba raunica kae da smo osvijetlili cijeli opseg krunice, dakle
2R = 628 elemenata! No u praksi emo ipak ii na malo vie toaka. Evo obrazloenja.
Mijenjamo li parametar t od 0 do 0.25, opisati emo prvu etvrtinu krunice. Pogledajmo
kako nae funkcije raspodjeljuju toke u toj etvrtini. Prvih 45 prolazimo sa t izmeu 0 i
0.125. Drugih 45 prolazimo sa t izmeu 0.125 i 0. 25. Oba ova segmenta imaju isti broj
izraunatih toaka. Da smo umjesto krunice crtali elipsu dosta izduenu po X osi, tada bi u
prvih 45 segment bio puno dui od segmenta u drugih 45, a oba bi dobila isti broj toaka!
Ovo vodi na zakljuak da funkcije ve inherentno neravnomjerno rasporeuju toke, te se
moe dogoditi da na jednom segmentu imamo puno izraunatih toaka a na drugom malo. Na
segmentu na kojem ima malo toaka jasnije bi se vidjelo spajanje linijama a to ne elimo!
Zato je potrebno napraviti ve u startu guu podjelu da se ovi efekti uine zanemarivim.

SKRIPTA IZ RAUNALNE GRAFIKE

69

9.3. PRIMJER CRTANJA KRUNICE


U nastavku emo dati implementaciju funkcije koja crta krunicu na zaslonu, oslanjajui se na
parametarski zapis krivulje. Funkciji se predaju koordinate gornjeg lijevog vrha i donjeg
desnog vrha kvadrata kojemu se upisuje krunica. Prototip funkcije biti e:
void Circle(T2DRealPoint Point0, T2DRealPoint Point1, int Divs );

Struktura T2DRealPoint opisuje jednu toku i definirana je kao:


typedef struct {
double x;
double y;
} T2DRealPoint;

Ukoliko e se funkcija koristiti iskljuivo za prikaz krunice na zaslonu, komponente toke


mogu biti i cjelobrojne; inae je opravdano koristiti realne koordinate (npr. ukoliko su
dimenzije platna na koje se crta normirane tako da su irina i visina jednake 1).
Funkcija osim vrhova kvadrata prima jo jedan parametar : Divs kojim se odreuje sa koliko
e se segmenata nacrtati krivulje.
void Circle( T2DRealPoint Point0, T2DRealPoint Point1, int Divs ) {
double t, t0, CenterX, CenterY, Rad;
T2DRealPoint p0, p;
bool Prvi;
int n;
if(Point0.x > Point1.x ) {
t0 = Point0.x;
Point0.x = Point1.x;
Point1.x = t0;
}
if(Point0.y > Point1.y ) {
t0 = Point0.y;
Point0.y = Point1.y;
Point1.y = t0;
}
CenterX = (Point0.x+Point1.x)/2.;
CenterY = (Point0.y+Point1.y)/2.;
Rad = Point1.x - CenterX;
t0 = 2.*M_PI/Divs; Prvi = true;
for( n=0, t=0.; n<=Divs; n++,t=t+t0 ) {
p.x = Rad*cos(t)+CenterX;
p.y = Rad*sin(t)+CenterY;
if( Prvi ) {
p0 = p;
Prvi = false;
} else {
MoveTo(p0.x, p0.y);
LineTo(p.x, p.y);
p0 = p;
}
}

SKRIPTA IZ RAUNALNE GRAFIKE

70

U funkciji se najprije osigura da je gornji lijevi kut doista gornji lijevi, te se ista provjera
napravi i sa donjim desnim. Zatim se rauna centar krunice, i njezin radijus. Konano se u
petlji raunaju koordinate toaka i meusobno se spajaju. Kontrola broja ponavljanja petlje
vri se pomou cjelobrojne varijable n. Iako se na prvi pogled ini kao nepotrebno, potrebno
je zbog toga to je aritmetika pominog zareza netona i zna dovesti do toga da se crtanje
zadnjeg segmenta preskoi. Funkcije MoveTo i LineTo zaduene su za crtanje pojedinih
segmenata. Ukoliko se koriste funkcije koje kao argumente zahtijevaju cijele brojeve, tada
koordinate treba zaokruiti (inae e decimalni dio biti odsjeen pa e npr. 4.95 biti
pretvoreno u 4 to nije dobro).
Ovdje primijenjen postupak za izraunavanje toaka krunice temelji se direktno na jednadbi
krunice (parametarskom obliku), te kao takav ne spada u grupu optimalnih. Za iscrtavanje
krunice postoje i bri postupci, a jedan od njih je i Bresenhamov postupak za krunice!

9.4. PRIMJER CRTANJA ELIPISE


Prethodni primjer moe se vrlo modificirati tako da se umjesto krunice crta elipsa. Elipsa za
razliku od krunice ima dva radijusa; jedan odreuje irinu elipse a drugi visinu. Funkcija
koju emo napisati prihvatiti e koordinate pravokutnika kojemu treba upisati elipsu.
void Ellipse(T2DRealPoint Point0, T2DRealPoint Point1, int Divs ) {
double t, t0, CenterX, CenterY, RadX, RadY;
T2DRealPoint p0, p;
bool Prvi;
int n;
if(Point0.x > Point1.x ) {
t0 = Point0.x;
Point0.x = Point1.x;
Point1.x = t0;
}
if(Point0.y > Point1.y ) {
t0 = Point0.y;
Point0.y = Point1.y;
Point1.y = t0;
}
CenterX = (Point0.x+Point1.x)/2.;
CenterY = (Point0.y+Point1.y)/2.;
RadX = Point1.x - CenterX;
RadY = Point1.y - CenterY;
t0 = 2.*M_PI/Divs; Prvi = true;
for( n=0, t=0.; n<=Divs; n++,t=t+t0 ) {
p.x = RadX*cos(t)+CenterX;
p.y = RadY*sin(t)+CenterY;
if( Prvi ) {
p0 = p;
Prvi = false;
} else {
MoveTo(p0.x, p0.y);
LineTo(p.x, p.y);
p0 = p;

SKRIPTA IZ RAUNALNE GRAFIKE

71

}
}
}

9.5. KONSTRUKCIJA KRIVULJE OBZIROM NA ZADANE TOKE


Jedan od najeih problema koji je vezan uz podruje krivulja moe se iskazati slijedeim
zadatkom: "zadano je n+1 toka; potrebno je povui krivulju obzirom na te toke". to tono
znai "obzirom", ovisi o potrebama; to moe znaiti "kroz toke", ali i ne mora. Takoer se
mogu postavljati razliiti zahtjevi na oblik krivulje; npr. moemo traiti da krivulja bude
glatka i sl.
Jedno od moguih rjeenja je uporaba teinskih funkcija. Ideja
je slijedea. elimo konstruirati krivulju iji se poetak dobije
za vrijednost parametra t=ts a kraj za t=te. Pri tome krivulja
prolazi kraj toke Ti za vrijednost parametra t=ti. Iskoristiti
emo teinske funkcije zvonolikog oblika koje imaju
maksimum za t=ti, kao na slici 9.5.1. Teinskih funkcija biti e
onoliko koliko je zadano toaka. Svaka toka obliku krivulje
doprinositi e svojim koordinatama pomnoenim sa teinskom
funkcijom. Jednadbu krivulje tada emo zapisati kao sumu
svake toke pomnoene teinskom funkcijom. Teinske
funkcije oznaavati emo oznakom fi, pri emu indeks i govori
kojoj toci pripada ta teinska funkcija. Tako jednadbu
krivulje moemo zapisati:

ti

9.5.1.
n

TK = f i (t ) Ti
i =0

gdje je TK toka krivulje a Ti i-ta zadana toka (kako je zadano n+1 toka, indeks ide od 0 do
n). Uzmimo kao primjer zadane tri toke. Teinske funkcije mogle bi izgledati kao na slici
9.5.2.
1

f0

f1

t0

f2

t1

t2

9.5.2.

Ukoliko krivulju crtamo od t=t0 do t=t2, to moemo rei o krivulji gledajui ove teinske
funkcije?
Za t=t0 je f0=1, f1=0, f2=0, pa je:
3

TK (t = t 0 ) = f i (t ) Ti = f 0 (t 0 ) T0 + f1 (t 0 ) T1 + f 2 (t 0 ) T2 = 1 T0 + 0 T1 + 0 T2 = T0
i =0

SKRIPTA IZ RAUNALNE GRAFIKE

72

Za t=t1 je f0=0, f1=1, f2=0, pa je:


3

TK (t = t1 ) = f i (t ) Ti = f 0 (t1 ) T0 + f1 (t1 ) T1 + f 2 (t1 ) T2 = 0 T0 + 1 T1 + 0 T2 = T1


i =0

Za t=t2 je f0=0, f1=0, f2=1, pa je:


3

TK (t = t 2 ) = f i (t ) Ti = f 0 (t 2 ) T0 + f1 (t 2 ) T1 + f 2 (t 2 ) T2 = 0 T0 + 0 T1 + 1 T2 = T2
i =0

Krivulja dakle prolazi kroz sve zadane toke, a meutoke se aproksimiraju. Moemo li
pogledom na sliku 9.5.2. rei kako krivulja ovisi o promjeni pojedine toke? Na slici je jasno
vidljivo da istovremeno na poloaj toke djeluju najvie dvije teinske funkcije dok su ostale
nula; naime, na intervalu [t0,t1] djeluju f0 i f1 dok je f2 jednaka nuli. Na intervalu [t1,t2] djeluju
f1 i f2 dok je f0 jednaka nuli. To znai da oblik krivulje na intervalu [t0,t1] odreuju iskljuivo
toke T0 i T1 dok toku T2 moemo pomicati kamo god elimo bez da utjeemo na ovaj
segment krivulje. Oblik krivulje na intervalu [t1,t2] odreuju pak toke T1 i T2 dok toku T0
moemo pomicati kamo god elimo bez da utjeemo na ovaj segment krivulje. Ovakvo
svojstvo krivulje kada promjena poloaja jedne toke utjee na promjenu oblika krivulju
iskljuivo u okolini te toke naziva se svojstvo lokalnog nadzora. Naime, neke krivulje
nemaju ovo svojstvo, pa pomaknemo li jednu toku krivulje, mijenja se cijela krivulja!
Svojstvo lokalnog nadzora poeljno je svojstvo.
Pogledajmo jo malo sliku 9.5.2. Na slici su sve teinske funkcije jednake. Takve funkcije
nazivamo uniformnima. Kod teinskih funkcija moemo mijenjati dva parametra: visinu
teinske funkcije, te irinu teinske funkcije. Pogledajmo kakvog to utjecaja ima na oblik
krivulje.
Ukoliko mijenjamo visinu teinske funkcije, fizikalno to moemo protumaiti kao promjenu
privlaenja dotine toke i krivulje. to je teinska funkcija via, to e odgovarajua toka
vie utjecati na oblik krivulje; to je teinska funkcija nia, to e toka manje mijenjati oblik
krivulje. Ovo nam omoguava da osim samih toaka odredimo i njihove "teine" te na temelju
toga mijenjamo oblik krivulje.
Promjena irine teinske funkcije moe se tumaiti kao promjena dosega privlane sile
izmeu toke i krivulje. to je teinska funkcija ira, to e odgovarajua toka imati utjecaj na
vei komad krivulje; to je teinska funkcija ua, to e toka utjecati na krivulju na manjem
segmentu. Na slici 9.5.2. odabrane su teinske funkcije tako da svaka toka utjee na krivulju
na segmentu od prethodnog susjeda toke pa do slijedeeg susjeda toke. Ovime smo postigli
svojstvo lokalnog nadzora jer utjecaj jedne toke nije dopirao dalje od njezinih susjeda.
Ukoliko bismo irine teinskih funkcija udvostruili, tada bi utjecaj toke T0 dopirao sve do
toke T2; a kako krivulju crtamo upravo od toke T0 do toke T2, tada bi toka T0 utjecala na
cijelu krivulju! A time bismo izgubili svojstvo lokalnog nadzora.
Ukoliko se dozvoljava da se pojedine teinske funkcije razlikuju po irini i po visini, tada za
takve teinske funkcije kaemo da su neuniformne.

SKRIPTA IZ RAUNALNE GRAFIKE

73

9.6. ZAKLJUAK
U ovom poglavlju upoznali smo se sa znaajem parametarskog oblika, nainima crtanja
funkcija zadanih na taj nain, te idejom konstrukcije krivulje obzirom na zadane toke. U
dijelu 9.5. pokazali smo kako se krivulje mogu konstruirati koristei teinske funkcije. Pri
tome su kao primjer uzete zvonolike teinske funkcije. Primjer nam je posluio i za
upoznavanje sa utjecajima pojedinih parametara samih teinskih funkcija na oblik krivulje.
Situacija u praksi, to se tie ovog dijela je vrlo arolika. Ne samo da se koriste svakakvi
oblici teinskih funkcija, nego se i izvode novi, ovisno o zahtjevima koji se postavljaju na
krivulje. Kao primjer krivulja koje nude dosta slobode a koriste zvonolike funkcije navesti u
NURBS (neuniformni racionalni b-spline). Primjer esto koritenih krivulja koje ne koriste
zvonolike teinske funkcije su Bezierove krivulje.
U nastavku ove skripte upoznati emo se nekim od estih oblika krivulja.

SKRIPTA IZ RAUNALNE GRAFIKE

74

10. BEZIEROVE KRIVULJE


10.1. UVOD
U raunalnoj grafici jedan od estih zadataka je provlaenje glatke krivulje izmeu zadanog
niza toaka (aproksimacija krivulje). Jedno od rjeenja problema nude nam Bezierove
krivulje. Do krivulja su nezavisno doli 1962. Bezier koji je radio za tvrtku Renault, te 1959.
De Casteljau koji je radio za tvrtku Citroen. Da je rije o istim krivuljama, 1970. godine
dokazao je Robert Forest. Za matematiki opis Bezierovih krivulja postoje dvije metode:
gibanje vrha sastavljenog otvorenog poligona koja vodi na Bezierove teinske funkcije, te
parametarsko dijeljenje vektora koje vodi na Bernsteinove teinske funkcije. Za praktinu
primjenu u raunalima Bernsteinove teinske funkcije su daleko pogodnije. Isto tako emo
razlikovati dva tipa Bezierovih krivulja: aproksimacijska i interpolacijska. Aproksimacijska
Bezierova krivulja prolazi kroz poetnu i zavrnu toku, dok kroz ostale toke ne prolazi.
Zato se i kae da aproksimira zadanu krivulju. Interpolacijska Bezierova krivulja prolazi kroz
sve zadane toke; ona dakle interpolira krivulju po segmentima izmeu zadanih toaka, a
prolazi kroz zadane toke.
No aproksimacijsku Bezierovu krivulju lagano je odrediti, kako emo vidjeti u nastavku. S
druge strane, interpolacijsku Bezierovu krivulju dobivamo trikom. Naime, budui da
jednostavno provlaimo aproksimacijsku krivulju, a zadane su nam toke kroz koje krivulja
mora proi, te toke emo iskoristiti tako da izraunamo nove toke izmeu kojih emo
provui aproksimacijsku krivulju, uz uvjet da ta krivulja prolazi kroz stare zadane toke.
Vidimo dakle da osnovno to moramo nauiti je kako raunati aproksimacijsku krivulju.

10.2 APROKSIMACIJSKA BEZIEROVA KRIVULJA


10.2.1 OZNAKE
Prilikom rada s Bezierovim krivuljama te njihovog matematikog tretmana koristiti emo
slijedee oznake:
Toke - vrhovi poligona biti e oznaeni oznakom Ti, gdje je i indeks toke. Bezierova
krivulja biti e zadana tokama T0, T1, ..., Tn. Pri tome n oznaava stupanj krivulje.
Tako e krivulja treeg stupnja (n=3) biti zadana sa etiri toke: T0, T1, T2 i T3.
r
Oznakom ri oznaavati e se radij-vektori toaka vrhova poligona. Radij vektor je
vektor koji spaja ishodite i zadanu toku Ti. Zbog toga su mu sve komponente
jednake kao i kod same toke Ti. Dakle, radij-vektor koji spaja toku (1 2) je (1 2).
r
Oznakom ai oznaavati e se vektori izmeu toaka Ti-1 i Ti; kako toka T0 nema
r
r
r
prethodne, vektor a0 biti e jednak radij-vektoru te toke, tj a 0 = r0 . Openito se
r Ti Ti 1 ,
ai =
T0 ,
Teinske funkcije bit e oznaavane
teinskih funkcija umjesto stajati f,

moe zapisati:

i>0
i=0
oznakom i,n, pri emu e kod Bezierovih
a kod Bernsteinovih teinskih funkcija b. Pri

SKRIPTA IZ RAUNALNE GRAFIKE

75

tome i oznaava indeks funkcije, i taj parametar e se mijenjati izmeu 0 i n, dok n


oznaava stupanj krivulje.

10.2.2 BEZIEROVE TEINSKE FUNKCIJE


Do ovih se funkcija dolazi metodom gibanja vrha sastavljenog otvorenog poligona, kao to je
ve spomenuto u uvodu. Sastavljeni otvoreni poligon oznaava poligon koji se dobije kada se
r
svi vektori izvornog poligona ai pomnoe sa odreenim teinskim funkcijama i zatim zbroje.
Kod nas e, dakako, vektori biti pomnoeni Bezierovim teinskim funkcijama. Slijedi da se
moe pisati:
n
r
r
p(t ) = ai f i ,n (t )
i =0

r
pri emu je p(t ) radij-vektor toke koja pripada krivulji (vrh sastavljenog otvorenog
poligona), a t je parametar kojim odreujemo sve toke krivulje. Za t=0 dobiva se poetna
toka krivulje, a za t=1 dobiva se zavrna toka krivulje. Sve ostale toke dobivaju se za
t 0,1 .
Do analitikih izraza za funkcije dolazi se iz slijedeih zahtjeva:
1. Krivulja za t=0 prolazi kroz prvu zadanu toku:
r
r
p(0) = a 0
odakle slijedi:
f 0,n (0) = 1

f i ,n (0) = 0, i = 1,2,...n
2. Krivulja za t=1 prolazi kroz zadnju zadanu toku:
n
r
r
p(1) = ai
i =0

odakle slijedi:
f i,n (1) = 1, i = 0,1,...n

r
3. U poetnoj toki nagib krivulje jednak je nagibu vektora a1 :
f 1',n (0) = 1,

f i ,' n (0) = 0,

i 1

Za izvod pogledati okvir 10.2.1.1.


r
4. U zavrnoj toki nagib krivulje jednak je nagibu vektora a n :

f n',n (1) = 1,

f i ,' n (1) = 0,

in

5. Postavlja se zahtjev na druge derivacije u poetnoj toki:


f 1','n (0) 0,
f 2'',n (0) 0,
f i ,''n (0) = 0, i 1,2
6. Postavlja se zahtjev na druge derivacije u zavrnoj toki:
f n''1,n (1) 0,
f n'',n (1) 0,
f i ,''n (1) = 0, i n 1, n

SKRIPTA IZ RAUNALNE GRAFIKE

76

7. Zahtjeva se simetrinost, odnosno trai se da redoslijed toaka ne utjee na izgled


krivulje (zamjena poetne i krajnje toke nema utjecaja), to vodi na zahtjev:
f i ,n (t ) = 1 f n i +1,n (1 t ),
i = 1,2,..., n
r
r r r
Vektor a1 je razlika radij vektora a1 = r1 r0 , te svojim komponentama odreuje nagib:
n
a1, y
r
r
. Krivulja je zadana u parametarskom obliku sumom p(t ) = ai f i,n (t ) . Ova
tg =
a1, x
i =0
dy
jednadba vrijedi i za svaku komponentu zasebno. Nagib krivulje odreen je derivacijom
,
dx
to iz dane jednadbe ne moemo dobiti direktno, ve malim trikom. Pomnoimo traenu
derivaciju sa prikladno napisanom jedinicom:
n
d n

dy
ai , y f i ,n (t ) ai , y f i ,' n (t )
dt
dy dy dt dt
= i =0
=
=
= i =n0
=
n
dx
dx dx dt
d

'
ai , x f i ,n (t ) ai , x f i ,n (t ) .
dt
dt i =0
i =0

a 0, y f 0',n (t ) + a1, y f1',n (t ) + ... + a n , y f n',n (t )


a 0, x f 0',n (t ) + a1, x f1',n (t ) + ... + a n , x f n',n (t )

Zahtjev je da u poetnoj toki (t=0) nagib bude

a1, y
a1, x

, odakle slijedi:

a 0, y f 0',n (0 ) + a1, y f1',n (0 ) + ... + a n , y f n',n (0) a1, y


dy
(t = 0) =
=
dx
a 0, x f 0',n (0) + a1, x f1',n (0) + ... + a n , x f n',n (0 ) a1, x
to je mogue samo ako su derivacije svih teinskih funkcija u toj toci jednake nuli, osim
r
derivacije funkcije f0,n jer ona mnoi traene komponente vektora a1 .
Slino se dobije i za zahtjev 4, gdje se trai jednakost nagiba u zavrnoj toci krivulje (t=1), i
a n, y
r
vektora a n , ukoliko se u gornju formulu uvrsti t=1, i tg =
. Tada se izjednaavanjem
a n, x
dobije da derivacije svih teinskih funkcija osim fn,n moraju biti nula.

Okvir 10.2.1.1.
Teinske funkcije koje proizlaze iz ovih zahtjeva nazivaju se Bezierove teinske funkcije i
zadane su izrazom:
(t ) i d ( i 1) n (t )
, i = 1,2,..., n
(i 1)! dt ( i 1)
f 0,n (t ) = 1

f i ,n (t ) =

pri emu je funkcija n(t) zadana jednadbom:


1 (1 t ) n
n (t ) =
t

SKRIPTA IZ RAUNALNE GRAFIKE

77

Zbog potrebe za deriviranjem i vrlo sloenih izraza vidljivo je da ovakav zapis nije ba
prikladan za uporabu u raunalima. No ovi se izrazi mogu napisati u, za raunala, puno
prihvatljivijem obliku: kao rekurzivne funkcije.
f i ,n (t ) = (1 t ) f i ,n 1 (t ) + t f i 1,n 1 (t )
f 0, 0 (t ) = 1,

f 1,k (t ) = 1,

f k +1,k (t ) = 0

10.2.3. BERNSTEINOVE TEINSKE FUNKCIJE


Do funkcija se dolazi na slijedei nain. Potrebno je odrediti toku krivulje za fiksni t. Npr. za
t=1/3. Sve stranice izvornog poligona podijele se novom tokom koja odgovara zadanom
parametru t (duljina cijele stranice je 1). Novodobivene toke spoje se spojnicama, i zatim se
na spojnicama odreuju nove toke, zadane parametrom t. Postupak se ponavlja sve dok ne
ostane samo jedna spojnica i na njoj odreena toka. Ta toka ujedno je i toka krivulje.
Postupak emo najbolje ilustrirati na primjeru. Neka su zadane toke prema slici 10.2.3.1. Na
slici 10.2.3.1.a toke su odmah spojene u otvoreni poligon. Odredimo toku za t=1/4. Toka
b1,0 oznaava toku na etvrtini izmeu toaka T1 i T0. Toka b1,1 je etvrtina izmeu toaka
T2 i T1. Toka b1,2 je etvrtina izmeu toaka T3 i T2. Toaka b1,0, b1,1 i b1,2 spojene su u dvije
nove spojnice. Na slici 10.2.3.1.b te su spojnice podijeljene tako da se toka b2,0 nalazi na
etvrtini izmeu b1,1 i b1,0, a toka b2,1 nalazi na etvrtini izmeu b1,2 i b1,1. Ove dvije toke
opet su spojene spojnicom. Na slici 10.2.3.1.c ta je spojnice podijeljena tako da se toka b3,0
nalazi na etvrtini izmeu b2,1 i b2,0. Time je postupak gotov jer vie nemamo novih spojnica i
toka b3,0 pripada krivulji.

SKRIPTA IZ RAUNALNE GRAFIKE

T1

b 1,1

78

T
b 1,2

b 1,0
T0

T3
a)
T1

b 1,1

T
b 2,1

b 1,2

b 2,0
b 1,0
T0

T3
b)
T1

b 1,1

T
b 2,1

b 2,0

b 1,2

b 3,0

b 1,0
T0

T3
c)

10.2.3.1.

SKRIPTA IZ RAUNALNE GRAFIKE

79

Matematiki se postupak moe opisati na slijedei nain. Krenuli smo od toaka poligona:
b1,0 = (T1 T0 ) t + T0
b1,1 = (T2 T1 ) t + T1
b1, 2 = (T3 T2 ) t + T2
Zatim smo spojnice dijelili:
b2,0 = (b1,1 b1,0 ) t + b1, 0
b2,1 = (b1, 2 b1,1 ) t + b1,1
I konano smo i te spojnice podijelili:
b3,0 = (b2,1 b2, 0 ) t + b2, 0
Ako sada b3,0 izrazimo samo preko toaka, dobiti emo:
b3, 0 = (1 t ) 3 T0 + 3t (1 t ) 2 T1 + 3t 2 (1 t ) T2 + t 3 T3
ili da to napiemo korektno preko radij-vektora toaka:
r
r
r
r
b3, 0 = (1 t ) 3 r0 + 3t (1 t ) 2 r1 + 3t 2 (1 t ) r2 + t 3 r3

Ova toka pripada krivulji, pa konano moemo pisati:

r
r
r
r
r
p(t ) = (1 t ) 3 r0 + 3t (1 t ) 2 r1 + 3t 2 (1 t ) r2 + t 3 r3
Dobivena je formula koja opisuje sve toke Bezierove krivulje zadane preko etiri toke,
dakle krivulje treeg reda. Pogleda li se formula malo bolje, vidi se da faktori ispred radijvektora neobino podsjeaju na binomnu formulu. Da ima istine u tome, govori nam slijedei
zapis ovdje prikazanih teinskih funkcija poznat kao Bernsteinove teinske funkcije:
n
r
r
p(t ) = ri bi ,n (t )
i =0

pri emu su teinske funkcije dane relacijom:


n
n!
bi ,n (t ) = t i (1 t ) n i =
t i (1 t ) n i
i
i
!
(
n

i
)!

Ovo je najjednostavniji oblik za uporabu u raunalima, i mi emo ga koristiti u nastavku.
Pojava faktorijela takoer ne komplicira stvari.

SKRIPTA IZ RAUNALNE GRAFIKE

80

10.2.4. VEZA BEZIEROVIH I BERNSTEINOVIH TEINSKIH FUNKCIJA


U uvodu smo ve rekli da se i pomou Bezierovih i pomou Bernsteinovih teinskih funkcija
opisuje ista krivulja; to je dokazao Robert Forest. Mi emo u nastavku samo dati tu vezu:
n

f i ,n (t ) = b j ,n (t )
j =i

10.2.5. CRTANJE APROKSIMACIJSKE KRIVULJE POMOU


BERNSTEINOVIH POLINOMA
Uvesti emo strukturu sVector2D koja e biti zaduena za pamenje radij-vektora zadane
toke. Struktura je oblika:
typedef struct {
double x;
double y;
} sVector2D;

Struktura nam doputa pamenje toaka ije koordinate nisu cijeli brojevi (ovo se esto
pojavljuje pri radu sa grafikim objektima prije zavrne faze u kojoj se objekt prikazuje na
rasterskoj jedinici).
Definirati emo tri varijeble: Vectors kao polje koje pamti zadane vektore, Factors kao polje
pamti binomne koeficijente (n "povrh" i), te n kao broj koji pokazuje stupanj krivulje (i
polinoma). Deklaracije varijabli su:
int n;
int *Factors;
sVector2D *Vectors;

Slijedei korak je zadavanje broja n, te alociranje i popunjavanje polja Vectors i Factors; npr.
n = 3;
Factors = new int[n+1];
Vectors = new sVector2D[n+1];
Vectors[0].x
Vectors[1].x
Vectors[2].x
Vectors[3].x

=
=
=
=

1; Vectors[0].y = 1;
10; Vectors[1].y = 40;
35; Vectors[2].y = 10;
45; Vectors[3].y = 40;

CalcFactors();

Operator new dolazi iz jezika C++, i za nae potrebe moe se poistovjetiti funkciji malloc;
alokacije polja Factors i Vectors mogle su se u klasinom C-u napisati ovako:

SKRIPTA IZ RAUNALNE GRAFIKE

81

Factors = (int*)malloc(sizeof(int)*(n+1));
Vectors = (sVector2D*)malloc(sizeof(sVector2D)*(n+1));

Ovdje se lagano moe uoiti veza izmeu stupnja krivulje i broja toaka: stupanj krivulje za
jedan je manji od broja toaka kojim je krivulja zadana. Gornji programski isjeak poziva
funkciju CalcFactors(). Funkcija rauna binomne koeficijente i popunjava polje Factors. Evo
tijela funkcije:
void CalcFactors() {
int i, a;
a = 1;
for( i = 1; i <= n+1; i++ ) {
Factors[i-1] = a;
a = a * (n-i+1) / i;
}
}

Kao to se vidi iz tijela funkcije, faktorijele se nigdje ne spominju! Objanjenje je trivijalno.


Neka je zadan stupanj n. Tada su faktori redom:
Factors[0] = 1
n
n
Factors[1] = = Factors[0]
1
1
n (n 1)
n 1
= Factors[1]
Factors[2] =
1 2
2
n (n 1) (n 2)
n2
= Factors[2]
Factors[3] =
1 2 3
3
...
n (n 1) (n 2) ... 1
n (n 1)
= Factors[n 1]
Factors[n] =
1 2 3 ... n
n
odnosno svaki se faktor moe dobiti poznavanjem samo prethodnog faktora; takoer, svi su
faktori cijeli brojevi. Ostalo je jo jedino nacrtati krivulju! Funkcija koja to radi zove se
DrawBezier, a tijelo funkcije slijedi:
void DrawBezier() {
int i, j;
double t, b;
sVector2D p;
// Iscrtavanje kontrolnog poligona...
for( i = 0; i < n; i++ ) {
Line(Vectors[i].x,Vectors[i].y,Vectors[i+1].x,Vectors[i+1].y, clRed);
}
// Iscrtavanje krivulje...
t = 0;
for( i = 0; i < 1000; i++, t=t+1./1000. ) {
p.x = p.y = 0.;
for( j = 0; j <= n; j++ ) {

SKRIPTA IZ RAUNALNE GRAFIKE

82

if( j != 0 ) {
b = Factors[j]*pow(t,j)*pow(1-t,n-j);
} else {
b = Factors[j]*pow(1-t,n-j);
}
p.x += Vectors[j].x * b;
p.y += Vectors[j].y * b;
}
PutPixel( p.x, p.y, clBlack );
}
}

Iscrtavanje krivulje radi se za tisuu vrijednosti parametra t u intervalu od 0 do 1 (ovo je


odreeno petljom po i). Radij-vektor svake toke rauna se sumom svih radij-vektora zadanih
toaka pomnoenih sa odgovarajuim Bernsteinovim koeficijentom (petlja po j). Bernsteinov
koeficijent pohranjuje se u varijablu b, dok je izraunavanje diktirano varijablom j. Naime,
ukoliko je j=0, i nalazimo se u prvom koraku pa je i t=0, opi izraz za izraunavanje
koeficijenta nam daje nula na nultu i tu program radi krivo. No mi znamo da u tom sluaju
rezultat iznosi 1, jer je taj dio izraza proizaao iz t na nultu, to je jedan. Sve ostalo bi trebalo
biti dovoljno jasno. Za iscrtavanje linije koritena je funkcija koja prima poetnu i zavrnu
toku, te boju linije. Funkcija za iscrtavanje pixela prima koordinate i boju. U nedostatku ovih
funkcija lagano se napiu funkcije koje ovo mogu oponaati.

10.2.6. SVOJSTVA APROKSIMACIJSKIH BEZIEROVIH KRIVULJA


1. Postoji konveksna ljuska i krivulja je unutar ljuske.
2. Krivulja nema vie valova od kontrolnog poligona (ili drugim rijeima, ravnina kojom
presijeemo krivulju nema vie sjecita od kontrolnog poligona).
3. Krivulja nema svojstvo lokalnog nadzora. Naime, ukoliko pomaknemo samo jednu
toku kojom smo zadali krivulju, cijela e krivulja promijeniti oblik. Poeljno bi bilo
kada bi se krivulja promijenila samo u okolici pomaknute toke, no ovo kod
Bezierovih krivulja ne vrijedi.
4. Broj toaka u direktnoj je vezi sa stupnjem krivulje. Npr. krivulja petog stupnja
zadana je pomou etiri kontrolne toke.
5. Neovisnost o afinim transformacijama (translacije, rotacije, skaliranja). Perspektivne
transformacije nisu afine transformacije pa za njih ovo ne vrijedi!
6. Simetrinost. Krivulja ima isti izgled ukoliko kontrolne toke zamijenimo tako da
toka koja je bila prva postane zadnja (i obratno).

10.3 INTERPOLACIJSKA BEZIEROVA KRIVULJA


Interpolacijska krivulja prolazi svim zadanim tokama. Nain crtanja interpolacijskih krivulja
ve je opisan u uvodu, no nee koditi da ponovimo ideju. Zadati emo toke (odnosno radijvektore toaka) kroz koje elimo da krivulja proe za neki parametar t. Zatim emo na
temelju tih toaka izraunati kontrolne toke aproksimacijske krivulje, koja e proi kroz nae
traene toke.
Problem se openito moe zapisati ovako. Zadani su radij-vektori:

SKRIPTA IZ RAUNALNE GRAFIKE

83

r
r
r
r
p 0 (t 0 ), p1 (t1 ),..., pi (t i ),..., p n (t n )
Kako je krivulja zadana sa n+1 radij-vektorom, krivulja je n-tog stupnja. Za opis krivulje
koristiti emo Bezierove teinske funkcije. Neka je kontrolni poligon aproksimacijske
r
r
krivulje zadan vektorima a 0 ,..., a n . Tada je svaka toka aproksimacijske krivulje dana
sumom:
n
r
r
p(t ) = ai f i ,n (t )
i =0

U tom sluaju postaviti emo jednostavan zahtjev: obzirom na zadane radij-vektore


zahtijevati emo da vrijedi:
n
r
r
r
p(t i ) = a j f j ,n (t i ) = pi (t i )
j =0

r
Odnosno traimo da krivulja za zadane ti proe kroz zadane pi . Ovo se moe zapisati i
matrino:

f 0,n (t 0 )
r
p0
M = f 0,n (t1 )
r M
p n
f 0,n (t n )

M
O
f1,n (t n ) L

P=FA

A = F 1 P

f1,n (t 0 ) L
f1,n (t1 ) L

f n ,n (t 0 ) r
a
f n ,n (t1 ) 0
M
M r
a
f n ,n (t n ) n

r
Iz ovih jednadbi potrebno je odrediti matricu A. Nakon toga su nam poznati svi vektori ai te
se iz njih moe direktno crtati krivulja, ili se mogu izraunati radij-vektori toaka kontrolnog
poligona aproksimacijske krivulje i zatim crtati krivulju pomou Bernsteinovih teinskih
funkcija.
Vrlo esto se u praksi zadaju samo toke kroz koje elimo provui krivulju, ali se pri tome ne
specificira za koju vrijednost parametra t krivulja mora proi kroz koju toku. Tada se za
parametar moe odabrati i vrlo jednostavan oblik:
ti =

i
n

pa se prethodni matrini raun pojednostavljuje:

SKRIPTA IZ RAUNALNE GRAFIKE

1
r
p
0 1
M =
r M
p n
1

P=FA

84

L
0
1
1 r
f1,n ( ) L f n ,n ( ) a 0
n
n M
M
O
M r
n
n a
f1,n ( ) L f n ,n ( ) n
n
n
1
A = F P
0

Kao primjer moemo uzeti krivulju treeg stupnja koju elimo provui kroz etiri toke:
r r r r
p0 , p1 , p 2 , p3 . Budui da vrijednosti parametara nisu zadane, uzeti emo parametre prema
relaciji:
i
ti =
n
te dobivamo:
r
r 0
r
r 1
r
r 2
r
r 3
p 0 = p , p1 = p ,
p 2 = p ,
p 3 = p
3
3
3
3
Bezierove teinske funkcije za krivulju treeg reda glase:

f 0,3 (t ) = 1
f1,3 (t ) = 3 t 3 t 2 + t 3
f 2,3 (t ) = 3 t 2 2 t 3
f 3,3 (t ) = t 3
Uvrstimo li ovo u matricu, dobivamo:
r
1
p0
pr 1
r1 =
p 2 1
r
p3 1

P=FA

0
19
27
26
27
1

0 r
1 ar0

27 a1
8 ar
2

27 ar
1 3
A = F 1 P

0
7
27
20
27
1

Rjeenje za matricu A glasi:


0
0
0
18
33 54 27

6
1
P
A =
18 21 81 81 21

6 27 54 33
odnosno po komponentama:

SKRIPTA IZ RAUNALNE GRAFIKE

85

r
r
0
0
0 p0
a0
18
r
ar

6 p1
r1 = 1 33 54 27
r
a 2 18 21 81 81 21 p 2
r

r
6 27 54 33 p3
a3
Sada kada smo izraunali traene vektore, jednadba aproksimacijske Bezierove krivulje
(koja je interpolacijska obzirom na zadane toke) glasi:

n
3
r
r
r
r
r
r
r
p(t ) = ai f i ,n (t ) == ai f i ,3 (t ) = 1 a 0 + 3 t 3 t 2 + t 3 a1 + 3 t 2 2 t 3 a 2 + t 3 a3
i =0

i =0

U ovom primjeru bile su zadane n+1 toka. No interpolacijska se krivulja moe provlaiti i na
temelju drugih podataka. Za izraun aproksimacijske krivulje potrebno nam je n+1 uvjet.
Neki od naina zadavanja su slijedei:

n+1 poznata toka (kao u primjeru)


n poznatih toaka i poznata tangenta u nekoj od toaka (obino prva ili zadnja toka)

Mogue je raunati krivulju i na temelju poznavanja viih derivacija i sl.

SKRIPTA IZ RAUNALNE GRAFIKE

11. PRIKAZ
FUNKCIJA

86

KRIVULJA

POMOU

RAZLOMLJENIH

11.1. UVOD
Jedan od naina zapisivanja krivulja jest pomou razlomljenih funkcija. Pri tome se krivulje
zapravo opisuju parametarski uz jedan parametar t, u homogenom prostoru, a svaka
koordinata toke polinomna funkcija parametra t. Kako emo krivulje opisivati openito u 3D
prostoru, svaka toka TK imati e svoje tri koordinate TK,1 ili x, TK,2 ili y i TK,3 ili z u radnom
prostoru, odnosno naziv TKh i etiri koordinate TKh,1, TKh,2, TKh,3 i TKh,h u homogenom
prostoru.

11.2. PRIKAZ POMOU KVADRATNIH RAZLOMLJENIH FUNKCIJA


Ove funkcije omoguavaju jednostavan prikaz koninih krivulja (krivulje koje nastaju kao
presjecite stoca i ravnine, npr. krunice, elipse i sl.). Kako je rije o kvadratnih funkcijama,
funkcijske ovisnosti svih koordinata u homogenom prostoru biti e izraene kvadratnim
polinomom:
TKh ,1 = a1 t 2 + b1 t + c1
TKh , 2 = a 2 t 2 + b2 t + c 2
TKh ,3 = a3 t 2 + b3 t + c3
TKh ,h = a t 2 + b t + c

Povratkom u radni prostor dobiva se:


a t 2 + b t + c1
TK ,1 = x = 1 2 1
a t + bt + c
a 2 t 2 + b2 t + c 2
TK , 2 = y =
a t2 + bt + c
a t 2 + b t + c3
TK , 3 = z = 3 2 3
a t + bt + c
Razlog za naziv "razlomljene kvadratne" funkcije trebao bi biti jasan iz prethodnih jednadbi.
Zadrimo li se u homogenom prostoru, tada se jednadbe po koordinatama mogu spojiti u
jedan matrini zapis:

TKh = [TKh ,1 TKh , 2

TKh ,3 TKh ,h ] = t

a1 a 2
t 1 b1 b2
c1 c 2

Matrica K naziva se karakteristina matrica krivulje.

a3 a
b3 b = t 2
c3 c

t 1 K

SKRIPTA IZ RAUNALNE GRAFIKE

87

Za odreivanje matrice K dovoljno je poznavati tri toke kroz koje krivulja mora proi. Npr.
neka proe kroz toku TA za t=t1=0, kroz toku TB za t=t2=0.5, i kroz toku TC za t=t3=1.
Tada vrijedi:

T Ah = [T Ah ,1 T Ah , 2
TBh = [TBh ,1 TBh , 2

TCh = [TCh ,1 TCh , 2

[
] = [t
] = [t

T Ah ,3

T Ah ,h ] = t12

TBh ,3

TBh ,h

TCh ,3

TCh ,h

]
1] K
1] K

t1 1 K

2
2

t2

2
3

t3

Zapiemo li ovo pomou jedne matrice, dobivamo:

T Ah T Ah ,1 T Ah , 2
T = T
Bh Bh ,1 TBh , 2
TCh TCh ,1 TCh , 2

T Ah ,3
TBh ,3
TCh ,3

T Ah ,h t12 t1 1


TBh ,h = t 22 t 2 1 K
TCh ,h t 32 t 3 1

Da bismo odredili matricu K, cijelu jednadbu potrebno je pomnoiti sa inverznom matricom


koeficijenata i to sa lijeve strane:
1

t12 t1 1 T Ah t12 t1 1 T Ah ,1 T Ah , 2

K = t 22 t 2 1 TBh = t 22 t 2 1 TBh ,1 TBh , 2


t 32 t 3 1 TCh t 32 t 3 1 TCh ,1 TCh , 2

T Ah ,3 T Ah ,h

TBh ,3 TBh ,h
TCh ,3 TCh ,h

Uvrstimo li zadane t-ove u izraz, dobiva se:


1

0 2 0 1 T Ah 2 4 2 T Ah

K = 0.5 2 0.5 1 TBh = 3 4 1 TBh


12 1 1 TCh 1 0 0 TCh

Zadamo li sada i toke TA, TB i TC, moe se matrica K odrediti u potpunosti.

11.3. PARAMETARSKE DERIVACIJE U HOMOGENOM PROSTORU


Svim koordinatama definirali smo funkcijsku ovisnost o parametru t. U ovom sluaju ta je
funkcijska ovisnost definirana kvadratnim polinomom. No to znai da se te funkcije daju i
derivirati! Pa pogledajmo kako bi izgledala prva derivacija po parametru t. Funkcijske
ovisnost koordinata definirane su relacijama:
TKh ,1 = a1 t 2 + b1 t + c1
TKh , 2 = a 2 t 2 + b2 t + c 2
TKh ,3 = a3 t 2 + b3 t + c3
TKh ,h = a t 2 + b t + c

SKRIPTA IZ RAUNALNE GRAFIKE

88

Deriviranjem svake relacije po t dobiva se:


dTKh ,1

= a1 2t + b1

dt
dTKh , 2

= a 2 2t + b2

dt
dTKh ,3

= a3 2t + b3

dt
dTKh ,h

= a 2t + b

dt

Oznaimo li derivaciju u toki TKh po parametru t oznakom T'Kh tada moemo derivaciju
raspisati po komponentama u matrinom obliku:

'
Kh

= T

'
Kh ,1

'
Kh , 2

'
Kh , 3

'
Kh , h

a1 a 2
= [2t 1 0] b1 b2
c1 c 2

a3 a
b3 b = [2t 1 0] K
c3 c

Moda da jo jednom naglasim to predstavlja oznaka T'Kh. To nije derivacija toke, jer toku
(oito) ne moemo derivirati (barem se nadam da je svima jasno da se ureeni par od etiri
fiksna zadana broja ne moe derivirati...). Oznakom T'Kh oznaili smo derivaciju funkcija
kojima su definirane ovisnosti o parametru t u nekoj proizvoljnoj toki TKh. Kako tih funkcija
ima etiri, tako je i struktura T'Kh etverokomponentni vektor.
Drugu derivaciju dobivamo deriviranjem prve derivacije; dobiva se:

d 2TKh ,1
dt 2
d 2TKh , 2
dt 2
2
d TKh ,3
dt 2
d 2TKh ,h
dt 2

= a1 2
= a2 2
= a3 2
= a2

ili matrino zapisano:

''
TKh'' = TKh
TKh'' , 2
,1

TKh'' ,3

Sve vie derivacije daju:

a1 a 2
TKh'' ,h = [2 0 0] b1 b2
c1 c 2

a3 a
b3 b = [2 0 0] K
c3 c

SKRIPTA IZ RAUNALNE GRAFIKE


d nTKh ,1
n

dt
d nTKh , 2
dt n
d nTKh ,3
dt n
d TKh ,h
n

dt n

= 0

= 0

= 0

= 0

89

n>2

odnosno matrino:

(n)
Kh

= [T

(n)
Kh ,1

(n)
Kh , 2

(n)
Kh , 3

(n)
Kh , h

] = [0

a1 a 2
0 0] b1 b2
c1 c 2

a3
b3
c3

a
b = [0 0 0] K , n > 2
c

Iz ovog jednostavnog izvoda jasno se vidi da su sve derivacije odreene upravo


karakteristinom matricom krivulje K. Takoer se vidi da se sve derivacije mogu direktno
dobiti samo deriviranjem elemenata matrice parametra t. Tako smo krenuli od:

TKh = t 2

t 1 K

Prva derivacija je bila:


'
TKh
= [2t 1 0] K
Druga derivacija:
TKh'' = [2 0 0] K
I sve ostale vie:
TKh(n ) = [0 0 0] K

11.4. PRIKAZ POMOU KUBNIH RAZLOMLJENIH FUNKCIJA


Ove funkcije omoguavaju jednostavan prikaz koninih krivulja (krivulje koje nastaju kao
presjecite stoca i ravnine, npr. krunice, elipse i sl.), no moe dati i infleksije to kvadratne
razlomljene funkcije nisu mogle. Kako je rije o kubnim funkcijama, funkcijske ovisnosti
svih koordinata u homogenom prostoru biti e izraene kubnim polinomom:
TKh ,1 = a1 t 3 + b1 t 2 + c1 t + d1
TKh , 2 = a 2 t 3 + b2 t 2 + c 2 t + d 2
TKh ,3 = a3 t 3 + b3 t 2 + c3 t + d 3
TKh ,h = a t 3 + b t 2 + c t + d

SKRIPTA IZ RAUNALNE GRAFIKE

90

Povratkom u radni prostor dobiva se:


a t 3 + b t 2 + c1 t + d1
TK ,1 = x = 1 3 1 2
a t + bt + c t + d
a t 3 + b t 2 + c2 t + d 2
TK , 2 = y = 2 3 2 2
a t + bt + c t + d
a3 t 3 + b3 t 2 + c3 t + d 3
TK , 3 = z =
a t3 + b t2 + c t + d
Jednadbe dane za homogenih prostor opet vode na matrini zapis:
a1 a 2 a3 a
b b b b
2
3
= t3 t2 t 1 A
TKh = t 3 t 2 t 1 1
c1 c 2 c3 c

d1 d 2 d 3 d

gdje je A karakteristina matrica krivulje.

11.5. PARAMETARSKE DERIVACIJE U HOMOGENOM PROSTORU


U ovom su sluaju sve funkcijske ovisnosti kubne:
TKh ,1 = a1 t 3 + b1 t 2 + c1 t + d1
TKh , 2 = a 2 t 3 + b2 t 2 + c 2 t + d 2
TKh ,3 = a3 t 3 + b3 t 2 + c3 t + d 3
TKh ,h = a t 3 + b t 2 + c t + d
Deriviranjem po parametru t dobiva se:
dTKh ,1

= a1 3t 2 + b1 2t + c1

dt
dTKh , 2

= a 2 3t 2 + b2 2t + c 2

dt
dTKh ,3

= a3 3t 2 + b3 2t + c3

dt
dTKh ,h

= a 3t 2 + b 2t + c

dt

to se matrino moe zapisati kao:

TKh' = TKh' ,1 TKh' , 2

] [

TKh' ,3 TKh' ,h = 3t 2

Vie derivacije iznose:

2t 1 0 A

SKRIPTA IZ RAUNALNE GRAFIKE

[
= [T
= [T

''
TKh'' = TKh
TKh'' , 2
,1

'''
Kh

(n)
Kh

'''
Kh ,1
(n)
Kh ,1

'''
Kh , 2

(n)
Kh , 2

'''
Kh , 3

]
] = [6
] = [0

TKh'' ,h = [6t

TKh'' ,3

(n)
Kh , 3

'''
Kh , h

(n)
Kh , h

91

2 0 0] A

0 0 0] A

0 0 0] A , n > 3

11.6. VEZA IZMEU PARAMETARSKIH DERIVACIJA U RADNOM I


HOMOGENOM PROSTORU
Veza izmeu radnih i homogenih koordinata ve nam je poznata:
TKh ,1
TKh , 2
TKh ,3
TK ,1 =
TK , 2 =
TK , 3 =
TKh ,h
TKh ,h
TKh ,h
gdje je TK toka u radnom prostoru, a TKh toka u homogenom prostoru. Ovu ovisnost
moemo i krae zapisati matrino:

TKh = TKh ,h [TK ,1 TK , 2

TK ,3 1] = TKh ,h [TK

1]

Pretpostavimo da su nam poznate parametarske derivacije koordinata u radnom prostoru,


odnosno da znamo:
TK' ,1

dTK ,1
dt

TK' , 2

dTK , 2
dt

TK' ,3

dTK ,3
dt

te da znamo funkciju kojom emo vriti prebacivanje u homogeni prostor TKh,h i njezinu
derivaciju T'Kh,h.
Kako vrijede veze:
TKh ,1 = TK ,1 TKh ,h

TKh , 2 = TK , 2 TKh ,h

TKh ,3 = TK ,3 TKh ,h

parametarske derivacije u homogenom prostoru mogu se prikazati:


TKh' ,1 = (TK ,1 TKh ,h ) ' = TK' ,1 TKh ,h + TK ,1 TKh' ,h
TKh' , 2 = (TK , 2 TKh ,h ) ' = TK' , 2 TKh ,h + TK , 2 TKh' ,h
'
TKh' ,3 = (TK ,3 TKh ,h ) ' = TK' ,3 TKh ,h + TK ,3 TKh
,h

Zapisano matrino dobije se:

TKh' = TKh' ,1 TKh' , 2

= TK' ,1 TKh ,h + TK ,1 TKh' ,h

= TKh' ,h

TKh' ,3 TKh' ,h =
TK' , 2 TKh ,h + TK , 2 TKh' ,h

TK ,1 TK , 2 TK ,3 1
'
TKh ,h '
= TKh ,h
'
'
TK ,1 TK , 2 TK ,3 0

TK' ,3 TKh ,h + TK ,3 TKh' ,h

T
TKh ,h K'
TK

1
0

TKh' ,h =

SKRIPTA IZ RAUNALNE GRAFIKE

92

Na ovaj nain dobili smo direktnu vezu izmeu traenih parametarskih derivacija u
homogenom prostoru i poznatih parametarskih derivacija u radnom prostoru.
Druga parametarska derivacija u homogenom prostoru dobije se deriviranjem prve
parametarske derivacije u homogenom prostoru; nakon to se deriviraju izrazi i nakon
ubacivanja u matricu dobiva se:

TKh'' = TKh'' ,1 TKh'' , 2

TKh'' ,3 TKh'' ,h =

= (TK' ,1 TKh ,h + TK ,1 TKh' ,h ) '

= T

''
Kh , h

2 T

'
Kh , h

TKh ,h

(TK' , 2 TKh ,h + TK , 2 TKh' ,h ) '

TK ,1 TK , 2 TK ,3 1

TK' ,1 TK' , 2 TK' ,3 0 = TKh'' ,h


TK'' ,1 TK'' , 2 TK'' ,3 0

(TK' ,3 TKh ,h + TK ,3 TKh' ,h ) '

2 T

'
Kh , h

TKh ,h

TK
TK'
TK''

TKh'' ,h =

1
0
0

I vie derivacije mogu se izvesti na slian nain.

11.7. PRIMJERI
Pomou razlomljene kvadratne funkcije elimo odrediti krivulju koja e prolaziti slijedeim
tokama:

za t=t1=0 kroz toku [R 0 0 1]


za t=t2=0.5 kroz toku [0 R 0 1]
za t=t2=1 kroz toku [-R 0 0 1]

Na prvi pogled popis toaka odgovara krunici, no pogledajmo to emo dobiti. U poglavlju
11.2. pokazano je kako se na temelju ovih podataka rauna matrica K. Dobiva se:
4R
2 4 2 R 0 0 1 0
K = 3 4 1 0 R 0 1 = 2 R 4 R
1
0
0 R 0 0 1 R
0

0
0
0

0
0
1

Posljednji stupac (0 0 1)T nam govori da je rije o paraboli, a ne o koninoj krivulji. Sve
konine krivulje imaju posljednji stupac jednak (1 0 1)T.
Svaka toka ove nae krivulje odreena je jednostavnom relacijom:
4R
0
0
0

2
2
TKh = t t 1 K = t t 1 2 R 4 R
0
0
R
0
0
1

Ukoliko elimo prikazati krunicu, morati emo se posluiti trikom. Znamo da kod krunice
vrijedi veza:

SKRIPTA IZ RAUNALNE GRAFIKE

93

x = R cos
y = R sin
Iz matematike znamo i vezu izmeu funkcija sin i cos sa funkcijom tg. Primjenimo li tu vezu,
dobivamo:
t = tg

x=R

1 t2
1+ t2

y=R

2t
1+ t2

Uzmemo li nazivnik razlomaka za funkciju homogenog parametra, dobiva se:

TKh = t

R 0 0 1
t 1 0 2 R 0 0
R
0 0 1

odnosno matrica K iznosi:


R 0 0 1
K = 0 2 R 0 0
R
0 0 1
Zadnji stupac nam govori da smo dobili koninu krivulju.

11.8. ODREIVANJE MATRICE A


U nastavku emo odrediti matricu A za krivulju koja je zadana pomou poetne i zavrne
toke u radnom prostoru, te prve derivacije u tim tokama; poetna toka dobiva se za
parametar t=t0=0 dok se zavrna toka dobiva se za parametar t=t1=1. Dakle, poznato nam je
slijedee:
t = t 0 = 0 T0 = [T0,1 T0, 2
t = t1 = 1 T1 = [T1,1 T1, 2

[
= [T

T0,3 ]

T1,3 ]

t = t 0 = 0 T0' = T0',1 T0', 2

T0',3

t = t1 = 1 T

'
1, 3

'
1

'
1,1

'
1, 2

Kako prva toka lei na krivulji, tada zadovoljava jednadbu krivulje. Zato moemo pisati:
T0 h = [T0 h ,1 T0 h ,h

T0 h , 2 T0 h ,h

T0 h ,3 T0 h ,h

T0 h ,h ] = t 03

t 02

t0 1 A

Ovo se krae moe zapisati saimanjem prva tri stupa u jedan, u kojem emo tada pisati
trokomponentnu toku radnog prostora (ime dimenzija matrice ostaje ouvana):
T0 h = [T0 T0 h ,h

T0 h ,h ] = t 03

t 02

t0 1 A

SKRIPTA IZ RAUNALNE GRAFIKE

94

Za prvu derivaciju u homogenom prostoru u poglavlju 11.6. smo izveli vezu sa derivacijom u
radnom prostoru:

] [

T0'h = T0' T0 h ,h + T0 T0'h ,h

T0'h ,h = 3t 02

2t 0 1 0

Slino se moe pisati i za drugu toku, te se dobiju etiri jednadbe:


T0 h = [T0 T0 h ,h T0 h ,h ] = t 03 t 02 t 0 1 A
T1h = [T1 T1h ,h

[
= [T

T1h ,h ] = t

3
1

T0'h = T0' T0 h ,h + T0 T0'h ,h


'
1h

'
1

T1h ,h + T1 T

'
1h , h

2
1

t1 1 A

] [
] = [3t

T0'h ,h = 3t 02
'
1h , h

2t 0 1 0

2
1

2t1 1 0

Sustav se moe zapisati kao jedna povea matrica, te se dobiva:


T0 T0 h ,h

T1 T1h ,h

'
T0 T0 h ,h + T0 T0'h ,h
'
'
T1 T1h ,h + T1 T1h ,h

T0 h ,h t 03
T1h ,h t13
=
T0'h ,h 3t 02

T1'h ,h 3t12

t 02
t12

t0
t1

2t 0
2t1

1
1

1
A
0

Matricu na desnoj strani oznaiti emo oznakom B (matrica parametara). Uvrtavanjem


vrijednosti za parametre dobiva se:
0
1
B=
0

0 0 1
1 1 1
0 1 0

2 1 0

Matricu na lijevoj strani prethodne jednadbe moemo malo preurediti tako da je napiemo
kao umnoak dviju matrica, kako slijedi:
T0 T0 h ,h

T1 T1h ,h

'
T0 T0 h ,h + T0 T0'h ,h
'
'
T1 T1h ,h + T1 T1h ,h

T0 h ,h T0 h ,h
T1h ,h 0
=
T0'h ,h T0'h ,h

T1'h ,h 0

T1h ,h
0
T1'h ,h

0
T0 h ,h
0

0 T0
0 T1

0 T0'

T1h ,h T1'

1
1
= HV
0

Prva matrica u umnoku naziva se matrica H (matrica ovisna samo o homogenom parametru i
funkciji po kojoj se on mijenja), dok se druga matrica naziva matrica V (i ona je ovisna samo
o zadanim tokama i derivacijama u njima). Sada se poetna jednadba moe pisati:
HV = BA

Za matricu A se dobiva:

A = B 1 H V = M H V

SKRIPTA IZ RAUNALNE GRAFIKE

95

Matrica M naziva se univerzalna transformacijska matrica i jednaka je inverzu matrice B.


Kako smo matricu B ve odredili, matrica M iznosi:

M = B 1

0 0 1
1 1 1
0 1 0

2 1 0

0
1
=
0

1
2 2 1
3 3 2 1

=
0
0
1
0

0
0
0
1

Ukoliko su nam poznate toke krivulje i derivacije u njima (V), te homogeni parametri i
njihove derivacije za obje toke (H), na temelju izvedene relacije moemo odrediti matricu A
kao umnoak univerzalne transformacijske matrice, matrice homogenog parametra i matrice
toaka.

11.9. HERMITOVA KRIVULJA


Hermitova krivulja specijalan je sluaj kubne razlomljene krivulje, po tome to funkcija po
kojoj se mijenja homogeni parametar nije kubna, ve je konstanta i iznosi 1. Drugim rijeima,
za toku krivulje TKh u homogenom prostoru vrijedi:

TKh ,1 = P3 (t )

TKh , 2 = Q3 (t )

TKh ,3 = R3 (t )

TKh ,h = 1

gdje su P, Q i R polinomi po varijabli t.


Iskoristimo sada izraz za matricu A:
A = MHV

Matrica M je poznata, matricu V lako odredimo ako znamo dvije toke i derivacije u njima.
Ostaje nam jo matrica H. Ona u sebi sadri homogene parametre (koji su u ovom sluaju za
sve toke jednaki 1 - Hermitova krivulja!), i njihove derivacije. Kako su funkcije homogenih
parametara konstante, njihova je derivacije 0! Time matrica H postaje jedinina!

T0 h ,h
0
H= '
T0 h ,h

0
T1h ,h
0
'
1h , h

0
0
T0 h ,h
0

0 1
0 0
=
0 0

T1h ,h 0

0 0 0
1 0 0
=I
0 1 0

0 0 1

Izmeu Hermitove krivulje i Bezierove krivulje za kubni sluaj postoji veza! Ve smo rekli da
Hermitova krivulje definira da je svim tokama homogeni parametar jednak jedan. To znai
da su prve tri homogene koordinate jednake radnim koordinatama. U tom je sluaju za
prelazak iz homogenih u radne koordinate dovoljno u izrazu
A = MV

matricu V zamijeniti samo s njena prva tri stupca. Dobije se:

SKRIPTA IZ RAUNALNE GRAFIKE

r
p(t ) = t 3

r
p0
pr
t 1 M r 1' = t 3
p0
r'
p1

t2

t2

96
1 3 3
3 6 3
t 1
3 3
0

0
0
1

r
1 r0
r
0 r1
r
0 r2
r
0 r3

Lijeva strana jednadbe dolazi od Hermitove krivulje; desna strana jednadbe je Bezierova
krivulja! Zakljuak je da to mogu biti iste krivulje! Pri tome se Hermitova krivulja zadaje
poetnom i krajnjom tokom i derivacijama u njima, dok se Bezierova krivulja zadaje preko
etiri toke: poetnu, dvije kontrolne i zavrnu.

11.10. ODREIVANJE MATRICE A - PRIMJER


Zadano je slijedee:
T0 = [0 0 0 1]

t = t0 = 0

T1 = [1 0 0 1]

t = t1 = 1

T = [1 1 0 0]
'
0

T = [1 1 0 0]

t = t0 = 0
t = t1 = 1

'
1

Treba odrediti matricu A. Za matricu A smo izveli izraz:


A = MHV

M je poznato:
1
2 2 1
3 3 2 1

M=
0
0
1
0

0
0
0
1
H moemo odrediti:
T0 h ,h
0
H= '
T0 h ,h

0
T1h ,h
0
'
1h , h

0
0
T0 h ,h
0

0 1
0 0
=
0 a

T1h ,h 0

0 0 0
1 0 0
0 1 0

b 0 1

Otkuda sada a i b? Poznavanje iznosa homogenog parametra u nekoj toci ne govori nam
nita o derivaciji u toj toci! Da bismo znali derivaciju, moramo znati funkciju po kojoj se
mijenja homogeni parametar! Zato ostavljamo dvije nepoznanice: a i b koje emo izraunati
kasnije.
Matrica V nam je takoer poznata:

SKRIPTA IZ RAUNALNE GRAFIKE

T0
T
V = 1'
T0
'
T1

1 0 0
1 1 0
=
0 1 1

0 1 1

97

0 1
0 1
0 0

0 0

Mnoenjem ove tri matrice dobiva se:

A = MHV =

b
1

1
1

0
0

a+b
2a b
a

No da bismo odredili matricu A jednoznano, vidimo da nam nedostaje jo jedan uvjet. Tako
moemo traiti slijedee: neka krivulja za t=t2=1/2 proe kroz toku radnog prostora (1/2 1/2
0). Ovaj podatak pomoi e nam da odredimo traenu matricu. Ali raunu treba pristupiti
oprezno! Zadali smo si toku u radnom prostoru i traimo da krivulja proe kroz nju. No
jednadba krivulje daje sve toke u homogenom prostoru! I to za svaku toku radnog prostora
daje samo jednu toku homogenog prostora (iako tih toaka za svaku toku radnog prostora
ima beskonano). Ukoliko ovu injenicu ignoriramo, mogli bismo rei slijedee: toka lei na
krivulji, pa vrijedi:
1
2

1
2

0 1 = t 23

t 22

t2 1 A

tj.
a+b
0
0
b
b
1
2a b
0
1 1
1 1 1
=

0
1
1
2 2
8 4 2 1
a
1
0

0
0
1
0
Ovaj sustav predstavlja etiri jednadbe sa etiri nepoznanice, i pri tome je nerjeiv (zapravo,
rjeiv je: rjeenje ne postoji). Naime, ve izjednaavanjem po drugoj komponenti dobiva se:
1
1 1 1
= + =
2
4 2 4
to je oito besmisleno. Jedno od loih tumaenja ovog rjeenja je da krivulja jednostavno ne
moe proi kroz tu toku uz zadane parametre. I ovo je mjesto na kojem treba razmisliti.
Krivulja (oito) ne moe proi kroz tu toku homogenog prostora, no moe li moda proi
kroz neku drugu toku homogenog prostora a da pri tome prolazi kroz istu toku radnog
prostora? Odgovor na ovo je potvrdan! Naime, sustav je ispravno napisati i rjeavati po
komponentama samo ukoliko su sve komponente u potpunosti nezavisne - to ovdje nisu. Da
bismo dobili nae rjeenje, potrebno je primijeniti zavisnosti koje znamo i raditi jednaenje po
stvarno-nezavisnim komponentama: komponentama radnog prostora! Tada emo dobiti
sustave:

SKRIPTA IZ RAUNALNE GRAFIKE

1
1
1
b b+
8
4
2
=
1
1
(a + b ) + ( 2a b ) + 1 a + 1
8
4
2
1 1
+
4 2
=
1
1
1
(a + b ) + ( 2a b ) + a + 1
8
4
2
0
=
1
(a + b ) + 1 ( 2a b ) + 1 a + 1
8
4
2

98

1
2
1
1
2
1
0
1

Sada umjesto etiri "nezavisne" jednadbe imamo samo tri, i to rjeive. Trea jednadba je
identitet pa otpada. Prve dvije daju:
b+4
1
=
ab+8 2

2
1
=
ab+8 2

a = 2
b=2
Traena matrica A glasi:
2
2
A=
1

1
1

0
0

0
2
2

Ostalo nam je jo da pogledamo kroz koju je toku homogenog prostora krivulja prola za
traenu toku radnog prostora:

1
TKh =
2

1

2

1 2
1
2 1

1
1

0
0

0
2 1
=
2 4

a odgovarajua toka radnog prostora je doista traena:


1

TK = 4
1
2

1
4
1
2

0 1
=
1 2
2

1
2

1
4

1
2

SKRIPTA IZ RAUNALNE GRAFIKE

99

12. 2D TRANSFORMACIJE
12.1. UVOD
Postoji nekoliko elementarnih transformacija koje djeluju nad tokom. Ukoliko se ta toka
nalazi u 2D prostoru, tada govorimo o 2D transformacijama. U nastavku emo obraditi
slijedee elementarne transformacije:

Translacija
Rotacija
Skaliranje
Smik

Pri tome emo uvijek koristiti toke u homogenom prostoru, te u matrinom obliku. Svaku
elementarnu transformaciju predstavlja operator koji emo predstaviti kvadratnom matricom.
U 2D prostoru ovi operatori imaju kvadratne matrice reda 3, budui da se toke zapisuju kao
jednoretane matrice sa tri stupca (x, y i h). Djelovanje operatora na toku dobiva se
mnoenjem matrice toke i matrice operatora:
Th' = Th
gdje je matrica operatora.
Budui da se djelovanje operatora opisuje matrinim mnoenjem, lako se moe doi do
slijedeeg zakljuka: ukoliko na jednu toku djeluje vie transformacija, tada je bitan
redoslijed djelovanja transformacija! Dokaz ove tvrdnje je trivijalan. Naime, matrino
mnoenje nije komutativno pa se za razliite redoslijede mnoenja matrica dobivaju razliiti
rezultati.
Djelovanje vie transformacija moe se zapisati:
Th' = Th 1 2 K n = Th '
' = 1 2 K n
pri emu na toku prvo djeluje operator 1, pa 2 itd.
Postoji i jedna iznimka za gornje pravilo: unutar jedne vrste transformacija, redoslijed
djelovanja pojedine transformacije nije bitan! Ovo se moe i matematiki dokazati, no
ostanimo na logikom dokazu: rotiramo li toku za kut pa za kut , dobiti emo isti rezultat
kao i da rotiramo toku najprije za kut pa onda za kut .

SKRIPTA IZ RAUNALNE GRAFIKE

100

12.2. TRANSLACIJA
Translacija je transformacija koja svakoj komponenti toke u radnom prostoru dodaje
odreeni pomak. Primjer translacije prikazan je na slici 12.2.1. Toka T translatira se u toku
T'.
y
T'

y'

y
y

T
x
x

x'

12.2.1.

Postupak translacije moe se opisati slijedeim jednadbama u radnom prostoru:


T1' = T1 + 1
T2' = T2 + 2
gdje su T1 i T2 komponente toke T a T1' i T2' komponente toke T'. Iskoristimo li vezu
izmeu radnih i homogenih koordinata
Th ,1
Th , 2
T1 =
T2 =
Th ,h
Th ,h
dobiva se:
Th',1 = Th ,1 + 1 Th ,h
Th', 2 = Th , 2 + 2 Th ,h
pri emu su Th,i komponente homogenog zapisa toke T (odnosno tada Th), dok je Th,h
homogeni parametar.
Prethodne relacije pokazuju da se toka T'h moe dobiti matrinim mnoenjem toke Th sa
operatorom translacije:
0
0
1

'
'
'
1
0
Th ,1 Th , 2 Th ,h = [Th ,1 Th , 2 Th ,h ] 0
1 2 1

pa se operator translacije zapisuje:

SKRIPTA IZ RAUNALNE GRAFIKE

1
tr = 0
1

101

0
0
1

0
1
2

Inverzni operator ovom operatoru je operator translacije za negativan pomak:


1
tr1 = 0
1
jer vrijedi:

0
1
2

0
0
1

1 0 0
tr tr1 = tr1 tr = 0 1 0
0 0 1

12.3. ROTACIJA
Rotacija je translacija koja toku rotira oko ishodita za zadani kut . Smjer rotacije moe biti
podudaran sa smjerom kazaljke na satu, ili suprotan od smjera kazaljke na satu. Kako je
matematiki "pozitivan" smjer rotacije definiran kao smjer suprotan od smjera kazaljke na
satu, tako e u nastavku biti izveden operator koji rotira toku u smjeru suprotnom od
kazaljke na satu. Ukoliko se eli rotirati u smjeru kazaljke na satu, dovoljno je umjesto kuta
rotirati za smjer -. Primjer rotacije prikazan je na slici 12.3.1.
y
T'

12.3.1.

Da bismo izveli matricu operatora rotacije, potrebno se je prisjetiti linearne algebre, gdje smo
nauili da se djelovanje operatora moe zapisati kao zbroj djelovanja operatora na svaku
komponentu baze prostora pojedinano (naravno, ako operator zadovoljava odreene uvjete

SKRIPTA IZ RAUNALNE GRAFIKE

102

koji su ovdje zadovoljeni). Budui da izvodimo rotaciju u ravnini, imamo dvije komponente
baze: komponentu u smjeru osi x, i komponentu u smjeru osi y. Djelovanje operatora na te
dvije komponente prikazano je na slici 12.3.2.
y

y
y' y y' x

x' y

x' x

a) Utjecaj rotacije na x koordinatu

b) Utjecaj rotacije na y koordinatu

12.3.2.

Pogledajmo najprije sliku 12.3.2.a. Ako toku koja lei na osi x zarotiramo za kut , dobiti
emo toku ija je x'x koordinata jednaka x x' = x cos . Ako toku koja lei na osi y
zarotiramo za kut , dobiti emo toku ija je x'y koordinata jednaka: x 'y = y sin . Tada je
djelovanje operatora na toku daje x' komponentu jednaku sumi ova dva djelovanja:
x ' = x cos y sin
Da bismo utvrdili kako se tvori y' komponenta toke, pogledajmo djelovanje operatora opet
na toke (x,0) i (0,y) samo sada pratimo to se dogaa sa y-projekcijama nastalih toaka, kao
to je prikazano na slici 12.3.2.b. Djelovanjem na (x,0) dobiva se y x' = x sin a djelovanjem
na (0,y) dobiva se y 'y = y cos . Ukupno djelovanje daje:
y ' = x sin + y cos
Zapisano u matrinom obliku u homogenim koordinatama dobiva se:
sin
0
cos

'
'
'
Th ,1 Th , 2 Th ,h = [Th ,1 Th , 2 Th ,h ] sin cos
0
0
0
1

pa se operator rotacije zapisuje:


cos
ro = sin
0

sin
cos

0
0

Ukoliko elimo operator koji rotira u smjeru kazaljke na satu, dovoljno je umjesto kuta
rotirati za smjer -, pa se uvrtavanjem u matricu operatora i uzimanjem u obzir parnosti
funkcije cos i neparnosti funkcije sin dobiva operator:

SKRIPTA IZ RAUNALNE GRAFIKE

cos
ro' = sin
0

sin
cos

0
0

103

Koritenjem ovog operatora uz pozitivne vrijednosti kuta dobiti emo rotaciju u smjeru
kazaljke na satu.
Odmah se moe uoiti da se operatori ro i ro' meusobno ponitavaju u djelovanju te su
inverzi jedan drugome. Naime, ako pogledamo operator koji opisuje djelovanje oba operatora,
dobiva se:
1 0 0
'
'
ro ro = ro ro = 0 1 0
0 0 1
iz ega je vidljivo da slijedno djelovanje jednog pa drugog operatora vraa toku u prvobitni
poloaj.

12.4. SKALIRANJE
Skaliranje je transformacija koja "skalira" (rastee ili stee) svaku komponentu toke. Pri
tome je skaliranje svake komponente odreeno faktorom skaliranja, pri emu faktori ne
moraju biti isti za sve komponente. Ukoliko je to sluaj, tada govorimo o neproporcionalnom
skaliranju. Ukoliko su faktori skaliranja jednaki za sve komponente, tada govorimo o
proporcionalnom skaliranju. Primjer skaliranja prikazan je na slici 12.4.1.
y

T'

y'
y

T
x

x'

12.4.1.

Djelovanje operatora po komponentama prikazano je na slici 12.4.2.

SKRIPTA IZ RAUNALNE GRAFIKE

104
y

y'

x'

12.4.2.

Vrijedi:
x ' = k1 x
y ' = k2 y
odnosno prelaskom na homogene koordinate:
k1
T
T
T = [Th ,1 Th , 2 Th ,h ] 0
0
pa se operator skaliranja zapisuje:
k1 0 0
sk = 0 k 2 0
0 0 1

'
h ,1

'
h,2

'
h ,h

0
k2
0

0
0
1

Ukoliko elimo proporcionalno skaliranje, tada e k1 biti jednak k2 to moemo nazvati k, pa


operator poprima oblik:

psk

k 0 0
= 0 k 0
0 0 1

to se jo moe zapisati i u obliku:

SKRIPTA IZ RAUNALNE GRAFIKE

psk

= 0

0
1
0

105

1
k

Inverzni operator operatoru skaliranja je skaliranje recipronim koeficijentima, to za


neproporcionalno skaliranje daje:

1
0
0

k1
1
1

0
sk = 0

k2

0
0
1

a za proporcionalno skaliranje:
1

k 0 0
1 0 0

1
1
1
psk = 0
0 ili psk = 0 1 0
k

0 0 k
0 0 1

ovisno o matrici kojom je vreno proporcionalno skaliranje.

12.5. SMIK
Smik je "uzduna" deformacija ije se djelovanje najbolje vidi sa slike 12.5.1. Sastoji se od
deformacije uzdu osi x i deformacije uzdu osi y te se opisuje kutovima i .
y

12.5.1.

SKRIPTA IZ RAUNALNE GRAFIKE

106

Djelovanje operatora na pojedine osi prikazano je na slici 12.5.2.


y

y, y' y

x' y

y' x
x, x' x

12.5.2.

Za pojedine komponente proizlazi:


x ' = x x' + x 'y = x + y tg
y ' = y 'y + y x' = y + x tg
pa se prelaskom na homogene koordinate dobiva:

[T

'
h ,1

Th', 2

Th',h = [Th ,1 Th , 2

1
Th ,h ] tg
0

tg
1

0
0
1

pa se operator smika zapisuje:


0
1 tg
sm = tg
1
0
0
0
1
Potraimo li inverz ovog operatora iz uvjeta da umnoak operatora smika i inverznog
operatora daje jedininu matricu dobiva se:

1
sm

1
1 tg tg

tg
=
1 tg tg

tg
1 tg tg
1
1 tg tg
0

0
0
1

to nije definirano ukoliko je umnoak tangensa jednak 1.

SKRIPTA IZ RAUNALNE GRAFIKE

107

12.6. PRIMJENA TRANSFORMACIJA


U nastavku emo pokazati jedan jednostavan primjer na kojem se mogu uoiti neki
interesantni detalji. Potrebno je rotirati toku T(5,5) u smjeru suprotnom od smjera kazaljke
na satu za kut oko toke S(3,3). Slika 12.6.1. pokazuje to elimo uiniti. Na slici je
prikazan primjer rotacije za 180.

y
T

=180

2
1
0

T'
1

12.6.1.

Pokuamo li direktno primijeniti operator rotacije, rezultat nee dati oekivani rezultat
(zapravo, ovisi to ste oekivali). Naime, operator rotacije izveden je tako da rotira toku oko
ishodita! elimo li rotirati toku oko nekog drugog sredita, morati emo primijeniti i
operator translacije! Evo koraka koje treba napraviti:
1. Toku T potrebno je translatirati translacijom koja bi toku S (eljeno sredite
rotacije) dovela u ishodite koordinatnog sustava. To e biti translacija za
1 = S1 i 2 = S 2 ako je toka S dana komponentama (S1 S2 1). Nazovimo ovu
tranformaciju 1:

1
1 = 0
S1

0
1
S2

0
0
1

2. Na ovako dobivenu toku moemo primijeniti operator rotacije jer se


sin
0
cos

rotacije nalazi u ishoditu! Tada je 2:


2 = sin cos
0
0
0
1

sada sredite

3. I konano, toku koju smo rotirali moramo natrag translatirati inverznom translacijom
1 0 0
od one iz prvog koraka: 3 = 0 1 0
S1 S 2 1
to se je dogodilo nakon prvog koraka opisuje slika 12.6.2.

SKRIPTA IZ RAUNALNE GRAFIKE

108

=180

T'

1
=180
2

-3

-2

T'

-1 0 S 1
-1

-2
-3

12.6.2.

U svakom koraku dobili smo po jedan operator. Zbirni operator koji e napraviti zadanu
operaciju dobije se kao umnoak sva tri operatora i to upravo redoslijedom kojim su djelovali:
= 1 2 3

Da je ovo ispravno, moemo se lako uvjeriti pokusom. Ako rotiramo toku T za 180 oko
toke S, trebali bismo dobiti toku T'(1,1). Ako izraunamo vrijednost operatora uz zadani kut
dobiti emo:
0
0
0 1 0 0 1 0 0 1 0
1

=0
1
0 0 1 0 0 1 0 = 0 1 0
3 3 1 0
6 1
0 1 3 3 1 6
Primijenimo li operator na toku T(5,5) dobivamo:

[T

'
h ,1

Th', 2

Th',h = [Th ,1 Th , 2

Th ,h ]

0
1 0
Th',h = [5 5 1] 0 1 0 = [1 1 1]
6
6 1
Dakle, dobili smo toku koju smo i oekivali.

[T

'
h ,1

Th', 2

Slian postupak koji je naveden u prethodna tri koraka esto se provodi jer izvedene
elementarne transformacije djeluju obzirom na ishodite, pa treba dobro paziti to se eli
postii, a to transformacije zapravo daju.

SKRIPTA IZ RAUNALNE GRAFIKE

109

13. 3D TRANSFORMACIJE
13.1. UVOD
3D transformacije su transformacije nad tokom u 3D prostoru. U nastavku emo obraditi iste
transformacije koje smo obradili u 2D prostoru. Jedina novost koju donosi 3D prostor su tri
operatora rotacije umjesto jednog u 2D prostoru. Tako emo obraditi:
1.
2.
3.
4.
5.
6.

Translaciju
Rotaciju oko osi x
Rotaciju oko osi y
Rotaciju oko osi z
Skaliranje
Smik

I podsjetimo se jo jednom: redoslijed djelovanja transformacija bitan je za krajnji rezultat,


osim ako se ne radi o uzastopnom djelovanju iste transformacije kada je redoslijed nebitan.
Naravno, rotacija oko osi x i rotacija oko osi y nisu iste transformacije!
U nastavku e biti dati izrazi za ove transformacije, budui da se oni izvode identino kao i
izrazi za 2D transformacije koje smo ve obradili u prethodnom poglavlju.

13.2. TRANSLACIJA
Translacija pomie toku tako da svakoj koordinati toke doda odreeni pomak. Vrijedi:
x ' = x + 1
y' = y + 2
z ' = z + 3
ili nakon prelaska u homogene koordinate:

[T

'
h ,1

Th', 2

Th',3

Th',h = [Th ,1 Th , 2

Th ,3

to daje operator translacije u 3D:


1
0
tr =
0

0
1

0
0

0
2

1
3

0
0
0

Inverz je translacija za negativne pomake:

1
0
Th ,h ]
0

1
0
2

0
1
3

0
0
0

SKRIPTA IZ RAUNALNE GRAFIKE

tr1

1
0
=
0

1
0
2

0
1
3

110

0
0
1

13.3. ROTACIJA
Razlikujemo tri rotacije: rotaciju oko osi x, rotaciju oko osi y te rotaciju oko osi z.

13.3.1. ROTACIJA OKO OSI X


Rotacija oko osi x rotira toku u yz ravnini, pri emu x-koordinata toke ostaje
nepromijenjena.
Operator rotacije oko osi x u smjeru suprotnom od smjera kazaljke na satu glasi:

rotx

0
0

cos
sin

sin
cos

0
0

Njemu inverzni operator je operator rotacije oko osi x u smjeru kazaljke na satu:

'
rotx

0
0

cos
sin

sin
cos

0
0

13.3.2. ROTACIJA OKO OSI Y


Rotacija oko osi y rotira toku u xz ravnini, pri emu y-koordinata toke ostaje
nepromijenjena.
Operator rotacije oko osi y u smjeru suprotnom od smjera kazaljke na satu glasi:

roty

cos
0
=
sin

sin

1
0

0
cos

0
0

Njemu inverzni operator je operator rotacije oko osi y u smjeru kazaljke na satu:

SKRIPTA IZ RAUNALNE GRAFIKE

'
roty

cos
0
=
sin

sin

1
0

0
cos

0
0

111

13.3.3. ROTACIJA OKO OSI Z


Rotacija oko osi z rotira toku u xy ravnini, pri emu z-koordinata toke ostaje
nepromijenjena.
Operator rotacije oko osi z u smjeru suprotnom od smjera kazaljke na satu glasi:

rotz

cos
sin
=
0

sin

cos
0

0
1

0
0

Njemu inverzni operator je operator rotacije oko osi z u smjeru kazaljke na satu:

'
rotz

cos
sin
=
0

sin

cos
0

0
1

0
0

Usporedimo li ovu matricu sa matricom dobivenom za 2D rotaciju, vidjeti emo da je matrica


graena identino! Ovo je posljedica injenice da smo rotaciju u 2D upravo izveli kao rotaciju
u xy ravnini gdje smo rekli da toku rotiramo oko ishodita; ovo bi se slobodno moglo
proiriti pa rei da rotaciju izvodimo oko osi okomite na xy ravninu koja prolazi ishoditem
z-osi!

13.4. SKALIRANJE
Skaliranje svaku koordinatu "skalira" (rastee ili stee) mnoei je sa odgovarajuim
koeficijentom. Kako imamo tri koordinate radnog prostora, imati emo i tri koeficijenta.
Ukoliko su ti koeficijenti meusobno razliiti, govorimo o neproporcionalnom skaliranju;
inae govorimo o proporcionalnom skaliranju.
Operator skaliranja glasi:

SKRIPTA IZ RAUNALNE GRAFIKE


k1
0
sk =
0

k2
0
0

0
k3
0

112

0
0
0

Inverzni operator je skaliranje recipronim koeficijentima:

sk1

1
k
1
0

=
0

1
k2

1
k3

Proporcionalno skaliranje dobije se za k1=k2=k3=k, no tada se operator proporcionalnog


skaliranja moe zapisati na jo jedan nain (osim ve prikazanog opeg, pa uvrtavanjem k za
sve koeficijente):

psk

0
=
0

0
1

U tom sluaju inverz ovom operatoru je operator:

1
psk

1
0
=
0

0 0 0
1 0 0
0 1 0

0 0 k

13.5. SMIK
Smik je uzduna deformacija koja deformira poloaj toke i opisuje se kutom deformacije
prema svakoj koordinatnoj osi. U 3D prostoru imamo 3 koordinatne osi i tri kuta: , i .
Operator smika u 3D glasi:

SKRIPTA IZ RAUNALNE GRAFIKE

sm

1
tg
=
tg

tg

tg

1
tg

tg
1

113

0
0
0

Izvoenje inverznog operatora i pronalaenje uvjeta njegove egzistencije ostavljam itateljima


za zabavu.

13.7. PRIMJER
U nastavku ove skripte trebati e nam rotacija oko zadanog sredita, pa u Vas ovdje
podsjetiti na primjer koji smo ve pokazali kod 2D transformacija. Potrebno je toku T rotirati
oko toke S. Naravno, kako u 3D prostoru imamo 3 vrste rotacija, potrebno je zadati i koju
rotaciju elimo primijeniti. No jednom kada imamo sve podatke, postupak je slijedei:
1. translatirati toku S u ishodite koordinatnog sustava
2. izvriti rotaciju
3. primijeniti inverznu translaciju od translacije iz prvog koraka

SKRIPTA IZ RAUNALNE GRAFIKE

114

14. PROJEKCIJE I TRANSFORMACIJE POGLEDA


14.1. PROJEKCIJE
Podruje raunalne grafike osim rada u 2D prostoru obuhvaa i rad u 3D prostoru. tovie,
ljudima je koncepcija 3D prostora daleko blia nego 2D prostor. Razloga tome je mnogo, a
jedan je i taj to ivimo u 3D prostoru, i pojmovi poput iznad, ispod, lijevo, desno, ispred ili
iza sasvim su nam jasni. No u 2D prostoru ogranieni smo na samo dva smjera. U 2D
prostoru ne moemo prikazati tijela; mogu je iskljuivo prikaz likova. S druge strane,
prikazne jedinice danas su jo uvijek dvodimenzionalne! Zaslon monitora nudi nam
mogunost prikazivanja u jednoj ravnini. S druge strane, ovjek nastoji i u svijet raunala
uvesti 3D prostor. I dakako, to je jednim dijelom mogue. Sjetimo se samo fotoaparata. Kada
slikamo, slikamo objekte u 3D prostoru. Kao rezultat slikanja dobivamo sliku, dakle komad
papira na kojemu je "slika" smjetena u ravninu u 2D prostor. Ipak, pogledom na sliku
dobivamo jasnu predodbu o onome to je slikano; imamo privid 3D prostora. Dakako, u tom
3D prostoru ne moemo pogledati kako bi objekti izgledali kada bismo ih pogledali malo
desnije, ili pak kada bismo otili iza njih. Dobivena slika jednostavno je zamrznut prikaz
onoga to smo vidjeli tono sa mjesta s kojeg smo gledali i tono u smjeru u kojem smo
gledali. I to je mjesto na koje uskae raunalna grafika. Tu se dakle prua mogunost da i na
raunalu kreiramo takve "snimke" koje nam pokazuju to bismo vidjeli od 3D prostora kada
bismo stajali u jednoj toci tog prostora i gledali prema nekoj drugoj toci.
Metode koje opisuju na koji nain "gledamo" i to bismo zapravo vidjeli zovu se
projekcije. Naziv "projekcije" dolazi od injenice da objekte 3D prostora "projiciramo" na
ravninu u 2D prostor. Projekcije su matematiki modeli koji nam govore na koji nain treba
toke 3D prostora preslikati u ravninu u toke 2D prostora. Postoji vie vrsta projekcija, a mi
emo u nastavku obraditi dvije:

Paralelna projekcija
Perspektivna projekcija

Evo jednostavnog primjera to znai projicirati objekte 3D prostora u 2D prostor. Uzmimo list
papira i stavimo ga na stol. Iznad njega (ali ne na njega) postavimo nekakav objekt, npr.
olovku, i iznad postavimo ukljuenu svjetiljku. Rezultat je sjena olovke na papiru; 3D objekt
preslikao se je u ravninu.
Ovaj jednostavan pokus pokazao nam je jo neto projekcije su destruktivne! U 3D prostoru
znamo i duljinu olovke, i debljinu olovke, promjer i sl. Projiciranjem u 2D prostor dobili smo
sliku iz koje vie ne moemo doznati sve te informacije.

14.1.1. PARALELNA PROJEKCIJA


Jedan od najjednostavnijih modela projekcija jest model paralelne projekcije. Taj model
podrazumijeva da su sve zrake svijetlosti koje obasjavaju objekt okomite na ravninu
projiciranja i samo takve zrake tvore sliku. Drugim rijeima, projekcija daje sliku koju bi dao
tokasti izvor iznad ravnine projiciranja i to na beskonanoj udaljenosti; tada bi sve zrake koje

SKRIPTA IZ RAUNALNE GRAFIKE

115

dolaze do objekata iznad ravnine bile paralelne, i okomite na samu ravninu. Npr.
projiciranjem objekta irokog 10 cm dobili bismo i sliku iroku tono 10 cm.
Za opisivanje projekcije posluiti emo se slijedeim primjerom. elimo dobiti paralelnu
projekciju toaka na ravninu z=H pri emu je H je proizvoljan broj (to je dakle projekcija u xy
ravninu na visini H). Slika 14.1.1.1. prikazuje problem.

Slika 14.1.1.1.
Na slici je prikazan lik koji se projicira, ispod njega ravnina projekcije sa likom koji se dobije
projiciranjem, te karakteristine zrake projiciranja kroz sva etiri vrha lika. Zrake su okomite
na ravninu projekcije.
Ovaj model uzet je zbog jednostavnosti, da bismo se laku upoznali sa idejom paralelne
projekcije. Rjeenje zadanog problema je jednostavno. Ako proizvoljnu toku T projiciramo,
dobiti emo toku TP i pri tome e za komponente toke TP vrijediti:
TPx = Tx
TPy = T y
TPz = H
To se jasno vidi sa slike 14.1.1.2. Na slici je prikazana situacija za x-komponentu, no isto
vrijedi i za y-komponentu. Projicira se toka T, a projekcija je toka TP.

SKRIPTA IZ RAUNALNE GRAFIKE

116
z

Tz
TP

Tx

T Px

14.1.1.2.

Sve toke koje emo na ovaj nain projicirati, imati e z koordinatu jednaku H; dakle, sve e
leati u ravnini z=H. Ovdje prikazano paralelno projiciranje moe se opisati matricom
paralelne projekcije:

par

1
0
=
0

1
0

0
H

0
0
0

Tada se projekcija opisuje umnokom toke i matrice projekcije:

TPh = TPh , x

= Th , x

Th , y

TPh , y

Th , z

TPh , z
1
0
1
0

TPh ,h = Th par =
0

1
0

0
H

0
0
= Th , x
0

Th , y

H 1

Kada dobivene toke prikazujemo u ravnini, tada kao x i y koordinatu koristimo prve dvije
komponente toke, dok ostale komponente zanemarujemo.
Prilikom crtanja toaka u ravnini javlja se i jedan jednostavan problem: dvije toke 3D
prostora preslikavaju se u istu toku ravnine. Koju toku tada prikazati u ravnini? Npr. ako se
eli prikazati projekcija prve toke, tada emo je prikazati crvenom bojom, a ako se eli
prikazati projekcija druge toke, tada emo je prikazati plavom bojom. Kojom bojom
prikazati toku? Da bismo odgovorili na ovo pitanje, treba se prisjetiti koja je zapravo svrha
projekcije? elimo "vidjeti" 3D prostor na zaslonu! Ako je to tako, tada se dvije razliite
toke 3D prostora koje se preslikaju u istu toku 2D prostora mogu tumaiti kao dva objekta
jedan iza drugoga! Pa koji emo objekt vidjeti? Naravno, onaj koji je blii samoj ravnini
projekcije! U tom sluaju emo boju odabrati prema onoj toki koja je blia ravnini
projekcije. No kako modificirati matricu projekcije tako da sauva udaljenost od ravnine
projekcije? Iskoristiti emo z-koordinatu projicirane toke za pohranu udaljenosti toke koju
smo projicirali od same ravnine. Ako to uinimo, tada vrijedi:

SKRIPTA IZ RAUNALNE GRAFIKE

117

TPx = Tx
TPy = T y
TPz = Tz H
dok se matrica paralelne projekcije koja uva udaljenost toke od ravnine modificira u:

'par

0
0

1
0

0
1 H

0
0
0

Rezultat koji se dobije mnoenjem toke koju projiciramo i ove matrice treba tumaiti ovako:
Prve dvije komponente odgovaraju komponentama toke u ravnini
Z koordinata toke, budui da toka pripada ravnini z=H iznosi upravo H
Trea komponenta ravnine odgovara udaljenosti toke koju smo projicirali od ravnine
projekcije, i moe posluiti kao kriterij za odreivanje koju toku treba prikazati u
sluaju da se vie toaka projicira u istu toku ravnine
Matrica paralelne projekcije ispala je ovako jednostavna zbog toga to smo odabrali vrlo
jednostavan primjer projekcije: projekciju na ravninu z=H. Razumno bi bilo pitati se a kako bi
izgledala matrica paralelne projekcije na proizvoljnu ravninu u 3D prostoru. No odgovor na
ovo glasi: takvu matricu (na svu sreu) ne moramo traiti jer bi ispala krajnje komplicirana i
nepregledna. Umjesto toga, primijeniti emo postupak transformacije pogleda o kojem e biti
vie rijei u nastavku, i zatim iskoristiti upravo ovu jednostavnu matricu paralelne projekcije.
No prije no to se upustimo u postupak transformacija pogleda, pogledajmo jo i drugi tip
projekcije.

14.1.2. PERSPEKTIVNA PROJEKCIJA


Perspektivna projekcija je model koji je ovjeku blii. Naime, model uvodi dvije toke: oite
i gledite. Oite je toka u koju smjetamo oko, dok gledite predstavlja toku oko koje se
stvara ravnina projekcije (gledite pripada toj ravnini). Ravnina projekcije koja se stvara
ujedno je okomita na vektor oite-gledite. Projekcija proizvoljne toke T dobije se tako da
se oite spoji pravce sa zadanom tokom T, i kao projekcija se uzima toka u kojoj dobiveni
pravac sijee (odnosno probada) ravninu projekcije. Jedan openiti primjer perspektivne
projekcije prikazan je na slici 14.1.2.1.

SKRIPTA IZ RAUNALNE GRAFIKE

118

Ravnina projekcije

Oite

Slika 14.1.2.1.
Za matematiku analizu problema pokuajmo odrediti perspektivnu projekciju proizvoljne
toke T, ukoliko oite stavimo u ishodite koordinatnog sustava, a gledite na z-os na visini
z=H. Ovakvim odabirom oita i gledita postie se da je ravnina projekcije upravo ravnina
z=H (dakle, xy ravnina podignuta od ishodita za H). Slika 14.1.2.2. pokazuje perspektivnu
projekciju lika uz zadano oite i gledite:

Slika 14.1.2.2.
Pogledajmo to se dogaa sa pojedinim tokama. Jedan vrh lika i njegova projekcija sa slike
14.1.2.2. spojnicama su spojeni te su na x i y koordinatnim osima oznaene njihove
koordinate (ili ako se osvrnemo na prethodno poglavlje, uinjene su njihove paralelne
projekcije na z=0 ravninu). Analizu treba provesti za svaku koordinatu zasebno, no kako je
rezultat identian, u nastavku je na slici 14.1.2.3. prikazan sluaj za x-koordinatu.

SKRIPTA IZ RAUNALNE GRAFIKE

119
z

Tz
TP

Tx

T Px

14.1.2.3.

Trokuti 0-H-TP i 0-Tz-T su slini trokuti jer dijele jednak kut . Tada vrijedi:
TPx Tx
=
H
Tz
odakle slijedi:
TPx = Tx

H
Tz

Slina analiza daje i y koordinatu projekcije, te se dobije:


H
H
TPy = T y
Tz
Tz
Ovdje izvedeni odnosi mogu se zapisati i matrino,
homogene inaice. Dobije se:

0
1

0 1
per.proj =
0 0

0 0

TPx = Tx

ukoliko za sve toke iskoristimo njihove


0
0
0
0

1
H

U tonost se moemo uvjeriti pomnoimo li toku i matricu projekcije:

SKRIPTA IZ RAUNALNE GRAFIKE

120

0 0 0
1

0 1
0 0
Th , z
= Th , x Th , y
0
TPh = Th per.proj = Th , x Th , y Th , z 1

H
0 0 0 1

0 0 0 0

Prelaskom u radni prostor nakon dijeljenja sa homogenim parametrom dobiju se upravo izrazi
od kojih smo krenuli.

Z koordinata toke koja se dobije perspektivnom projekcijom preko prethodno izvedene


matrice iznosi 0. Naime, kako toka lei u ravnini projekcije logino je za z-koordinatu uzeti
vrijednost nula. No ponekad projekciju neemo koristiti kao prijelaz iz 3D u 2D sustav. U tom
sluaju potrebno je projekciji svake toke ostaviti sve tri koordinate ispravnima: znai ako
projiciramo na ravninu z=H, tada sve projicirane toke imaju z koordinatu jednaku H. Matrica
koja e vriti ovakvo projiciranje dobije se modifikacijom prethodne matrice:

0
'per.proj =
0

1
H

Kao i kod paralelne projekcije, i ovdje emo se zaustaviti i neemo ii u kompliciranije


sluajeve, odnosno u opi sluaj (to bismo vidjeli kada bi oite bilo negdje, a gledite
negdje drugdje). Razlog tome je kompliciranost cijelog postupka ukoliko bismo ili ovako
direktno, grubom silom. Umjesto toga, dovoljno je rei da se takav opi sluaj moe
postupkom transformacije pogleda svesti upravo na ovaj jednostavan! I stoga, pogledajmo to
nam nudi transformacija pogleda

14.2. TRANSFORMACIJE POGLEDA


Transformacije pogleda su postupci kojima se toke iz jednog koordinatnog sustava
preslikavaju u drugi koordinatni sustav. Ideja je, kao i uvijek, krajnje jednostavna. Treba
pronai matricu (4x4) takvu da kada svoju proizvoljnu toku pomnoite tom matricom,
dobijete toku sa koordinatama koje bi vaa toka imala kada biste je promatrali iz nekog
drugog sustava. Postoji nekoliko koraka koje treba proi na putu do te matrice. Pa krenimo
kroz primjere.
U koordinatnom sustavu S imamo toku T. Koje bi koordinate ta toka imala u sustavu S' koji
bismo dobili kada bismo sustav S lagano trknuli tako da mu ishodite otklizi u toku O'?
Problem je prikazan na slici:

SKRIPTA IZ RAUNALNE GRAFIKE


y'

121

S'

S
y

T 'y

Ty

dx

dy

x'

T 'x

Tx

14.2.1.

Problem je radi jednostavnost prikazan u 2D prostoru. Sa slike 14.2.1. jasno se vidi veza
izmeu koordinata u oba sustava:
Tx = Tx' + dx Tx' = Tx dx
'
T y = T y' + dy T y = T y dy
Proirenjem na koordinatni sustav u 3D prostoru dobije se:
Tx' = Tx dx
T y' = T y dy
Tz' = Tz dz
Upotrijebimo li homogeni zapis toaka, gornju transformaciju moemo prikazati matrinim
umnokom toke i matrice:
0
0
0
1
0
1
0
0
1 =
0
0
1
0

1
dx dy dz
Ova matrica naziva se matricom translacije i ini prvu od moguih transformacija pogleda.
Dokaz da ova matrica obavlja eljenu transformaciju je jednostavan:

SKRIPTA IZ RAUNALNE GRAFIKE

Th' = Th 1 = Th , x

[T

h, x

dx Th ,h

Th , y

Th , z

Th , y dy Th ,h

0
0
1
0
1
0
Th ,h
0
0
1

dx dy dz
Th , z dz Th ,h
Th ,h

122
0
0
=
0

Prelaskom u radni prostor dobije se:


Th', x Th , x dx Th ,h Th , x
=
dx = Tx dx
Tx' = ' =
Th ,h
Th ,h
Th ,h
T y' =
Tz' =

Th', y
'
h,h

Th', z
'
h ,h

=
=

Th , y dy Th ,h
Th ,h
Th , z dz Th ,h
Th ,h

=
=

Th , y
Th ,h
Th , z
Th ,h

dy = T y dy
dz = Tz dz

Ovim razmatranjem nauili smo kako preslikati koordinate iz jednog koordinatnog sustava u
drugi, ukoliko je ishodite drugog samo pomaknuto za neki vektor (dx dy dz). No to ukoliko
je drugi koordinatni sustav umjesto pomaka uslijed naeg udarca iz gornjeg primjera doivio
rotaciju? Radi jednostavnosti pretpostaviti emo da mu je ishodite bilo uvreno u
referentni sustav pa nije moglo doi do pomaka, ve samo do rotacije (ovaj rotirani sustav
oznaiti emo sa S'). Kako e tada izgledati koordinate zadane toke T u tom sustavu? U 2D
sustavu svaka rotacija jednoznano je odreena kutom rotacije jednim kutom. U 3D
prostoru opis rotacije zahtjeva uporabu prostornog kuta kuta koji se moe u pravokutnom
koordinatnom sustavu opisati pomou dvije komponente kuta: kutom koji projekcija rotirane
toke u xy ravninu ini sa x osi koordinatnog sustava, te kutom koji projekcija rotirane toke
u xz ravninu ini sa z osi koordinatnog sustava (zapravo, ovo nije jedina mogunost; mogu se
koristi bilo koja dva para ravnina i u njima odgovarajui kutovi). No unato ovako sloenom
opisu prostornog kuta, ideja rjeenja je ista kao i kod prethodnog problema. U prethodnom
sluaju rjeenje smo dobili tako da smo pogledali to trebamo uiniti da bismo oba
koordinatna sustava ponovno poklopili jedan preko drugoga; rjeenje je bilo ishoditu novog
sustava oduzeti vektor pomaka i time su se sustavi poklopili. No u ovom primjeru ishodita se
ve poklapaju. Ono to se ne poklapa su osi. Ono to emo pokuati da bismo poklopili nae
sustave jest slijedee: uhvatiti emo z-os novog sustava, i zarotirati je tako da se poklopi sa zosi starog sustava. No kako je za ovo potrebno primijeniti prostornu rotaciju, razloiti emo
problem na dva dijela. Najprije emo z-os zarotirati kutom u xy-ravnini u smjeru kazaljke na
satu (dakle u matematiki negativnom smjeru) tako da padne u xz ravninu. Slijedea slika
prikazuje postupak:

SKRIPTA IZ RAUNALNE GRAFIKE

123

Uzmimo da se toka G=(Gx,Gy,Gz) nalazi na z-osi zarotiranog S' sustava. Kut to ga


projekcija te toke u xy ravninu zatvara sa x osi odreen je:
Gy
Gx
cos =
sin =
2
2
Gx + G y
G x2 + G y2
Rotiranjem za taj kut toka G preslikala se je u toku G' koja lei u xz ravnini. Pri tome su
komponente toke G' odreene izrazima:
G x' = G x2 + G y2
G y' = 0
G z' = G z
Rotacijom u xy ravnini z-koordinata toke ostala je ouvana. Y-koordinata pala je na nulu jer
je toka rotacijom stigla u xz razninu. Ova transformacija opisuje se matricom:
cos
sin
2 =
0

sin

cos
0

0
1

0
0

Ovdje treba spomenuti i specijalni sluaj koji moe nastupiti. Ako je Gx=0 i Gy=0, tada se ova
rotacija preskae, jer su osi obaju sustava ve kolinearne, te kut nije definiran! No krenimo
dalje.
Zajedno sa tokom G koja se je preslikala u G', z-os naeg rotiranog sustava takoer je pala u
xz ravninu referentnog sustava. Nova situacija prikazana je na slici 14.2.3.

SKRIPTA IZ RAUNALNE GRAFIKE

124

Jo nam je preostalo da toku G' odvuemo na z-os referentnog koordinatnog sustava


rotacijom u xz ravnini opet u smjeru kazaljke na satu. Kut koji predstavlja kut u xz ravnini
to ga toka G' (odnosno precizno govorei njezina projekcija na xz ravninu) zatvara sa z-osi
odreen je:
G x'
G z'
sin =
cos =
2
2
2
2
G x' + G z'
G x' + G z'
Rotacijom toke G' dobiva se toka G'' koja lei i na z-osi referentnog sustava, te za njezine
komponente vrijedi:

( ) ( )

( ) ( )

G x'' = 0
G y'' = 0
G z'' =

(G ) + (G )
' 2
x

' 2
z

= G x2 + G y2 + G z2

I ova se transformacija moe opisati matrino:


0
sin
0
cos
0
1
0
0
3 =
sin
0
cos
0

0
0
1
0
Ovim postupkom postigli smo poklapanje z osi referentnog sustava sa rotiranim sustavom. Pri
izvoenju izraza za sin() i cos() specijalnog sluaja nema. Naime, pogreka bi nastupila
ukoliko bi G'x i G'z bili istodobno jednaki nuli, no to se ne moe dogoditi osim u sluaju da se
je polazna toka G poklapala sa ishoditem (to ne smije jer tada nismo definirali z-os).
Rotacijama 2 i 3 postigli smo ispravno poklapanje z-osi referentnog sustava i z-osi
zarotiranog sustava. No da li smo tim rotacijama uspjeli poklopiti i x i y osi? Generalno
govorei, i jesmo i nismo. Odgovor "jesmo" moemo pravdati ovako: rotirani sustav zadali
smo samo jednom tokom tokom na z-osi. Zbog toga smo poloaj x i y osi rotiranog
sustava ostavili nedefinirane! Zatim smo rotacijama postigli poklapanje z-osi oba sustava. I
to je sa x i y osima? Pa x i y osi rotiranog sustava bile su ba takve, da se sada upravo
poklapaju sa x i y osima referentnog sustava! Naravno, ovo obrazloenje nije ba
najprihvatljivije, no istinito je tako dugo dok rotirani sustav ne definiramo malo bolje Tu
ulazi u igru odgovor "nismo". Trodimenzionalni sustav jednoznano je zadan ukoliko je
poznato npr. ishodite, toka na z-osi i toka na y-osi, te je sustav desni. Toku ishodita

SKRIPTA IZ RAUNALNE GRAFIKE

125

znamo to je ista toka koja je i ishodite referentnog sustava. Toku na z-osi isto znamo:
zadali smo je kao toku G. Da bismo sustav definirali do kraja, zadajmo jo i toku K koja
lei na y-osi sustava, i rijeimo problem do kraja.
Na sustav S' do ovog trena ve smo djelovali rotacijama 2 i 3. Toka K uslijed tih rotacija
prela je u toku K'':

K h'' = K h 2 3
pri emu je Kh homogena inaica toke K. Uslijed obavljenih rotacija z-komponenta toke K''
postala je nulom, dok su x i y komponente openito razliite od nule (barem jedna od njih).
Situaciju prikazuje slijedea slika:

z, z'

G''

K'' x

y'

K''

K'' y

x'

14.2.4.
Kut koji odreuje nepoklapanje izmeu y i y' osi definiran je:

cos =

K y''

(K ) + (K )
'' 2
y

'' 2
x

sin =

K x''

(K ) + (K )
'' 2
y

'' 2
x

Rotiranjem sustava S' oko osi z za kut postii emo potpuno poklapanje referentnog sustava
i sustava S'. Matrica kojom se izvodi rotacija oko z osi za kut glasi:

SKRIPTA IZ RAUNALNE GRAFIKE

cos
sin
4 =
0

sin

cos
0

0
1

0
0

126

Rezultat ove rotacije prikazan je na slici 14.2.5.


z, z'

G''

K'''
y,y'

x,x'
14.2.5.

Ukoliko se ipak odluimo na nezadavanje toke K, moe se uzeti jednostavna pretpostavka:


kut iznosi 90. Tada e matrica rotacije oko z-osi izgledati:
0
1
'4 =
0

0
0

0
1

0
0
0

Pogledamo li koje smo sve transformacije primijenili, vidjeti emo da smo iskoristili
transformacije 2, 3 i 4 ili '4. To znai da se cijeli posao moe obaviti jednom
transformacijom 2*3*4 (odnosno 2*3*'4). Dakle, ukoliko imamo zadane koordinate
toke T u referentnom sustavu, i imamo zadanu jednu toku G koja lei na z-osi naeg
rotiranog sustava, te toku K koja se nalazi na y-osi naeg rotiranog sustava, tada emo
koordinate toke T u rotiranom sustavu S' dobiti mnoenjem toke T i transformacijskih
matrica.

SKRIPTA IZ RAUNALNE GRAFIKE

127

Jo nam je preostalo odgovoriti na najopenitiji sluaj: kako bi glasile koordinate toke T u


sustavu koji je uslijed "udarca" pretrpio i rotaciju, i translaciju? Tada mu se niti ishodita, niti
osi vie ne poklapaju. Odgovor na ovo pitanje dati e nam kompozicija prethodnih sluajeva:
prvo treba ishodite rotiranog sustava vratiti u ishodite referentnog sustava (matricom 1), a
zatim sustav treba jo dodatno zarotirati matricom 2*3*4. Pri tome treba obratiti panju
na toke koje e se uzeti kao G toka i K toka za odreivanje 2, 3 i 4. Naime, kada
matricom 1 ishodite rotiranog sustava vratimo u ishodite referentnog sustava, tada i
izvorne toke G i K treba translatirati istom matricom 1 i tako dobivene toke treba uzeti za
odreivanje matrica 2, 3 i 4.
Sa slike 14.2.5. vidljivo je da se orijentacija sustava prilikom tranformacija ne mijenja:
polazni sustav bio je desni zavrni sustav takoer je desni. Postoji transformacija pogleda
koja nam omoguava i tu promjenu. Ukoliko je referentni sustav lijevi, a odredini sustav
desni (ili obrnuto), tada e se koordinate izmeu sustava transformirati jednostavnim
okretanjem predznaka na x osi to ini matrica:
1
0
5 =
0

1
0

0
1

0
0
0

Ovime zavravamo pregled transformacija pogleda.

14.3. PRIMJENA NA POOPENJE PERSPEKTIVNE PROJEKCIJE


U poglavlju 14.1.2. pokazali smo osnove perspektivne projekcije. Uveli smo toku oita kao
onu toku gdje stavljamo nae oko, te toku gledita kao onu toku koja predstavlja toku
koja pripada ravnini projekcije, i koja ujedno tvori ishodite 2D koordinatnog sustava u toj
ravnini. Dodatno smo rekli da je ravnina projekcije odreena jednom pripadnom tokom
(gleditem) i normalom (vektor oite-gledite). No tu smo stali. Kao primjer perspektivne
projekcije uzeli smo najjednostavniji mogui: oite je u ishoditu koordinatnog sustava, a
gledite je na z os i to toka (0 0 H) gdje je H udaljenost oita od gledita.
Da bismo poopili problem, sada emo razmotriti situaciju kada su oite i gledite
proizvoljne toke u prostoru. Kako tada nai perspektivnu projekciju? Pogledajmo jo jednom
to znamo. Znamo nai perspektivnu projekciju ako se oite nalazi u ishoditu, a gledite na
z osi. Hm A koje bi bile koordinate proizvoljne toke T ako mjerenje vrimo iz
koordinatnog sustava koji ima ishodite u oitu a gledite mu se nalazi na z-osi? Da, rije je
o transformaciji pogleda Pa krenimo redom.
Oite emo u nastavku oznaavati sa Q, gledite sa R.

14.3.1. KORAK 1
Prisjetimo li se transformacije pogleda, tada je prvi korak vraanje novog ishodita u ishodite
referentnog sustava. Dakle, koristimo matricu 1, uz pomake koji odgovaraju upravo
koordinatama oita. Transformacije emo raditi nad proizvoljnom tokom T.

SKRIPTA IZ RAUNALNE GRAFIKE

1
0
1 =
0

Q x

1
0
Qy

0
1
Qz

128

0
0
0

Ova transformacija oite e preslikati u ishodite, dok e gledite preslikati u:

Rh' = Rh 1 = Rh , x

[R

h, x

Qx

Rh , y

Rh , y Q y

Rh , z

Rh , z Q z

1
0
1
0

Q x
1

0
1

0
0

0
Qy

1
Qz

0
0
=
0

Prema tome, za pojedine komponente vrijedi:


R x' = R x Q x
R y' = R y Q y
R z' = R z Q z

14.3.2. KORAK 2
Sada kada se ishodita obaju sustava poklapaju, treba izvriti rotaciju sustava tako da im se z
osi poklope. Prvi korak je bio rotacija u xy ravnini matricom 2.
cos
sin
2 =
0

sin

cos
0

0
1

0
0

pri emu vrijedi:


cos =

Gx
G x2 + G y2

sin =

Gy
G x2 + G y2

dok je G toka upravo jednaka toci gledita nakon prve transformacije: G=R', pa se moe
pisati:
cos =

R' x
R ' 2x + R' 2y

sin =

R' y
R' 2x + R ' 2y

Transformacija 2 djelovanjem na toku R' daje toku R'':

SKRIPTA IZ RAUNALNE GRAFIKE

129

cos sin
sin
cos
Rh'' = R ' h 2 = R' h , x R ' h , y R' h , z
1
0
0

0
0
R ' h , x cos + R' h , y sin R ' h , x sin + R' h , y cos R' h , z 1

0
1

0
0

Uvrtavanjem izraza za sin() i cos() dobiva se:


R x'' = R' 2x + R ' 2y
R y'' = 0
R z'' = R z'

14.3.3. KORAK 3
Sada je potrebno primijeniti i rotaciju u xz ravnini transformacijom 3.
0
sin
0
cos
0
1
0
0
3 =
sin
0
cos
0

0
0
1
0
Pri emu su:
R x''
R z''
sin =
cos =
2
2
2
2
R x'' + R z''
R x'' + R z''

( ) ( )

( ) ( )

Transformacija 3 djelovanjem na toku R'' daje toku R''', to po komponentama daje:


R x''' = 0
R y''' = 0
R z''' =

(R ) + (R )
'' 2
x

'' 2
z

= R' 2x + R ' 2y + R' 2z

Primijenimo li jo i transformaciju '4 (a po potrebi i 5 ako su sustavi razliito orijentirani),


uinili smo sve potrebne transformacije kako bi sustav sa ishoditem u oitu i tokom
gledita na njegovoj z osi preveli u sustav kojemu se ishodite i z os poklapaju sa referentnim
sustavom. to smo time dobili? Ako znamo toku T u referentnom sustavu, tada su njezine
koordinate u sustavu sa ishoditem u oitu jednake:

T ' = T 1 2 3 '4 5
Budui da su nam time poznate koordinate u sustavu u kojem je oite jednako ishoditu, a
gledite se nalazi na z-osi, tada toku T' znamo onom jednostavnom matricom perspektivno
projicirati, te moemo pisati:

SKRIPTA IZ RAUNALNE GRAFIKE

130

T p' = T ' per.proj = T 1 2 3 '4 5 per.proj


pri emu je matrica perspektivne projekcije dana sa:

per.proj

0
=
0

1
H

H je udaljenost od oita do gledita pa se moe izraunati iz tih podataka, ili se moe


primijetiti da smo tu udaljenost ve izraunali prilikom transformacije pogleda, te se
udaljenost nalazi kao z komponenta toke R'''z. Dakle, za H vrijedi:
H=
H=
H=
H=

(Qx R x )2 + (Q y R y )2 + (Qz Rz )2

(R ) + (R ) + (R )
(R ) + (R )
(R ) = R
' 2
x

' 2
y

'' 2
x

'' 2
z

''' 2
z

'''
z

' 2
z

Da smo eljeli dobiti opu paralelnu projekciju, postupak bi bio identian, samo bismo
umjesto posljednje matrice perspektivne projekcije uzeli matricu paralelne projekcije.
U postupku se koristi matrica '4 budui da prilikom zadavanja parametara za perspektivnu
projekciju nismo zadali niti jedan podatak koji bi nam omoguio identificiranje poloaja osi y.
Ukoliko se eli potpuna kontrola nad slikom koju generira perspektivna projekcija, tada je
potrebno zadati jo i jednu toku K koja se nalazi na y-osi sustava u kojem radimo projekciju.
Podsjetimo se jo jednom zato je to tako.
Kod ope perspektivne projekcije zadajemo dvije toke: oite Q i gledite R. Pri tome se
stvara novi sustav sa ishoditem u toci Q, i sa pozitivnom z'-osi kroz toku R. Okomito na
spojnicu R-Q u kroz toku R stvara se ravnina projekcije. U toj ravnini lee i x' i y' osi ovog
novog sustava. Jedini problem u svemu tome je to specificiranjem samo toaka Q i R mi
nemamo kontrolu nad x' i y' osima, tj. ne moemo nikako zadati: "ja hou da y'-os gleda ba
ovako". Jedna od mogunosti da se dobije kontrola nad tim osima objanjena je u poglavlju
o transformacijama pogleda pomou toke K. Dakle, ukoliko prilikom zadavanja parametara
perspektivne projekcije zadamo i toku K, tada emo umjesto matrice '4 koristiti matricu 4
ime emo dobiti kontrolu nad svim osima sustava. Implementacija ove jednostavne
modifikacije ostavlja se itateljima za vjebu. No postoji i drugi pristup.

SKRIPTA IZ RAUNALNE GRAFIKE

131

14.3.4. VIEW-UP VEKTOR


View-up vektor popularan je naziv za jedan od naina "kroenja" svih osi sustava (dakle osi x'
i y'). Evo ideje. Korisnik e prilikom zadavanja parametara npr. perspektivne projekcije zadati
i vektor koji e pokazivati smjer y' osi. Ovo moe biti dosta problematino jer jedinini vektor
y' osi lei u ravnini projekcije, a korisnik prilikom zadavanja "to eli dobiti" ne mora sam
raunati sve tome slue raunala. Stoga je problem slijedei: korisnik programa moe rei
npr. "y' os neka gleda prema gore". U prirodi "prema gore" obino oznaava u smjeru
r
pozitivne z-osi, iji je reprezentant npr. vektor v ' = [0 0 1] . No (npr.) oite i gledite
zadani su tako da ravnina projekcije lei pod kutem od 45 prema ravnini xz, i okomita je na
r
r
yz ravninu. Vektor v koji e u tom sluaju gledati "prema gore" biti e npr. v = [0 1 1]
r
jer on lei u ravnini projekcije (dok vektor v ' oito ne lei). Postavlja se pitanje kako uz
r
r
priblini vektor v ' pronai pravi vektor v . Problem je ilustriran na slici 14.3.4.1.

Q oite
v'
n
v
r
R gledite

y
14.3.4.1.

r
Rjeenje za view-up vektor v dobiva se jednostavnim raunom. Treba uoiti da vrijedi:
r r r
(rel: 14.3.4/1)
v' = r + v
r
Vektor n definiran je kao razlika toaka:
r
n =QR
(rel: 14.3.4/2)
r
r
Kut izmeu vektora n i vektora v ' definiran je sa:
r r
r r
n v'
(rel: 14.3.4/3)
cos n , v ' = r r '
n v
r
Za vektor r normu moemo dobiti iz pravokutnog trokuta:
r r
r
r'
r r'
nv'
r = v cos r , v = r
(rel: 14.3.4/4)
n
r
dok je sam vektor jednak svojoj normi puta jedinini vektor u smjeru n :

SKRIPTA IZ RAUNALNE GRAFIKE

132

r
r r
r r n
n v' r
(rel: 14.3.4/5)
r = r r = r 2 n
n
n
r
r
Ako iz relacije (rel: 14.3.4/1) izvuemo vektor v ' i uvrstimo ono to smo dobili za vektor r ,
dobiva se:
r r
r r' r r' n v ' r
v = v r = v r 2 n
(rel: 14.3.4/6)
n
r
Izraz za view-up vektor da se jo pojednostavniti ako se vektor n prije uporabe normira, pa se
umjesto izraza (rel: 14.3.4/2) koristi izraz:
r QR
(rel: 14.3.4/7)
n=
QR
Tada izraz za view-up vektor daje:

r r r r
r r r
v = v ' r = v ' (n v ' ) n

(rel: 14.3.4/8)

Koristei dobiveni izraz toka K moe se izraunati trivijalno:


r
K = R+v

(rel: 14.3.4/9)

Nakon izraunavanja toke K moe se krenuti u izgradnju matrica za opu perspektivnu


projekciju koristei pri tome matricu 4.

14.4. TRANSFORMACIJE POGLEDA NA DRUGI NAIN


14.4.1. MALI IZVOD
U poglavlju 14.2. vidjeli smo jedan nain prelaska izmeu dva sustava. U nastavku emo dati
prikaz jo jedne mogunosti. Zanima nas koje e koordinate imati toka T u sustavu S' ako
znamo koordinate toke T u referentnom sustavu S. Neka je referentni sustav S na poznati
r r r
osnovni sustav sa osima x, y i z koje su u smjeru vektora i , j i k . Sustav S' moemo zadati
na slijedei nain: ishodite mu je u toci C (ije koordinate znamo u sustavu S), pozitivna zr
r
os zadana je vektorom N , pozitivna y-os zadana je vektorom V a pozitivna x-os zadana je
r
vektorom U . Dakle, imamo situaciju prikazanu na slici 14.4.1.
slika 14.4.1.

r r
r
Prilikom zadavanja vektora N , V i U treba paziti da su vektori meusobno okomiti, i
jedinini (dakle, norma im je 1). Ukoliko zadani vektori nisu jedinini, treba ih prije uporabe
normirati! Kako sada doi do koordinata toke T u sustavu S'? Prema ve navedenom receptu,
najprije treba ishodite sustava S' dovesti u ishodite sustava S. To emo postii matricom 1
uz pomak koji odgovara koordinatama ishodita sustava S' mjereno iz sustava S:

SKRIPTA IZ RAUNALNE GRAFIKE


1
0
1 =
0

C x

1
0
Cy

0
1
Cz

133

0
0
0

Ovime smo postigli poklapanje ishodita obaju sustava. Sada jo treba oitati koordinate. No
prije nego to se upustimo u to, prisjetimo se, to su zapravo koordinate? Hm Koordinatni
sustav zadan je svojim baznim vektorima. Ako od ishodita krenemo malo po jednom
vektoru, pa nakon toga krenemo po drugom vektoru, i tako po svim vektorima, doli smo u
neku toku prostora. Koordinate te toke su upravo one "malo po jednom vektoru"komponente. Toka u koju smo stigli moe se predoiti vektorom: projekcije tog vektora na
svaki bazni vektor daje upravo odgovor "koliko malo" smo se pomaknuli po tom vektoru!
Dakle, svaku koordinatu toke moemo dobiti tako da vektor toke projiciramo na
odgovarajui bazni vektor. A projekcija jednog vektora na drugi je upravo njihov skalarni
produkt (ukoliko je vektor na koji projiciramo jedinian; inae treba rezultat podijeliti sa
njegovom normom). Pogledajmo to na primjeru. U referentnom sustavu zadana je toka
r
r r
T=(5,2,1). Pretvorbom u vektor dobivamo 5 i +2 j +1 k jer je referentni sustav upravo zadan
r
r r r
r
r
vektorima i , j i k . Koliko iznosi x komponenta toke? Mnoimo (5 i +2 j +1 k ) skalarno
r
r
r
r
r
r
sa (1 i +0 j +0 k ) i rezultat je 5! Y komponenta dobije se mnoenjem (5 i +2 j +1 k ) sa
r
r
r r
r r
(0 i +1 j +0 k ) i rezultat je 2! I z-koordinata dobije se mnoenjem (5 i +2 j +1 k ) sa
r
r r
(0 i +0 j +1 k ) i rezultat je 1! Po ovoj analogiji moe se pokazati da komponente toke T u
sustavu S' odgovaraju upravo projekcijama vektora T na bazne vektore sustava S'
(matematiki dokaz tvrdnje da koordinate u novom sustavu predstavljaju upravo projekcije
radij-vektora toke na pojedine bazne vektore novog sustava moete pogledati u dodatku A).
r r r
Kako je sustav S' zadan sa tri bazna vektora: U , V i N (koji su jedinini), tada vrijedi:
r
r
Tx' = T U = Tx U x + T y U y + Tz U z
r r
T y' = T V = Tx V x + T y V y + Tz V z
r r
Tz' = T N = Tx N x + T y N y + Tz N z
Ovo se moe i matrino zapisati, pa matrica 2 glasi:
U x
U
y
2 =
U z

Vx

Nx

Vy
Vz

Ny
Nz

0
0
0

Ukupna matrica transformacije pogleda tada glasi: =12.


r r r
U postupku smo pretpostavili da su zadana sva tri vektora: U , V i N . No lako je pokazati da
r
r
r
ne moraju biti zadani ba svi vektori. Npr. ukoliko su zadani vektori V i N , vektor U moe
r
r
se dobiti kao x-produkt vektora V i N (to e rezultirati desnom orijentacijom sustava S') ili
r r
kao x-produkt vektora N i V (to e rezultirati lijevom orijentacijom sustava S').

SKRIPTA IZ RAUNALNE GRAFIKE

134

r
r
r
Nadalje, vektor V mora biti zadan tako da bude okomit na vektore U i N . Ukoliko se
korisniku dopusti da zada vektor koji je priblino okomit, tada se pravi okomit vektor moe
izraunati pomou relacije za view-up vektor (rel: 14.3.4/6) odnosno (rel: 14.3.4/8).

r
Najslobodniji pristup dopustiti e korisniku zadavanje trodimenzionalne toke C, vektora N
r
kao pokazivaa pozitivnog smjera osi z', vektor smjera V ' koji i ne mora biti ba okomit na
r
vektor N te podatak da li se eli lijevi ili desni sustav S'. U tom sluaju prikladan postupak
r
r
raunanja je slijedei: prvo treba normirati vektor N , zatim izraunati pravi vektor V , te iz
r
podatka o orijentaciji sustava treba izraunati vektor U kao x-produkt. Zatim se sloe matrice
1 i 2 te ukupna matrica transformacije glasi: =12.

14.4.2. PRIMJENA NA PERSPEKTIVNU PROJEKCIJU


Toka C biti e oite. Gledite moemo zadati na dva naina:
r
1. Eksplicitnim zadavanjem toke gledita R; tada se vektor N rauna kao R-C uz
naknadno normiranje. Tada se za H moe uzeti norma od R-C, ili se toka R moe
r
koristiti samo za odreivanje vektora N , dok se H i dalje zadaje proizvoljno.
r
2. Zadavanjem vektora N (koji po potrebi treba normirati), te zadavanjem udaljenosti H
(u ovom sluaju H se mora zadati)
Uz ove podatke potrebno je zadati i view-up vektor, te eljenu orijentaciju sustava.
Poglavlje 14.4.1. sadri sve formule potrebne za dobivanje matrice transformacije pogleda
(=12). Jedino to preostaje je pomnoiti tu matricu sa matricom perspektivne projekcije!

SKRIPTA IZ RAUNALNE GRAFIKE

135

15. OSVJETLJAVANJE
15.1 UVOD
U prethodnim poglavljima nauili smo dovoljno da znamo kako iscrtati iani model objekta
na zaslonu. Sada je dolo vrijeme da se upoznamo sa nainima kako u scenu uvesti svjetlosne
izvore i analizirati njihov utjecaj na objekte.
Svjetlost je samo jedan od oblika zraenja, te i za nju vrijede openite fizikalne zakonitosti:
REFLEKTIRANA

RASPRENA
UPADNA SVJETLOST =
ABSORBIRANA
TRANSMITIRANA
Svaka od ovih komponenti ovisna je o samim fizikalnim svojstvima materijala, o gruboi
povrine, o valnoj duljini same svijetlosti i jo mnotvu faktora. Zbog toga je openita analiza
vrlo sloena i u praksi neizvediva. Dodatne potekoe stvara i meusobna interakcija objekata
(ukoliko u sceni imamo vie od jednog objekta). Naime, dio svjetlosti koji osvjetljava objekt
A dolazi do objekta B (bilo refleksijom, bilo rasprenjem i sl.) i osvjetljava ga. Objekt B opet
dio te svjetlosti odbija prema objektu A; objekt A opet dio alje objektu B, i mislim da ste
shvatili. Zbog ove kompleksnosti uvode se modeli koji u odreenoj mjeri uvaavaju pojedine
fizikalne zakone i interakcije objekata, te daju koliko-toliko zadovoljavajue rezultate. Meu
najjednostavnije modele spada i Phongov reflekcijski model koji emo obraditi u nastavku.

15.2. PHONGOV REFLEKSIJSKI MODEL


15.2.1. OPENITO O MODELU
Model pretpostavlja da se cjelokupno osvjetljenje objekta (i svakog njegovog djelia) moe
opisati kao linearna kombinacija triju komponenata:

Difuzna komponenta
Zrcalna komponenta
Ambijentna komponenta

Uz to, svjetlosni izvori sa kojima ovaj model barata mogu biti iskljuivo tokasti (dakle, nema
rasvjetnih tijela; sva svijetlost dopire iz jedne ili vie toaka, pa govorimo o jednom ili vie
tokastih izvora).

15.2.2. DIFUZNA KOMPONENTA


Iz fizike je poznato da intenzitet svjetlosti koji dopire do bilo koje elementarne povrine tijela
ovisi o kutu pod kojim upada svjetlost u odnosu na normalu te elementarne povrine. Pri
tome, prema slici 15.2.2.1. vrijedi:

SKRIPTA IZ RAUNALNE GRAFIKE

136

N
izvor
L

15.2.2.1.

I d = I i k d cos( )

(rel:15.2.2.1/1)

Pri tome je Ii je intenzitet tokastog izvora, a kd empirijski koeficijent refleksije ovisan o


valnoj duljini upadne svijetlosti (0kd1). je kut izmeu normale povrine i linije od
promatrane toke do izvora.
r
Pogledajmo sliku 15.2.2.1. i na njoj oznaene vektore. Vektor L
iz toke koju promatramo i usmjeren je prema izvoru. Vektor
predstavlja normalu u promatranoj toci. Sada kosinus kuta
produktom tih vektora, pa relacija (rel:15.2.2.1/1) prelazi u:

r r
I d = Ii kd L N

predstavlja jedinini vektor


r
N jedinini je vektor koji
moemo izraziti skalarnim

(rel:15.2.2.1/2)

r r
Ako Id ispadne negativan zbog L N < 0 , tada se za Id uzima 0.
Ukoliko u sceni ima vie tokastih izvora, tada se ukupan intenzitet u promatranoj toci moe
pisati:

r r
I d = k d I i , n Ln N

(rel:15.2.2.1/3)

15.2.3. ZRCALNA KOMPONENTA


Zrcalna komponenta, prema slici 15.2.3.1., funkcija je kuta .

SKRIPTA IZ RAUNALNE GRAFIKE

137

N
izvor
R

15.2.3.1.

I s = I i k s cos n

(rel:15.2.3/1)

pri emu je Ii intenzitet izvora, ks koeficijent ovisan o materijalu (0ks1). n je indeks koji
opisuje grubou povrine i njezina reflektirajua svojstva.

r
Prema slici 15.2.3.1. vektor R predstavlja vektor reflektirane zrake i nalazi se u ravnini koju
r
r
r
r
r
tvore vektori L i N , pod istim kutem to ga zatvara vektor L sa vektorom N . Vektor V
r
r
predstavlja vektor usmjeren iz promatrane toke prema promatrau (oku). Vektori R i V
r r
takoer su jedinini vektori. U tom sluaju kut moe se opisati skalarnim produktom R V ,
pa relacija (rel:15.2.3/1) prelazi u:

r r
I s = I i ks R V

(rel:15.2.3/2)

Ova komponenta omoguava nam postizanje efekta bljetavila. Naime, ovisno o faktoru n kut
izmeu promatraa i reflektirane zrake imati e razliiti utjecaj. Ukoliko n tei u
beskonanost, povrina se ponaa kao zrcalo! Naime, tada e ova komponenta postojati samo
u smjeru reflektirane zrake a to je upravo karakteristika idealnog zrcala. Ukoliko je pak
povrina neto grublja, tada emo imati rasipanje svjetlosti i u malim kutevima oko
reflektirane zrake. To opisujemo konanim n-om. Slika 15.2.3.2. pokazuje utjecaj indeksa n
r
na intenzitet ove komponente uzevi u obzir poloaj vektora V .

SKRIPTA IZ RAUNALNE GRAFIKE

138

15.2.3.2.

Slika je generirana za n=10,20,40,80,160 i 320. Uz n=10 dobivena je vanjska krivulja to


pokazuje da je za male vrijednosti indeksa n ova komponenta prisutna u irokom spektru
kuteva oko reflektirane zrake. Najvei n (=320) generirao je najuu krivulju. Iz ovoga
proizlazi da se spektar kuteva u kojima ova komponenta ima utjecaja smanjuje i tei prema
kutu =0, u kojem bi sluaju komponenta postojala samo u smjeru reflektirane zrake.

15.2.4. AMBIJENTNA KOMPONENTA


Ambijentna komponenta rezultat je interakcija meu objektima opisanih u uvodu. U ovom
modelu ambijentna komponenta uzima se konstantnom:

I g = I a ka

(rel:15.2.4/1)

Ambijenta komponenta osigurava da povrine koje su stranje u odnosu na izvor svjetlosti ne


budu potpuno crne.

15.2.5. UKUPAN UTJECAJ


Ukupan utjecaj iskazuje se kao linearna kombinacija svih triju komponenata:

r r
r r
I = I a ka + I i kd L N + k s R V

))
n

(rel:15.2.5/1)

Radi jednostavnosti, model pretpostavlja da se svjetlosni izvor, kao i promatra, nalaze u


r
r
beskonanosti. Ova pretpostavka rezultira konstantnim vrijednostima vektora L i V kroz
itavu scenu, ime se izbjegava potreba za raunanjem istih u svakoj promatranoj toci, pa se
cijeli postupak znaajno ubrzava. No ovo povlai za posljedicu da e proizvoljno velikoj
povrini biti u svakoj toci pridjeljen isti intenzitet. Da bi se ovo izbjeglo, u model se ipak
uvodi ovisnost intenziteta o udaljenosti. Naravno, budui da se promatra nalazi u

SKRIPTA IZ RAUNALNE GRAFIKE

139

beskonanosti, kao mjerodavna se uzima udaljenost od toke pogleda (kojom se definira


r
vektor V ) i promatrane toke. Tada se relacija (rel:15.2.5/1) modificira u:
r r
r rn
I = I a k a + I i k d L N + k s R V / (r + k )
(rel:15.2.5/2)

))

pri emu je r udaljenost promatrane toke od toke pogleda, a k konstanta vea od nule koja
sprjeava dijeljenje sa nulom u sluaju r=0.
Ukoliko se za opis svjetlosti koriste R, G i B komponente, tada relaciju (rel:15.2.5/2) treba
primijeniti za sve tri komponente, pri emu treba uoiti da ks nije ovisan o svjetlosti; stoga
vrijedi:

(
(
(

( )
( )
( )

( ))
( ))
( ))

r r
r rn
I r = I a k a ,r + I i k d ,r L N + k s R V / (r + k )
r r
r rn
I g = I a k a , g + I i k d , g L N + k s R V / (r + k )
r r
r rn
I b = I a k a ,b + I i k d ,b L N + k s R V / (r + k )

(rel:15.2.5/2)

15.2.6. ZBIRNI PREGLED MODELA

Svjetlosni izvori su tokasti.


Svjetlosni izvori i promatra nalaze se u beskonanosti.
Difuzna i reflektirajua komponenta modeliraju se lokalno.
Koristi se empirijski model simulacije rasipanja svjetlosti oko reflekcijskog vektora
ime se modelira bljetavilo.
Za boju rasipane svjetlosti uzima se boja izvora.
Ambijent je modeliran konstantom.

15.2.7. PRIMJER
Pogledajmo kako se ovaj model ponaa u najjednostavnijim sluajevima. U scenu emo
postaviti kuglu u ishodite 3D sustava. Za prijelaz u 2D sustav koristiti emo paralelnu
projekciju, uz promatraa koji se nalazi u + na z-osi i gleda prema ishoditu. Koristiti emo
jedan svjetlosni izvor, koji e se takoer nalaziti u beskonanosti, ali ne na z osi, ve u ravnini
y=0, te u odnosu na ishodite pod kutem od 45 izmeu osi x i z; matematiki reeno, pod
vektorom [1 0 1]). Budui da gledamo odozgo, crtati emo samo gornji plat kugle (z0).
Uz paralelnu projekciju preslikavanje iz 3D u 2D sustav vrlo je jednostavno: x'=x, y'=y, z'=0.
Crtanje kugle nije rijeeno najoptimalnije, no posluiti e za demonstraciju. Kako se cijela
kugla projicirana u z=0 ravninu svede na krug upisan kvadratu -RxR i -RyR, funkcija
provjerava za svaku toku te povrine da li pripada krugu; ako ne, ide se na slijedeu toku, a
ako pripada, rauna se intenzitet. Funkcija koja ovo rauna dana je u nastavku:
void __fastcall TForm1::Button3Click(TObject *Sender)
{
int x,y;
double z, I, Id, Is;
const int R = 100;

SKRIPTA IZ RAUNALNE GRAFIKE

140

double nx, ny, nz;


double lx, ly, lz, rx, ry, rz, l_n_2, vx, vy, vz, naz;
lx = 1; ly = 0; lz = 1;
naz = sqrt(lx*lx + ly*ly + lz*lz);
lx = lx / naz; ly = ly / naz; lz = lz / naz;
vx = 0; vy = 0; vz = 1;
vz = sqrt(vx*vx + vy*vy + vz*vz);
vx = vx / vz; vy = vy / vz; vz = vz / vz;
for( x=-R; x<=R; x++ ) {
for( y=-R; y<=R; y++ ) {
z = R*R - (x*x + y*y);
if( z < 0 ) continue;
z = sqrt(z);
nz = sqrt(x*x + y*y + z*z);
nx = x / nz; ny = y / nz; nz = z / nz;
Id = lx*nx + ly*ny + lz*nz;
l_n_2 = 2*Id;
if( Id > 0. ) Id = 200*Id; else Id = 0.;
rx=l_n_2*nx-lx; ry=l_n_2*ny-ly; rz=l_n_2*nz-lz;
naz = sqrt(rx*rx + ry*ry + rz*rz);
rx = rx / naz; ry = ry / naz; rz = rz / naz;
Is = rx*vx + ry*vy + rz*vz;
if( Is > 0. ) {
Is = 45*pow(Is,80);
} else Is=0.;
I = 10. + Id + Is;
Image1->Canvas->Pixels[x+150][-y+150]=RGB(I,I/2,I);
}
}
}

Svaki izraunati pixel crta se na zaslonu, a budui da se dio kruga dobiva uz negativne
vrijednosti x i y koordinata, ishodite je pomaknuto u toku (150,150). Dodatno se mijenja i
orijentacija y osi prema gore (na zaslonima se pozitivni y protee prema dolje).
Funkcija pretpostavlja slijedee vrijednosti:

Ii=256
kd=0.78125 Id= Iikd=200
ks= 0.17578125 Is= Iiks=45
Ig=Iaka=10.
n=80

etiri slike uz razliite vrijednosti faktora n prikazane su u nastavku.

SKRIPTA IZ RAUNALNE GRAFIKE

141

Slika 15.2.7.1.
n=5

Slika 15.2.7.2.
n = 20

Slika 15.2.7.3.
n = 80

Slika 15.2.7.4.
n = 360

15.3. GOURAUDOVO SJENANJE POLIGONA


U poglavlju 15.2. opisan je Phongov model. Jedan od postupaka koji sjenanje poligona
temelje na tom modelu je Gouraudov postupak. Prema relaciji (rel:15.2.2.1/2) difuzna
r
r
komponenta u svakoj toci ovisi o skalarnom produktu vektora L i vektora N . Budui da je
r
izvor smjeten u beskonanosti, vektor L konstantnog je iznosa u cijeloj sceni. Kako
r
sjenamo poligon, a poligon je dio ravnine, tada je po cijeloj povrini poligona vektor N
konstantan. Slijedi da je skalarni produkt tih vektora, a time i difuzna komponenta, po cijeloj
povrini poligona konstantna.

SKRIPTA IZ RAUNALNE GRAFIKE

142

Tijela (zapravo njihovo oploje) u 3D prostoru obino modeliramo nizom poligona.


Sjenanje tijela tada se svodi na sjenanje poligona. Svaki poligon dijeli pojedine vrhove sa
drugim poligonima. Potrebno je u svakom vrhu pronai srednju normalu, i pomou nje
izraunati intenzitet u tom vrhu. Srednja normala rauna se kao aritmetika sredina normala
svih poligona koji dijele taj vrh. Slika 15.3.1. prikazuje primjer.

N3

N2

N1
15.3.1.

r 1 r
r
r
Uz sliku vrijedi relacija N = N 1 + N 2 + N 3 , dok openito vrijedi:
3
r 1 n r
N = Ni
n i =1

(rel:15.3/1)

Intenzitet u vrhu rauna se prema relaciji (rel:15.2.5/1), pri emu zanemarujemo Is


komponentu, pa slijedi:

r r
I = I a ka + Ii kd L N

(rel:15.3/2)

Nakon to ovo izraunamo za sve vrhove, kreemo na sjenanje poligona. Sada svaki poligon,
openito govorei, ima u svojim vrhovima razliite intenzitete. Ove intenzitete treba najprije
interpolirati uzdu svih bridova (npr. DDA postupkom). Nakon ovoga poznati su intenziteti u
svakoj toci svakog brida poligona. Sada jo treba te intenzitete interpolirati od lijevih bridova
poligona do desnih bridova poligona (opet DDA postupkom). Ideja je pokazana na slici
15.3.2.

SKRIPTA IZ RAUNALNE GRAFIKE

143

I 1 (x1,y1)

Ia
(xa,ys)

Is
(xs,ys)

Ib
(xb,ys)

I 2 (x2,y2)

I 4 (x4,y4)

I 3 (x3,y3)
15.3.2.

Za toku (xa,ys) intenzitet se dobije interpolacijom izmeu I1 i I4:


1
(I 1 ( y 4 y s ) + I 4 ( y s y1 ))
Ia =
y 4 y1
Za toku (xb,ys) intenzitet se dobije interpolacijom izmeu I1 i I2:
1
(I1 ( y 2 y s ) + I 2 ( y s y1 ))
Ib =
y 2 y1
Intenzitet toke (xs,ys) dobije se interpolacijom intenziteta Ia i Ib:
1
(I a (xb x s ) + I b (xs xa ))
Is =
xb x a
Ovakav postupak raunanja naziva se bilinearna interpolacija (naime, najprije se linearno
interpoliraju intenziteti uzdu y osi, a potom se vri interpolacija tih interpoliranih vrijednosti
uzdu x osi).
Budui da se intenzitet Is rauna za svaki pixel scan-linije koji se nalazi unutar poligona,
postupak se moe malo modificirati da bi se dobilo na brzini. Uvede se prirast Is:
I s =

x
(I b I a )
xb x a

pa se intenzitet moe raunati prema:


I s ,n = I s ,n 1 + I s

SKRIPTA IZ RAUNALNE GRAFIKE

144

Pri tome x oznaava korak po x-osi. Ukoliko popunjavamo svaki pixel, to je uobiajeno, x
iznosi 1.

15.4. PHONGOVO SJENANJE


Ovo je jo jedan postupak koji se zasniva na Phongovom reflekcijskom modelu. Postupak je
za raunalo zahtjevniji, ali daje bolje rezultate od Gouraudovog sjenanja. Postupak zadrava
bilinearnu interpolaciju, ali vie se ne interpoliraju intenziteti, ve same normale, da bi se na
kraju za svaki pixel na temelju dobivene vrijednosti za normalu izvelo raunanje intenziteta
na temelju relacije (rel:15.3/2). Sada je vidljivo zato je postupak puno zahtjevniji. Meutim,
dobra strana postupka jest privid da interpolirana normala slijedi zakrivljenosti povrine. Slika
15.4.1. pokazuje primjer.

N1

izvorna povrina

Ns

N2

poligonizirana povrina

15.4.1.

Zakrivljenu povrinu pokuali smo prikazati poligonima. U tu svrhu generirano je nekoliko


poligona tako da "slijede" zakrivljenost povrine. Naravno, mi smo uzeli svega tri poligona
(dok bi za koliko toliko realnu i glatku zakrivljenost trebalo uzeti puno vie).Normale u
zajednikim vrhovima su N1 i N2. Ukoliko normalu Ns dobijemo (bi)linearnom
interpolacijom, dobiva se dojam da normala slijedi zakrivljenost izvorne povrine, pa
oekujemo i bolje rezultate od sjenanja.
U postupak kreemo kao i kod Gouraudovog sjenanja: potrebno je izraunati normale u svim
vrhovima prema relaciji (rel:15.3/1). Zatim se izvodi bilinearna interpolacija normala, tako da
u toci (xs,ys) dobijemo normalu Ns. Posljednji korak je izraun intenziteta u toj toci prema
relaciji (rel:15.3/2) gdje za N uzimamo Ns. Slika 15.4.2. pokazuje postupak.

SKRIPTA IZ RAUNALNE GRAFIKE

N1

Na
(xa,ys)

145

(x1,y1)

N s Is
(xs,ys)

Nb
(xb,ys)
N2
(x2,y2)

N4
(x4,y4)

N3

(x3,y3)

15.4.2.

Za toku (xa,ys) normala se dobije interpolacijom izmeu N1 i N4:


r
r
r
1
Na =
N 1 ( y 4 y s ) + N 4 ( y s y1 )
y 4 y1
Za toku (xb,ys) normala se dobije interpolacijom izmeu N1 i N2:
r
r
r
1
Nb =
N 1 ( y 2 y s ) + N 2 ( y s y1 )
y 2 y1
Normala toke (xs,ys) dobije se interpolacijom normala Na i Nb:
r
r
r
1
Ns =
N a ( xb x s ) + N b ( x s x a )
xb x a

Budui da se normala Ns rauna za svaki pixel scan-linije koji se nalazi unutar poligona,
postupak se moe malo modificirati da bi se dobilo na brzini. Uvede se prirast Ns:
r
N s =

r
r
x
Nb N a
xb x a

pa se intenzitet moe raunati prema:


r
r
r
N s ,n = N s ,n 1 + N s
Pri tome x oznaava korak po x-osi. Ukoliko popunjavamo svaki pixel, to je uobiajeno, x
iznosi 1. Treba uoiti da ovdje sve relacije opisuju vektore, to znai da se svaka relacija pri
raunanju raspada na tri relacije (jer se raunanje provodi za svaku komponentu vektora

SKRIPTA IZ RAUNALNE GRAFIKE

146

posebno). To je jo jedan razlog daleko vee raunske zahtjevnosti na sklopovlje koje izvodi
ove kalkulacije.

SKRIPTA IZ RAUNALNE GRAFIKE

147

16. UKLANJANJE NEVIDLJIVIH ELEMENATA


16.1. UVOD
Objekte scene opisujemo matematikim modelima: poligonima, funkcijama i sl. Rad sa
ovakvim opisom (dodue, jedinim moguim) vrlo je spor i raunski zahtjevan. Dokaz ove
tvrdnje vidi se ve iz postupka sjenanja. Da bi se iscrtavanje scene maksimalno ubrzalo,
treba iz postupka iscrtavanja izbaciti sve radnje koje su nepotrebne (a takvih ima). Npr.
ukoliko u scenu stavimo kocku, gdjegod da se nalazio promatra, nikada mu nee biti vidljive
sve stranice kocke. Te "nevidljive" stranice zapravo su stranje stranice kocke gledano iz
smjera promatraa. Te stranice ne treba niti sjenati jer e ionako biti uklonjene. Proitate li
paljivo prethodnu reenicu, uoiti ete da se u njoj nalaze dvije razliite tvrdnje. Prva tvrdnja
je da stranice ne treba sjenati. Na ovom mjestu otvara se prostor za algoritme koji unaprijed
odluuju koje radnje ne treba initi. Razvijen je niz algoritama u ove svrhe, no veina ih radi
sa povrinama (dakle, svim vrstama poligona i sl.). Ovakvim algoritmima problem
predstavljaju same toke. Naime, toka nema niti povrinu, niti orijentaciju i vrlo je nezgodna
za 3D scenu. Druga spomenuta tvrdnja je "ionako e biti uklonjene". Ovo je mjesto na kojem
su nastali razliiti algoritmi koji vidljivost rjeavaju na razini toke. Dakako, ovi algoritmi su
daleko moniji od prethodno spomenutih jer rade sa najmanjim djeliem prostora (sve ostalo
poput linija, povrina i sl. sastoji se upravo od toaka). Nedostatak ovih algoritama je u
izuzetnoj sporosti i velikim memorijskim zahtjevima. U algoritme iz prvog dijela spadaju
provjere u sustavu scene (uklanjanje stranjih poligona i sl) i provjere u sustavu prikaza
(minimax provjere). Drugi dio odnosi se na Z-buffer algoritam.

16.2. UKLANJANJE STRANJIH POLIGONA PROVJERA


NORMALE
Ovaj postupak pomoi e nam da otkrijemo koji su poligoni tijela stranji u odnosu na
promatraa. Pretpostavka je da je tijelo opisano nizom poligona, i da je tijelo konveksno.
Nadalje, pretpostavlja se da su vrhovi poligona zadani u smjeru suprotnom od smjera kazaljke
na satu ako gledamo poligon iz toke koja se nalazi izvan tijela. Ovo e za posljedicu imati da
sve normale poligona gledaju iz tijela prema van. Tada se odluka da li je poligon prednji ili
stranji moe donijeti na temelju kuta to ga normala poligona zatvara na vektorom
usmjerenim prema gledatelju. Slika 16.2.1. demonstrira zakljuivanje:

SKRIPTA IZ RAUNALNE GRAFIKE

148

Np
N

<90
Np

>90
<90

Np
16.2.1.

r
Potrebno je promatrati kut to ga zatvara vektor normale poligona N p i vektor iz sredita
r
poligona prema promatrau N . Tada vrijedi:

r r
Poligon je stranji, ukoliko je N p N < 0
r r
Poligon je prednji (vidljiv), ukoliko je N p N > 0
r r
Poligon je degenerirao u liniju ukoliko je N p N = 0

16.3. MINIMAX PROVJERE


Minimax provjere slue nam brza provjera da li se dva objekta ne preklapaju. Prethodna
reenica zvui malo udno, ali ispravno karakterizira postupak. Naime, minimax provjerama
moemo utvrditi da li je sigurno da se dva objekta ne preklapaju. Ukoliko pak utvrdimo da
postoji mogunost da se objekti preklapaju, tada daljnje provjere treba vriti drugim
algoritmima. Evo ideje. Svaki objekt u sustavu prikaza ima svoje minimalne i maksimalne
koordinate kroz koje se protee. Usporedbom tih vrijednosti moemo donijeti neke zakljuke.
Primjer je prikazan na slici 16.3.1. Provjerava se preklapanja dvaju segmenata linije. Linije su
uzete radi jednostavnosti, no postupak je identian za bilo kakve druge objekte.

SKRIPTA IZ RAUNALNE GRAFIKE

149

y
y 1,max
y 1,min
y 2,max
y 2,min
x 1,min

x 1,max x 2,min

x 2,max

16.3.1.

Postavlja se pitanje, kada moemo biti sigurni da se objekti ne preklapaju?

Ukoliko je x1,max< x2,min


Ukoliko je x1,max< x1,min
Ukoliko je y1,max< y2,min
Ukoliko je y2,max< y1,min

Ukoliko je zadovoljen bilo koji od ova etiri uvjeta, tada smo sigurni da se objekti ne
preklapaju. Ukoliko niti jedan od ta etiri uvjeta nije ispunjen, tada treba izvriti daljnje
provjere. Naime, i dalje je mogue da se objekti ne preklapaju, a niti jedan gornji uvjeti nije
ispunjen (primjer na slici 16.3.2.).

y
y 1,max
y 2,max
y 1,min
y 2,min

x 1,min x 2,min x 1,max x 2,max

16.3.2.

Na slici 16.3.2. objekti se i dalje ne preklapaju, no minimax provjerom to ne moemo utvrditi.


Minimax provjera u ovom sluaju rezultirati e potrebom za dodatnim provjerama, jer se
kvadratna podruja u kojima lee objekti preklapaju.

SKRIPTA IZ RAUNALNE GRAFIKE

150

16.4. Z BUFFER
Z buffer je postupak koji provjeru preklapanja radi na razini toaka. Ideja je slijedea. Slika se
iscrtava na zaslon konanih dimenzija. Tada se prilikom iscrtavanja toke na zaslon u z
bufferu pamti udaljenost izvorne toke od promatraa (z koordinata toke nakon projekcije).
Npr. potrebno je iscrtati toku (x,y,z). Vri se projekcija toke i dobije se toka (x',y',z'). Na
zaslon treba iscrtati toku na poziciji (x',y'). No prije nego to nacrtamo tu toku, potrebno je
u z bufferu pogledati da li je na tu poziciju ve nacrtana neka druga toka, i ako je, koliko je
ona daleko bila od promatraa. Ukoliko je naa toka blia, tada ona skriva prethodno iscrtanu
toku (jer je blie promatrau), pa je crtamo i u z buffer upisujemo na mjesto (x',y') udaljenost
nae toke. Ukoliko je naa toka dalja, tada je ne crtamo.
U praktinim izvedbama z buffer implementira se kao polje dimenzija rezolucija_x *
rezolucija_y. Da li e to biti polje tipa short, int ili neto tree, ovisi o dozvoljenoj dubini
scene. Inicijalno se svi elementi polja postave na najvee vrijednosti (dakle, do sada smo
"iscrtavali" jedino toke u beskonanosti koje su iza svih).
Najvei nedostatak ovakvog pristupa je u zahtjevima za memorijom. Npr. odluimo li se na
prikaz u rezoluciji 1024x768 pixela, u maksimalnu dublinu scene takvu da moemo koristiti
short-tip (2 bajta), potrebna koliina memorije iznosi 1024*768*2=1572864 bajtova ili
1.5MB! Zahtjevi za memorijom mogu jo porasti ako u z buffer odluimo upisivati vie
informacija. Naime, ukoliko ga koristimo za spremanje dubine, a toke iscrtavamo na
zaslonu, tada emo kod vrlo kompleksnih scena kojima treba dosta vremena za iscrtavanje
uoiti kako se neki pixeli pojavljuju, pa ih zamjenjuju drugi pixeli dobiveni od bliih
objekata. Da bi se ovo izbjeglo, z buffer moemo koristiti tako da pamti i dubinu pojedine
toke, i njezinu boju (dakle iscrtavanje se u ovom koraku ne radi na zaslon). Jednom kada
smo itavu scenu iscrtali, moemo cijelu sliku u jednom prolazu iz z buffera prebaciti na
zaslon. No ovakav postupak za svaku toku z buffera zahtjeva 2 bajta za dubinu + 3 bajta za
boju to daje 5 bajtova po toki, ili uz rezoluciju 1024x768 iznos od 3932160 bajtova ili
3.75MB.
Ove ogromne memorijske zahtjeve moemo ublaiti vieprolaznim iscrtavanjem scene: npr. u
prvom prolazu iscrtati emo gornju polovicu zaslona, a u drugom prolazu donju polovicu.
Tada nam treba z buffer veliine za pola zaslona. Openito, n prolazno iscrtavanje zahtjeva
samo n-ti dio z buffera koji bi trebalo jednoprolazno iscrtavanje, ali zato postupak traje n puta
dulje!
Razvijen je i scan line z buffer algoritam koji iscrtava liniju po liniju zaslona; no efikasna
primjena ovog algoritma zahtjeva velike izmjene u nainu pamenja objekata.
Kod Phongovog modela osvjetljavanja prikazali smo funkciju koja je nacrtala kuglu i
osjenala je. U nastavku emo pokazati funkciju koja je osjenati dvije kugle koje se
meusobno probadaju koristei Phongov model i z buffer. Rezultat rada funkcije prikazan je
na slici 16.4.1. a funkcija je navedena u nastavku.

SKRIPTA IZ RAUNALNE GRAFIKE

151

Slika 16.4.1.
Centar desne kugle nalazi se neto ispod centra lijeve kugle.

void DvijeKugle(void)
{
int x,y;
double z, I, Id, Is;
const int R = 100;
double nx, ny, nz;
short *buffer;
double lx, ly, lz, rx, ry, rz, l_n_2, vx, vy, vz, naz;
lx = 1; ly = 0; lz = 1;
naz = sqrt(lx*lx + ly*ly + lz*lz);
lx = lx / naz; ly = ly / naz; lz = lz / naz;
vx = 0; vy = 0; vz = 1;
naz = sqrt(vx*vx + vy*vy + vz*vz);
vx = vx / naz; vy = vy / naz; vz = vz / naz;
buffer = (short*)malloc(300*400*sizeof(short));
if( buffer==NULL ) {
Application->MessageBox("Nema dovoljno memorije","Poruka",MB_APPLMODAL|MB_ICONERROR|MB_OK);
return;
}
for( y=0; y<300; y++ ) {
for( x=0; x<400; x++ ) {
buffer[y*400+x] = -32000;
}
}
for( x=-R; x<=R; x++ ) {
for( y=-R; y<=R; y++ ) {
z = R*R - (x*x + y*y);
if( z < 0 ) continue;
z = sqrt(z);
nz = sqrt(x*x + y*y + z*z);
nx = x / nz; ny = y / nz; nz = z / nz;
Id = lx*nx + ly*ny + lz*nz;
l_n_2 = 2*Id;
if( Id > 0. ) Id = 200*Id; else Id = 0.;
rx=l_n_2*nx-lx; ry=l_n_2*ny-ly; rz=l_n_2*nz-lz;
naz = sqrt(rx*rx + ry*ry + rz*rz);
rx = rx / naz; ry = ry / naz; rz = rz / naz;

SKRIPTA IZ RAUNALNE GRAFIKE

152

Is = rx*vx + ry*vy + rz*vz;


if( Is > 0. ) {
Is = 45*pow(Is,1.1);
} else Is=0.;
I = 10. + Id + Is;
buffer[(y+150)*400+(x+150)] = z;
Image1->Canvas->Pixels[x+150][y+150]=RGB(I,I/2,I);
}
}
for( x=-R; x<=R; x++ ) {
for( y=-R; y<=R; y++ ) {
z = R*R - (x*x + y*y);
if( z < 0 ) continue;
z = sqrt(z);
nz = sqrt(x*x + y*y + z*z);
nx = x / nz; ny = y / nz; nz = z / nz;
Id = lx*nx + ly*ny + lz*nz;
l_n_2 = 2*Id;
if( Id > 0. ) Id = 200*Id; else Id = 0.;
rx=l_n_2*nx-lx; ry=l_n_2*ny-ly; rz=l_n_2*nz-lz;
naz = sqrt(rx*rx + ry*ry + rz*rz);
rx = rx / naz; ry = ry / naz; rz = rz / naz;
Is = rx*vx + ry*vy + rz*vz;
if( Is > 0. ) {
Is = 45*pow(Is,1.1);
} else Is=0.;
I = 10. + Id + Is;
if(buffer[(y+150)*400+(x+150+100)]<z-50) {
buffer[(y+150)*400+(x+150+100)] = z-50;
Image1->Canvas->Pixels[x+150+100][y+150]=RGB(I,I/2,I);
}
}
}
free(buffer);
}

Lijeva kugla ima centar u ishoditu, dok desna kugla ima centar u toci (100,0,-50). U petlji
koja crta lijevu kuglu z-buffer samo se popunjava vrijednostima, budui da je to prvi objekt.
Pri crtanju druge kugle postupak raunanja je isti, samo to se z buffer najprije provjerava.
Svaka toka desne kugle rauna se kao da je u ishoditu, a umjesto dobivenih x i y i z
koordinata koriste se koordinate (x+100,y,z-50). Pri implementaciji z buffera u ovoj funkciji
toka je blia i promatrau to joj je z koordinata vea (jer je promatra na z osi u plus
beskonanosti). Zbog toga je inicijalno z buffer popunjen sa negativnim vrijednostima.

SKRIPTA IZ RAUNALNE GRAFIKE

153

17. FRAKTALI
17.1. UVOD
Jedno od ljepih podruja raunalne grafike pokriva i matematike umotvorine fraktale. Mi
emo u nastavku dati prikaz nekoliko karakteristinih fraktala i pojasniti postupak kako se do
njih dolazi. Treba napomenuti da ovdje prikazani fraktali ine vrlo mali dio do sada
otkrivenih fraktala, a generalno govorei, skup fraktala je beskonaan skup tako da ih nikada
niti neemo upoznati sve. Inae, moram se korigirati glede uvodne reenice; fraktali zapravo i
nisu matematike ve prirodne tvorevine. Matematiari su samo nali nain kao baratati sa
njima. Pa krenimo od najjednostavnije vrste.

17.2. SAMOPONAVLJAJUI FRAKTALI


Samoponavljajui fraktali su tvorevine koje na svim skalama umanjenja zadravaju isti
karakteristini oblik. Kao primjer emo uzeti Kochinu krivulju. Kochina krivulja dobije se
slijedeim jednostavnim algoritmom.
1. Krenimo od osnovnog oblika prikazanog na slijedeoj slici.
TC

TA

T1

T2

TB

Konstrukcija fraktala
2. Svaki od etiri segmenta prepravi tako da umjesto linije umetne cijeli lik iz toke 1.
Dobiti e se slika:

SKRIPTA IZ RAUNALNE GRAFIKE

154

TC

TA

T1

T2

TB

Konstrukcija fraktala
Toke TA i TC spojene su spojnicom da se pokae kako novi vrhovi lee na njoj; inae
spojnica ne spada u proces generiranja fraktala.
3. Svaki segment nastao u prethodnom koraku opet zamijeni oblikom iz koraka 1.; i
proces ponavljaj u beskonanost
Praktina implementacija gornjeg algoritma nee naravno ii u beskonanost, ve do neke
zadane dubine. Npr. ukoliko se ide do dubine 6, dobije se slika:

Primjer fraktala
Kochina krivulja dobije se kada rekurziju pustimo da ide u beskonanost. Dakako, na
raunalima obino prikazujemo aproksimaciju Kochine krivulje. Nitko jo nije uspio nacrtati
sasvim tonu krivulju
Funkcija koja iscrtava krivulju prema prethodnom algoritmu moe se napisati kao vrlo
jednostavna rekurzivna funkcija:
void DrawFractal1Rek( T2DRealPoint A, T2DRealPoint B, T2DRealPoint C, int depth )
{
T2DRealPoint Ap,Bp,Cp;
if( depth > 5 ) {
MoveTo(fround(A.x),fround(A.y));
LineTo(fround(A.x+(B.x-A.x)/3.),fround(A.y+(B.y-A.y)/3.));
LineTo(fround(C.x),fround(C.y));
LineTo(fround(A.x+2.*(B.x-A.x)/3.),fround(A.y+2.*(B.y-A.y)/3.));
LineTo(fround(B.x),fround(B.y));
return;
}
depth++;

SKRIPTA IZ RAUNALNE GRAFIKE

155

Ap.x = A.x; Ap.y = A.y;


Bp.x =A.x+(B.x-A.x)/3.; Bp.y = A.y+(B.y-A.y)/3.;
Cp.x =A.x+(C.x-A.x)/3.; Cp.y =A.y+(C.y-A.y)/3.;
DrawFractal1Rek( Ap, Bp, Cp, depth );
Ap.x = Bp.x; Ap.y = Bp.y;
Bp.x =C.x; Bp.y = C.y;
Cp.x =A.x+2.*(C.x-A.x)/3.; Cp.y =A.y+2.*(C.y-A.y)/3.;
DrawFractal1Rek( Ap, Bp, Cp, depth );
Ap.x = Bp.x; Ap.y = Bp.y;
Bp.x =A.x+2.*(B.x-A.x)/3.; Bp.y = A.y+2.*(B.y-A.y)/3.;
Cp.x =B.x+2.*(C.x-B.x)/3.; Cp.y =B.y+2.*(C.y-B.y)/3.;
DrawFractal1Rek( Ap, Bp, Cp, depth );
Ap.x = Bp.x; Ap.y = Bp.y;
Bp.x =B.x; Bp.y = B.y;
Cp.x =B.x+(C.x-B.x)/3.; Cp.y =B.y+(C.y-B.y)/3.;
DrawFractal1Rek( Ap, Bp, Cp, depth );
}

Funkcija prima toke A, B i C koje na prethodnim slikama odgovaraju tokama TA, TB i TC,
te uz njih i malo elementarne geometrije rauna toke T'A, T'B i T'C za svoj svaki segment te
izraunate toke predaje u novi rekurzivni poziv. Maksimalna dubina rekurzije odreena je
prvim ispitivanjem i postavljena je na prvu veu od 5 (dakle 6). Uz ovu funkciju, jo je
potrebna i nerekurzivna funkcija koja e pozvati svoju rekurzivnu inaicu:
void DrawFractal1()
{
T2DRealPoint A,B,C;
A.x = 10; A.y = 200 - 10;
B.x = 320 - 10; B.y = 200 - 10;
C.x = ( A.x + B.x )/2.;
C.y = A.y - sqrt(3)/2.*( B.x - A.x )/3.;
DrawFractal1Rek(A, B, C, 1);
}

Funkcija pretpostavlja zaslon razluivosti 320x200 i ostavlja po 10 praznih pixela lijevo,


desno i ispod krivulje.
Jednostavnim proirenjem gornjeg algoritma dobiti emo poznatu Kochinu pahuljicu (Koch's
Snowflake). Umjesto od jedne linije krenuti emo od trokuta ije su stranice segmenti
prikazani u prethodnom algoritmu pod brojem 1. Dobiti emo lik:

Sada emo svaku liniju iterativno zamjenjivati tim segmentima. Rezultat je slijedei:

SKRIPTA IZ RAUNALNE GRAFIKE

pa

156

Iz opisanog postupka moe se vidjeti da se Kochina pahuljica moe dobiti kao


jednakostranini trokut ije su stranice Kochine krivulje! Matematiki gledano, ovaj fraktal
zanimljiv je po jo neemu: duljina njegova opsega je beskonana, iako je povrina koju lik
zauzima konana! Algoritam za crtanje pahuljice takoer se sastoji od dva dijela: jedne
rekurzivne funkcije koja je ve navedena kod Kochine krivulje (DrawFractal1Rek), i
nerekurzivne funkcije koja poziva istu:
void DrawFractalSnowflake()
{
T2DRealPoint A,B,C;
double visina,d;
visina = 200 - 20;
d = sqrt(3.)*visina/2.;
A.x = 10; A.y = 200 - 10 - visina/4.;
B.x = A.x + d; B.y = A.y;
C.x = ( A.x + B.x )/2.;
C.y = A.y + sqrt(3)/2.*d/3.;
DrawFractal1Rek(A, B, C, 1);
B.x = A.x + d/2.;
B.y = A.y - d*sqrt(3.)/2.;
C.x = (A.x+B.x)/2.-visina/4.*sqrt(3)/2.;
C.y = (A.y+B.y)/2.-visina/4./2.;
DrawFractal1Rek(A, B, C, 1);
A.x = A.x + d;
C.x = (A.x+B.x)/2.+visina/4.*sqrt(3)/2.;
C.y = (A.y+B.y)/2.-visina/4./2.;
DrawFractal1Rek(A, B, C, 1);
}

I ova funkcija podrazumijeva ekran 320x200 pixela. Funkcija se sastoji od tri cjeline: poziva
za iscrtavanje donje Kochine krivulje, poziva za iscrtavanje lijeve Kochine krivulje te poziva
za iscrtavanje desne Kochine krivulje.

17.3. MANDELBROTOV FRAKTAL


Mandelbrotov fraktal nastaje provjeravanjem konvergencije iterativnog niza u kompleksoj
ravnini. Evo o emu se radi. Neka je zadano iterativno preslikavanje:
z n +1 = z n2 + c

z 0 = 0 + 0i

SKRIPTA IZ RAUNALNE GRAFIKE

157

Varijable z i c su kompleksni brojevi. Odabrati emo jedan kompleksni broj (i dodijeliti ga


varijabli c). Poeti emo postupak iteracije i dobivati redom brojeve:
z 0 , z1 , z 2 , z 3 , z 4 ,...
Postoje tri mogunosti za ovaj niz:
Niz konvergira prema nekom broju
Niz oscilira
Niz divergira u beskonanost
Za potrebe dobivanja Mandelbrotovog fraktala ove tri mogunosti promatrati emo kao samo
dvije:
Niz divergira
Niz ne divergira
Da bismo ispitali ponaanje niza, raunati emo redom odreeni broj koeficijenata. Koliko e
to koeficijenata biti, ovisiti e o dobivenom nizu. Naime, odrediti emo dva uvjeta
zaustavljanja.
1. Maksimalni iznos modula koeficijenta z koji emo oznaiti sa . Naime, ukoliko niz
divergira, tada e brojevi u nizu postajati sve vei i vei. Kada ustanovimo da je
modul broja vei od , rei emo da niz divergira i prekinuti emo iteraciju.
2. Maksimalan broj iteracija m. Da li niz divergira ili ne, provjeriti emo u maksimalno
m iteracija. Ako do tada niz pokae tendenciju divergiranja, iteriranje e se prekinuti
zbog uvjeta 1. Inae emo iteriranje prekinuti nakon m iteracija.
Mandelbrotov fraktal dobiva se tako da se redom provjeravaju toke u kompleksnoj ravnini, i
svakoj toci pridrui se boja koja odgovara broju iteracija koje smo izvrili pri provjeravanju
divergencije niza u toj toci. Sada treba jo samo odgovoriti na pitanje kako emo to crtati!
Nai zasloni nisu kompleksne ravnine. No analogije ima. Zaslon ima x i y os; kompleksna
ravnina ima realnu i imaginarnu os. Zbog toga emo izvriti "mapiranje" zaslona u
kompleksnu ravninu. Moe se vrlo jednostavno pokazati da ukoliko se eli mapirati interval
od amin do amax u interval bmin do bmax, odgovarajua formula glasi:
b=

(a a min ) (
b b )+ b
(a max a min ) max min min

Pri iscrtavanju Mandelbrotovog fraktala provjeravati emo dio kompleksne ravnine omeen
realnim komponentama umin i umax, te imaginarnim komponentama vmin i vmax. Kako elimo
iskoristiti cijeli zaslon dimenzija WxH, x koordinate toaka zaslona kretati e se u intervalu
od 0 do W-1; dakle xmin=0, xmax=W-1. Y-koordinate toaka kretati e se u intervalu od 0 do
H-1 pa je ymin=0, ymax=H-1. U tom sluaju gornja se formula malo pojednostavljuje, pa se
toka (x,y) preslikava u kompleksni broj (u,v) pri emu vrijedi:

u=
v=

x
x max
y
y max

(u max u min ) + u min


(v max v min ) + v min

(rel:17.3/1)

SKRIPTA IZ RAUNALNE GRAFIKE

158

Uz ove sve podatke, algoritam za iscrtavanje Mandelbrotovog fraktala glasi:


1. x[xmin,xmax] i y[ymin,ymax]
2. izvri mapiranje toke (x,y) u kompleksni broj (u,v) prema relaciji (rel:17.3/1).
3. postavi k=-1; c=(u,v); zn=(0,0);
4. k=k+1; zn+1=zn2+c; ako je modul(zn+1) vei od ili ako je k>m, prei na korak 5. Inae
ponovi korak 4.
5. Na koordinate (x,y) ispii pixel u boji k.
Primjer implementacije ovog algoritma dan je u nastavku.
void Mandelbrot(double eps, int m,
double umin, double umax,
double vmin, double vmax,
int xmin, int xmax,
int ymin, int ymax ) {
int x, y, k;
double u,v;
double z_re, z_im;
double c_re, c_im;
double a,b;
double deltau,deltav;
eps = eps*eps;
deltau=(double)(umax-umin)/(double)xmax;
deltav=(double)(vmax-vmin)/(double)ymax;
v = (double)ymin*(vmax-vmin)/ymax+vmin;
for( y = ymin; y <= ymax; y++ ) {
u = (double)xmin*(umax-umin)/xmax+umin;
for( x = xmin; x <= xmax; x++ ) {
c_re = u; c_im = v;
z_re = z_im = 0.;
k = -1;
do {
k++;
a = z_re * z_re - z_im * z_im + c_re;
b = 2. * z_re * z_im + c_im;
z_re = a; z_im = b;
} while(a*a+b*b<eps && k<m);
k = 255-k;
Pixels[x][y] = RGB(
1.30727E-3*k*k-0.8313931*k+255,
4.25231E-3*k*k-1.83336*k+255,
7.4591E-4*k*k+6.07737E-2*k
);
u+=deltau;
}
v+=deltav;
}
}

Funkcija je napisana uz slijedee pretpostavke:

Rad bez palete boja (32-bitna boja) tako da se boje mogu direktno sintetizirati
koristei funkciju RGB().
Maksimalni broj iteracija 255 (ovaj uvjet dolazi samo zbog naina na koji se raunaju
pojedine komponente boje). Ogranienje se moe maknuti ukoliko se promjeni nain
odreivanja boje.
Provjera da li broj konvergira ne koristi modul ve kvadrat modula; time je izbjegnuto
vaenje korijena za svaku toku ravnine i za svaku iteraciju ime se dobiva na brzini.
No zbog toga je na poetku programa i sama pogreka kvadrirana.
Koriste se ope formule za mapiranje (x,y)(u,v) tako da se ne mora fraktal iscrtavati
na cijelom zaslonu. Dodatno su funkcije razloene na dijelove i umjesto neprestanog

SKRIPTA IZ RAUNALNE GRAFIKE

159

mnoenja i dijeljenja sve je svedeno na inkrementiranje varijabli za unaprije


izraunate vrijednosti, koje se raunaju samo kada za to ima potrebe.
Neki primjeri prikazani su u nastavku.
Mandelbrotov fraktal pokazuje interesantne oblike u kompleksnoj ravnini i to u dijelu od
priblino 2 do 2 po realnoj i isto tako 2 do 2 po imaginarnoj osi. Ukoliko se odluimo za
kvadratnu povrinu s centrom u broju (Cx,Cy) i irinom (i visinom) w, tada se prethodna
funkcija moe pozvati:
Mandelbrot(100, 255, Cx-w/.2, Cx+w/.2, Cy-w/.2, Cy+w/.2, 0, 319, 0, 199 );

U nastavku emo sredite pogleda postaviti u toku (Cx,Cy)=( -0.7454265, 0.1130090).


Vrijednost parametra w biti e navedena uz svaku sliku.
W=4./5.
w=4.

W=4./(5.3)

W=4./(5.4)

W=4./(5.5)

W=4./(5.6)

SKRIPTA IZ RAUNALNE GRAFIKE

W=4./(5.7)

160

W=4./(5.8)

17.4. JULIJEVA KRIVULJA


Da, krivulja. Zato krivulja a ne fraktal nije mi poznato ali na svim mjestima gdje sam se
susreo sa ovime obino je bilo navedeno neto poput "Mandelbrot set and Julias Curve".
Postoji i razlog zato se ova dva pojma spominju zajedno: Julijevu krivulju dobivamo
minornom izmjenom algoritma za Mandelbrotov fraktal. Prisjetimo se jo jednom.
Mandelbrotov fraktal smo dobili kao poslijedicu provjere konvergencije niza koji nastaje
iterativnim preslikavanjem:

z n +1 = z n2 + c

z 0 = 0 + 0i .

Pri tome smo za konstantu c uzeli upravo toku u kompleksnoj ravnini koju smo ispitivali.
Julijevu krivulju dobiti emo uz isto preslikavanje:

SKRIPTA IZ RAUNALNE GRAFIKE

z n +1 = z n2 + c

161

z 0 = u + vi

ali uz dvije razlike.

Prvi lan niza nije (0+0i) ve upravo toka za koju ispitujemo konvergenciju (u+vi).
Konstanta je unaprijed vrsto definiran kompleksni broj koji ne ovisi o toci za koju
ispitujemo konvergenciju.

Uz ove dvije izmjene funkcija koja e iscrtavati Julijevu krivulju mogla bi izgledati ovako:
Void Julij(double eps, int m, double c_re, double c_im, double umin, double umax,
double vmin, double vmax, int xmin, int xmax, int ymin, int ymax ) {
int x, y, k;
double u,v;
double z_re, z_im;
double a,b;
double deltau,deltav;
eps = eps*eps;
deltau=(double)(umax-umin)/(double)xmax;
deltav=(double)(vmax-vmin)/(double)ymax;
v = (double)ymin*(vmax-vmin)/ymax+vmin;
for( y = ymin; y <= ymax; y++ ) {
u = (double)xmin*(umax-umin)/xmax+umin;
for( x = xmin; x <= xmax; x++ ) {
z_re = u; z_im = v;
k = -1;
do {
k++;
a = z_re * z_re - z_im * z_im + c_re;
b = 2. * z_re * z_im + c_im;
z_re = a; z_im = b;
} while(a*a+b*b<eps && k<m);
k = 255-k;
Pixels[x][y] = RGB(
1.30727E-3*k*k-0.8313931*k+255,
4.25231E-3*k*k-1.83336*k+255,
7.4591E-4*k*k+6.07737E-2*k
);
u+=deltau;
}
v+=deltav;
}
}

Za prikaz nekih karakteristinih oblika posluiti emo se istom taktikom kao i kod
Mandelbrotovog fraktala. Dakle, u kompleksnoj ravnini odabrati emo prozor za koji emo
ispitivati konvergencije toaka. Centar prozora je u toci (Cx,Cy) a irina (i visina) prozora je
w. Dodatno, konstanta koja se koristi u postupku biti e oznaena sa ConstX i ConstY.
Cx: 0.0769230769230769
Cy: -0.518394648829431
W: 0.2
ConstX: 0.179180
ConstY: 0.588843

Cx: 0
Cy: 0
W: 2.3
ConstX: 0.32
ConstY: 0.043

SKRIPTA IZ RAUNALNE GRAFIKE

162

Cx: 0
Cy: 0
W: 3.2
ConstX: -0.807984
ConstY: -0.145732

Cx: -0.00301003344481606
Cy: 0.198996655518395
W: 0.08
ConstX: -0.500036
ConstY: -0.520156

Cx: 0
Cy: 0
W: 2.7
ConstX: 0.371588
ConstY: -0.155767

Cx: -0.275919732441472
Cy: -0.396321070234114
W: 0.5
ConstX: -.74543
ConstY: .11301

SKRIPTA IZ RAUNALNE GRAFIKE

163

U nedostatku prostora u nastavku u navesti samo neke od parametara koji vode do


zanimljivih slika.
Svima su zajedniki parametri:

Centar prozora u toci (Cx,Cy)=(0,0)


irina (i visina) prozora w=4

SKRIPTA IZ RAUNALNE GRAFIKE

164

ConstX

ConstY

ConstX

ConstY

0.155114
-0.391936
0.179180
-0.906652
-0.502346
-0.708605
-0.549722
0.325578
-0.762463
-1.233091
-0.162022
-0.807984
-1.009018
0.280671
-1.087530
0.260043
-0.022023
0.240183
0.130282
0.416111
-0.212523

-0.470914
0.453160
0.588843
-0.063846
0.558921
0.053607
0.550616
0.545938
-0.027366
-0.053551
-0.643480
-0.145732
0.200253
-0.535311
-0.042409
-0.005810
0.705886
-0.580091
0.613403
-0.239016
-0.751017

-0.859367
0.386646
-0.586441
0.108418
-0.500036
-0.106036
-0.495141
-0.827186
-0.964169
0.275751
0.371588
0.337128
-0.193388
0.290019
-0.613422
-0.115536
-0.431275
-0.753062
-0.124655
-1.164108
0.382244

0.203302
-0.229820
0.483202
0.610887
-0.520156
-0.713234
-0.583987
-0.042244
-0.014027
0.591888
-0.155767
-0.412187
-0.703894
0.502282
-0.415656
-0.813656
0.578900
-0.229746
0.842925
-0.195863
0.370021

SKRIPTA IZ RAUNALNE GRAFIKE

165

Ovih etrdesetak toaka dobiveno iz petstotinjak iscrtavanja uz sluajno odabrane toke pa su


probrane najinteresantnije slike. Uz parametar w=4 dobiti e se prikaz cijelog fraktala, no to
bi trebala biti tek polazna toka. Za svaku sliku nakon to se iscrta, centar prozora moe se
pomaknuti u neku zanimljivu toku i parametar w se smanji na npr. w/10. Zatim se to iscrta.
U slijedeem koraku opet se moe jo zumirati (smanjivanjem w) itd.

17.5. FRAKTAL "by" GINGER


Naalost, precizniji od ovoga ne mogu biti jer sam do fraktala doao sasvim sluajno preko
interneta, i sve to je tamo bilo navedeno je ovo ime. No ono to me se dojmilo je trivijalan
generator fraktala: sve to treba uiniti jest odabrati proizvoljne poetne vrijednosti za x i y
koordinate, te na zaslonu iscrtavati toke koje se dobiju slijedeim iterativnim postupkom:

x n +1 = 1 y n x n
y n +1 = x n
Ovo je primjer iterativnog preslikavanja koje za neke poetne vrijednosti ne divergira. Npr. uz
poetne vrijednosti: x0=-0.1, y0=0.8 dobije se:

Boja svake toke moe se odrediti proizvoljno. U ovom primjeru boja se svakom iteracijom
uvea za 2, te kada stigne do 256, opet se resetira na nulu. Slika je dobivena uz 10000
iteracija. Funkcija koja je iscrtava:
void Ginger2(int m, double x, double y, int xg_min, int xg_max, int yg_min, int yg_max,
int x_outmin, int x_outmax, int y_outmin, int y_outmax ) {
int k, c;
double xn, yn;
int xp, yp;
c=0;
for( k = 0; k < m; k++ ) {
if(x>=0) xn = 1.-y+x;
else xn = 1.-y-x;
yn = x;
xp = (xn - xg_min)/(double)(xg_max-xg_min)*(double)(x_outmax-x_outmin)+x_outmin;
yp = (yn - yg_min)/(double)(yg_max-yg_min)*(double)(y_outmax-y_outmin)+y_outmin;
if(xp>=x_outmin && xp<=x_outmax &&

SKRIPTA IZ RAUNALNE GRAFIKE

166

yp>=y_outmin && yp<=y_outmax ) {


c = c+2;
if( c > 256 ) c = 0;
Image1->Canvas->Pixels[xp][yp] = RGB(c,c/2,(256-c)/2);
}
x=xn; y=yn;
}
}

Najvei broj parametara funkcije slui opisu prozora kroz koji emo gledati. Naime, toke
koje se dobiju postupkom lee relativno blizu ishoditu, pa bismo direktnim iscrtavanjem
dobili samo mrlju na zaslonu oko ishodita. Zbog toga vrimo skaliranje oekivanih raspona
(xg_min, xg_max) i (yg_min, yg_max) koje daje algoritam i raspona koje predstavlja zaslon
(x_outmin, x_outmax) i (y_outmin, y_outmax). Obino su rasponi algoritma (xg_min,
xg_max)=(-5,10), (yg_min, yg_max)=(-5,10) a rasponi definirani zaslonom (x_outmin,
x_outmax)=(0,319) i (y_outmin, y_outmax)=(0,199) pri rezoluciji 320x200.
Osnovna razlika izmeu generiranja ovog fraktala i npr. Mandelbrotovog je u tome to ovdje
svakom iteracijom dobijemo jednu toku koju bojimo, dok smo kod Mandelbrota ispitivali da
li niz divergira i tek nakon to smo "odvrtili" odreen broj koraka, dobili smo informaciju o
toci. U naem primjeru jednom kada "odvrtimo" iteraciju, fraktal je gotov! To za sobom
povlai i daleko veu brzinu generiranja ovog fraktala.

SKRIPTA IZ RAUNALNE GRAFIKE

167

18. PREGLED OSNOVNIH UREAJA VEZANIH UZ


RAUNALA I SLIKU
18.1. UVOD
Budui da ova skripta govori o raunalnoj grafici, skripta ne bi bila potpuna kada ne
bismo spomenuli i osnovne ureaje vezane uz prikaz i unos slike u raunalo. Pri tome mislim
prvenstveno na monitore kao ureaje na kojima se prikazuje slika, na printere koji sliku
ispisuju na papir te na skenere koji omoguavaju unos slike pohranjene na papiru u raunalo.
U ovom poglavlju osvrnuti emo se na vrste tih ureaja i osnovne principe rada.

18.2. MONITORI
18.2.1. OSNOVE RADA KATODNE CIJEVI (CRT)
Osnova rada prvih monitora, a danas i velike veine monitora jest upravo katodna
cijev. Katodna cijev je ureaj koji se sastoji od nekoliko osnovnih dijelova:
1.
2.
3.
4.
5.
6.
7.
8.

arna nit
Katoda
Kontrolna mreica
Sustav za fokusiranje
Sustav za vodoravni i okomiti otklon
Anoda (metalizacija)
Maska
Fosfor naparen na staklo

2 3 4

5'

6
8

Katodna cijev

SKRIPTA IZ RAUNALNE GRAFIKE

168

arna nit se utjecajem struje uari, te uari katodu. Pod utjecajem visoke temperature
dolazi do termike emisije elektrona iz katode. Ovi emitirani elektroni se proputaju kroz
kontrolnu mreicu te se sustavom za fokusiranje oblikuju u zraku elektrona. Zatim na zraku
djeluje sustav za vodoravni i okomiti otklon ime se precizno odreuje smjer zrake, i kao
posljedica toga i toka gdje e zraka udarati u staklo zaslona katodne cijevi. Nakon to je tako
odreen smjer zrake, zraka prolazi pokraj anode koja se nalazi na visokom pozitivnom
naponu (15 do 20 kV), i koja dodatno ubrzava elektrone u zraci (poveava ime kinetiku
energiju). Konano zraka prolazi kroz masku koja se nalazi ispred samog zaslona i udara u
sloj fosfora naparenog na unutranju stranu stakla zaslona. Prilikom ovog sudara elektroni
predaju svoju kinetiku energiju fosforu koji ulazi u pobueno stanje i tu energiju isijava
putem emisije fotona; time se generira svjetlost u toci pogoenoj zrakom. Koliki e biti
intenzitet ovog zraenja ovisi o kinetikoj energiji koju elektroni iz mlaza predaju fosforu
to je vea kinetika energija, vei e biti intenzitet emitirane svjetlosti. Mreica koja se
nalazi pred staklom osigurava da zraka tijekom svog putovanja ne pogaa bilo gdje, ve
iskljuivo u ona mjesta gdje je naparen fosfor; naime, ukoliko zraka pogodi tijelo mreice,
mreica je od vodljivog materijala i svi elektroni biti e apsorbirani, te nee pogaati u staklo
iza mreice. Kada zraka pogodi fosfor, fosfor e u pobuenom stanju ostati neko odreeno
vrijeme, i tijekom tog vremena emitirati e svjetlost. Ovo vrijeme naziva se perzistencija, i
poeljno je da je to krae, kako bi se na monitoru mogla prikazivati i slika koja se brzo
mijenja.
Jedan tip fosfora nakon uzbude emitira svjetlost tono odreene valne duljine odnosno
boje. Ukoliko elimo prikaz u boji, tada se umjesto jednog tipa fosfora koriste tri razliita
tipa, koji se nanose ili u obliku tri tokice (dots) ili u obliku tri linije (stripes), koja emitiraju
tri razliite boje crvenu, zelenu i plavu. Isto tako postoje tri topa koja generiraju tri
elektronske zrake.
Razliite implementacije katodnih cijevi i razliiti tipovi mreica rezultiraju razliitim
"kvalitetama" prikaza slike. Tako su se razvila dva osnovna tipa: CRT sa FST i CRT sa
TRINITRON cijevima, o kojima emo bitnije detalje izloiti u nastavku.

18.2.2. CRT SA FST


Kratica FST dolazi od engleskog Flat Square Tube. Ovaj tip cijevi poznat je jo i pod
nazivom shadow mask cijev. Radi se o cijevima kod kojih je prednja povrina dio plata
velike kugle. Naravno, da bi zaslon djelovao ravno, bitno je da radijus zakrivljenosti te kugle
bude to vei. Za dananje cijevi ovaj radijus iznosi desetke metara. Prednja maska izvedena
je kao sito, dakle sa nizom rupica koje osiguravaju precizno pogaanje fosforne tokice u
fosforescentnom premazu stakla. Nepovoljno kod ovakve izvedbe maske je vrlo velika
apsorpcija elektrona i kada to nije poeljno. Naime, maska uvijek apsorbira i do 80%
elektrona iz mlaza, to dovodi do toga da svega 20% elektrona pogaa fosfor i uzrokuje
emisiju svjetlosti. Kod ovog tipa cijevi topovi se izvode u dvije inaice: prva je delta raspored,
a druga on-line raspored (raspored u liniji).

Delta raspored topova


Raspored topova

On-line raspored topova

SKRIPTA IZ RAUNALNE GRAFIKE

169

Topovi
B
G
R

R
G
B

Sitasta reetka
Prikaz topova i sitaste reetke kod FST-a

18.2.3. CRT SA TRINITRON CIJEVI


Ovaj tip cijevi razvila je tvrtka Sony i u prvo vrijeme bila je koritena iskljuivo u
njihovim monitorima, no s vremenom prihvatili su je i drugi proizvoai (i to u boljim
modelima monitora). Karakteristika ovih cijevi je prednja povrina koja nije izvedena kao dio
kugle ve kao dio plata valjka. Na ovaj nain automatski je uklonjena zakrivljenost u
vertikalnom smjeru, a preostala zakrivljenost u horizontalnom smjeru savladava se velikim
radijusima zakrivljenosti. Kao rezultat ovoga nastale su FD (flat display) trinitron cijevi kod
kojih radijus horizontalne zakrivljenosti iznosi ak 50 metara.
Trinitron cijevi ne koriste sitastu masku kao to je to sluaj sa FST cijevima, ve kao
masku koriste velik broj vertikalno postavljenih tankih iica koje su uvrene samo na dva
kraja: na vrhu i na dnu cijevi. Uslijed zagrijavanja i sudara sa elektronskom zrakom ove iice
mogu poeti titrati, pa da bi se to sprijeilo, iice su dodatno uvrene sa jo jednom ili
dvije horizontalne niti (damper wires). Naalost, te zatezne iice onemoguavaju prolaz
zrake na tim mjestima, pa se prilikom prikaza velikih povrina intenzivne boje na zaslonu
moe primjetiti lagano zatamnjenje na tim mjestima. Fosforni premaz kod ovih je cijevi
naneen u obliku okomitih linija (stripes) budui da i maska ostavlja okomite proreze. Ovom
konstrukcijom maske doputa se daleko manja apsorpcija elektrona od strane maske nego to
je to bio sluaj kod FST-a, te je slika na monitorima jaeg intenziteta, svjetlija i kontrastnija.

SKRIPTA IZ RAUNALNE GRAFIKE

170

Zatezna iica

Zatezna iica

Maska

Uveani prikaz raspodjele fosfora


u okomite trake (stripes)

Maska i raspodjela fosfora kod TRINITRON cijevi

18.2.4. CROMACLEAR
CromaClear jo je jedna nova tehnologija o kojoj emo rei samo nekoliko osnovnih
stvari. Tehnologija je osmiljena u tvrtci NEC (Nippon Electric Company), a sama ideja nije
zapravo nita novo. Radi se o spajanju FST i TRINITRON tehnologija te pokuaju da se iz
obje tehnologije izvue samo najbolje. Pri tome se koristi sitasta maska kao to je to sluaj
kod FST-a, meutim otvori nisu jednoliki ve su izduenog heksagonalnog oblika, ime se
osigurava vea povrina kroz koju moe proi zraka. Fosforni premaz izveden je prema
TRINITRON receptu, dakle kao niz okomitih linija (stripes). Rezultat je vrlo kontrastna i
svijetla slika uz dodatno bolje fokusiranje elektronske zrake koje je posljedica uporabe sitaste
maske.

18.2.5. LCD ZASLONI


Kratica LCD oznaava zaslon sa tekuim kristalima (Liquid Crystal Display). Ovdje
se koristi svojstvo tekuih kristala koje omoguava promjenu polarizirajuih svojstava pod
utjecajem elektrinog polja. Naime, ukoliko nema elektrinog polja, tekui kristali zakreu
ravninu polarizacije svjetlosti za 90, dok pod utjecajem elektrinog polja ovaj efekt nestaje.
Presjek jednog LCD-a prikazan je na slici 18.2.5.1. To je struktura koja se sastoji od 6 slojeva.
Prvi sloj koji se nalazi na putu svjetlosti je vertikalni polarizator. Ambijentna svjetlost
(svjetlost iz okoline) titra u svim smjerovima okomito na pravac svog irenja; kaemo da
takva svjetlost nije polarizirana. Prolaskom kroz vertikalni polarizator titranja u svim
pravcima osim u okomitom se gue. Svjetlost koja proe kroz taj polarizator titra iskljuivo,
slikovito govorei, gore dolje. Slijedi prozirni sloj na kojem se nalaze vertikalno poloene
iice koje se spajaju na pozitivni potencijal. Trei sloj je sloj tekuih kristala koji se izvodi
kao vrlo tanak. Ovaj sloj zakree ravninu polarizacije svjetlosti za devedeset stupnjeva, ili ne,
ovisno o prisustvu elektrinog polja. etvrti sloj je proziran sloj na kojem se nalaze
horizontalne iice koje se spajaju na negativan potencijal. Peti sloj ini horizontalni
polarizator koji e propustiti samo one komponente svjetlosti koje titraju u horizontalnom

SKRIPTA IZ RAUNALNE GRAFIKE

171

smjeru, dakle, lijevo desno. Konano posljednji esti sloj je reflektirajui sloj koji svjetlost
reflektira natrag.

Reflektirajui sloj
Horizontalni polarizator
-V
Sloj tekuih kristala
+V

Vertikalni polarizator

5
4
3
2
1
Slika 18.2.5.1. Prikaz rada LCD-a

Vertikalne i horizontalne iice omoguavaju da se za svaku toku zaslona na


njihovom sjecitu stvori elektrino polje, ili ne, ovisno o tome kakva ta toka mora biti.
Ukoliko u toj toki nema polja, a do kristala na tom mjestu dopire svjetlost koja je prethodno
vertikalno polarizirana, kristali e okrenuti smjer titranja za 90; time e svjetlost sloj kristala
napustiti titrajui lijevo desno. Takva svjetlost biti e proputena kroz horizontalni
polarizator, odbiti e se od reflektirajueg sloja, ponovno e biti proputena kroz horizontalni
polarizator, zakrenuti e se u okomito titranje prolaskom kroz kristale, proi e kroz vertikalni
polarizator i izai e van. Toku emo doivjeti kao svjetlu. Ukoliko je u toci prisutno polje,
efekt zakretanja nee biti prisutan i na horizontalni polarizator doi e vertikalno polarizirana
svjetlost. Naravno, ovo e rezultirati gaenjem te svjetlosne zrake, i iz toke natrag nee izai
nita dobiti emo crnu toku.
LCD ima mnoge prednosti pred klasinim CRT izvedbama zaslona: izuzetno su lagani
i tanki i troe vrlo malo energije. Naalost, ukoliko ste dobro shvatili opisani mehanizam rada,
jasno Vam je da za prikaz slike LCD-i trebaju vanjski izvor svjetlost oni ne stvaraju
svjetlost kao to to rade CRT-ovi. Ovo je dakako mana, a ima ih jo: brzina promjene slike ne
moe biti velika jer kristali sporo prelaze iz jednog moda rada u drugi, ogranien je kut pod
kojim se vidi slika i zasloni su vrlo osjetljivi na pritisak.

18.2.6. ZASLONI S PLAZMOM


Ovaj tip zaslona opisati emo u samo nekoliko rijei. Na mjestu ukrtavanja elektroda,
dakle na mjestu na kojem postoji mogunost prikazivanja toke nalazi se plin XeNe. Pod
utjecajem elektrinog polja (dakle kada elimo prikazati toku) dolazi do ionizacije plina i

SKRIPTA IZ RAUNALNE GRAFIKE

172

dolazi do UV zraenja. Ovo UV zraenje pogaa atome fosfora koji prelaze u pobueno
stanje i sami poinju zraiti vidljivu svjetlost.
Dobre strane ove tehnologije su mogunost izrade zaslona velikih dijagonala (ak do
100 ina), te aktivan prikaz slike (za razliku od LCD-a koji je pasivan jer treba vanjsku
svjetlost za svoj rad). Loa strana lei u velikoj teini ovi zaslona (do 100 kg).

18.3. PISAI
18.3.1. OPENITO
Danas postoji nekoliko vrsta pisaa, od kojih u spomenuti matrine, laserske, tintne i
termo pisae. Danas su najpopularniji upravo laserski i tintni pisai, pa emo o njima rei
nekoliko rijei i upoznati se sa osnovnim naelima rada. Pregled e biti vie informativan
nego detaljan jer na ovom nivou nema potrebe ulaziti u sve pojedinosti.

18.3.2. LASERSKI PISAI


Osnovni mehanizam rada laserskog pisaa prikazan je na slici 18.3.2.1. Bubanj
mehanizma nabijen je negativnim nabojem. Mjesto na kojem laserska zraka pogodi bubanj
pod utjecajem svjetlosti se izbije, i taj dio povrine bubnja postane neutralno nabijen.
Laserska zraka pri tome po bubnju iscrtava redak po redak slike koju treba ispisati. Za
horizontalni hod zrake brine se rotirajue zrcalo. Nakon to zraka iscrta dio slike na bubnju,
taj dio dolazi do valjka na kojem se nalazi toner. Toner je takoer negativno nabijen, to znai
da se nee prihvaati na bubanj, osim na ona mjesta koja su neutralizirana laserskom zrakom.
U ovom koraku toner tvori sliku na bubnju. Daljnjom rotacijom bubnja toner dolazi do papira
koji je prethodno nabijen pozitivnim nabojem. Budui da je naboj tonera negativan, sav toner
sa bubnja prilijepiti e se za papir i time e na papiru nastati slika. Meutim, ovako nastala
slika vrlo je nepostojana. Zbog toga se papir naknadno pritie i zagrijava to dovodi do fuzije
tonera u papir. Na ovaj nain dobiva se kvalitetna i postojana slika.
Laserska zraka
Rotirajue zrcalo

Statiki
naboj

- -

Kazeta tonera
-

ienje

Fotoosjetljivi bubanj
+

+
Papir

Slika 18.3.2.1. Princip rada laserskog pisaa

SKRIPTA IZ RAUNALNE GRAFIKE

173

18.3.3. Tintni pisai


Tintni pisai zasnovani su na ideji izbacivanja to veeg broja to manjih kapljica tinte
to veom brzinom. Razlikujemo tri osnovne tehnologije kojima se ovo ostvaruje: BubbleJet
tvrtke Canon, Piezo tvrtke Epson te Thermal Ink Jet tvrtke HP. Iako su ovo tri razliite
tehnologije, naini rada BubbleJet tehnologije i Thermal Ink Jet dosta su slini pa emo ih
opisati zajedno.
Po nekim priama najstarija tehnologija termika ink-jet otkrivena je sasvim
sluajno kada je neki znanstvenik prouavao princip rada aparata za kavu. Ideja je da se tinta
sustavom kanala dovodi u komoru u kojoj je izveden grija velike snage. Kratkotrajni strujni
impuls izazvati e trenutno zagrijavanje grijaa i dovesti do vrenja tinte koja e ispuniti cijelu
komoru i stvoriti nadtlak koji e istisnuti malu koliinu tinte kroz mlaznicu (ovisno o izvedbi
ova koliina iznosi izmeu 3 i 6 pikolitara). U meuvremenu kratkotrajni impuls koji je
izazvao zagrijavanje grijaa ve je prestao pa se grija a time i tinta brzo hlade i ponovno
prelaze u tekue stanje. U tom trenutku u komori nastaje podtlak (jer je dio tinte istisnut) i taj
podtlak uvlai u komoru novu koliine tinte iz spremnika, nakon ega se postupak moe
ponoviti. U cjeloj prii postoji samo jedan bitan nedostatak ogranienje brzine rada zbog
vremena koje je potrebno da se grija i tinta ohlade.
Za razliku od termalne tehnologije koja koristi termiku ekspanziju tinte za postizanje
nadtlaka koji izbacuje kapljicu tinte kroz mlaznicu, Piezo tehnologija koristi svojstvo
odreenih kristala da se pod utjecajem elektrinog polja ire ili steu ime mijenjaju svoj
volumen. Tinta se dovodi u komoru u kojoj postoji ovakav kristal, i zatim se na kristal dovodi
strujni impuls. Rezultat je trenutna deformacija kristala i nastajanje nadtlaka koji izbacuje
kapljicu tinte kroz mlaznicu. Nestankom strujnog impulsa kristal se vraa u prvobitno stanje,
a budui da je dio tinte izbaen iz komore, u komori nastaje podtlak koji uvlai novu koliinu
tinte iz spremnika, i proces se opet moe ponavljati. Ova tehnologija omoguava vee brzine
izbacivanja tinte i regulaciju koliine tinte koja se izbacuje u kapljici.

SKRIPTA IZ RAUNALNE GRAFIKE

174

18.4. SKENERI
Skener je ureaj koji nam omoguava da sliku sa papira prenesemo na raunalo.
Osnovni mehanizam skenera prikazan je na slici 18.4.1.

Papir
Staklo
Izvor
svjetlosti
Zrcalo Z1

Zrcalo
Z2

Lea
RGB CCD ip
Slika 18.4.1. Princip rada skenera
Izvor svjetlosti fiksiran je sa zrcalom Z1, i oni zajedno putuju korak po korak sa lijeve
strane prema desnoj strani. Zraka svjetlosti od izvora se iri prema papiru kojega
"skeniramo", reflektira se od njegove povrine, zatim se reflektira od zrcala Z2, prolazi
kroz leu i dolazi do CCD ipa (CCD je kratica od Charge Coupled Device). CCD ip
sadri niz fotoelektrinih elemenata koji ovisno o osvjetljenju generiraju analogne
signale. Ovi analogni signali zatim se pretvaraju u digitalne A/D pretvornicima.
Preciznost A/D pretvornika uobiajeno moe biti 8, 10, 12 ili 16 bitova. Za svaku
toku papira koja se skenira dobiju se tri analogna signala (tri kanala) koji govore o
koliini crvene, zelene i plave komponente. Sva tri kanala pretvaraju se na A/D
pretvornicima pa za jednu toku dobijemo 24, 30, 36 ili 48 bitnu informaciju o boji (tri
kanala puta broj bitova jednog A/D pretvornika).
Prilikom skeniranja slika koje su nastale kao rezultat tiska, printanja ili nekog slinog
postupka, dolazi do nekih nepoeljnih pojava na koje treba obratiti panju. Jedna od
njih je Moir efekt. Radi se o tome da je svaka slika nastala ovim postupcima zapravo
sastavljena od niza sitnih tokica koje su dovoljno blizu da ih golim okom ne
primijetimo. Meutim, raspored tih tokica je pravilan, a rezultat je naina na koji je
slika ispisana. Oblik ovih tokica je najee eliptian, i organiziran u vjenie
sastavljene od etiri osnovne boje koje se koriste pri ispisu CMYK. injenica da golim
okom ovo ne vidimo ne znai nita, jer skener ove tokice jasno raspoznaje. I tu je
problem. Naime, slika koje se dobije izgleda grozno, jer umjesto boja kakve mi vidimo
imamo cijelo udo arenila. Ovaj problem moe se ukloniti odgovarajuim
programima nakon to se slika skenira.

SKRIPTA IZ RAUNALNE GRAFIKE

175

19. BOJE
19.1. UVOD
to su boje? Kako ovjek vidi boje? Kako moemo izmjeriti "boje"? Ovo su samo
neka od pitanja na koje emo pokuati dati odgovor kroz ovaj tekst. Boje su prvenstveno
vezane uz pojam svjetlosti. ovjek vidi predmete oko sebe zahvaljujui razvijenim senzorima
za elektromagnetske valove u podruju valnih duljina koje nazivamo vidljiva svjetlost. Ovo
podruje obuhvaa valne duljine od 390 do 760 nm, odnosno frekvencijski spektar izmeu
394.7 i 769.2 THz. Kod ovjeka postoje dvije vrste senzora koji su se specijalizirali za dvije
razliite namjene, vjerojatno kao prilagodba na ovjekovu okolinu. Naime, ovjek ivi, kada o
svjetlosti govorimo, u dva razliita okruenja: danu i noi.
No je karakteristina po tome to svjetlosti ima vrlo malo, odnosno vrlo je slabog
intenziteta. U takvom okruenju bitno je raspoznavati osnovne elemente okoline; dakle, bitno
je iskljuivo razaznavati razliite intenzitete svjetlosti, i na temelju toga raspoznavati objekte
koji ga okruuju. U ovakvoj okolini nema dovoljno informacija, a niti potrebe, za
raspoznavanjem boje. I upravo za ovakvo okruenje razvila se je prva vrsta osjetila tapii.
To su osjetila koja raspoznaju razliite intenzitete svjetlosti, i mogu "raditi" ve pri vrlo
malim koliinama svjetlosti.
Za razliku od noi, tijekom dana raspoloiva koliina svjetlosti je vrlo velika. Toliko
velika, i na toliko razliitih valnih duljina, da se na temelju te koliine svjetlosti moe dobiti
puno vie informacije od obinog intenziteta moemo raspoznavati boju! Za ovaj reim rada
razvijen je drugi tip osjetila unjii. Pomou tih osjetila ovjek je sposoban primati
informaciju o boji predmeta iz okoline. U ovjekovom oku postoje tri tipa ovih osjetila:
osjetilo za crvenu boju, osjetilo za zelenu boju te osjetilo za plavu boju. Naravno, odmah se
postavlja pitanje kako onda vidimo npr. utu boju, kada za nju nemamo osjetila. Odgovor na
ovo pitanje dati emo u nastavku.

19.2. SHEME ZA PRIKAZ BOJA PROSTORI BOJA


19.2.1. MODELI
Tijekom prouavanja svjetlosti i problematike vezane uz boje razvijeno je nekoliko
modela kojima se pokuava dobiti kontrola nad bojama. Prvi i osnovni model proizaao je iz
otkria kako ovjek vidi boje. Tako je nastao RGB model (Red, Green, Blue). Teorijskim
razmatranjima razvijen je XYZ model. Iz tehnikih razloga razvijen je CMY (Cyan, Magenta,
Yellow), a potom i CMYK (Cyan, Magenta, Yellow, blacK). Radi lakoe odabiranja boja
nastao je HSV model (Hue, Saturation, Value). Razvijeni su jo i modeli razreda Y (class Y
models) kao rezultat razvitka TV i video tehnike, i drugi.

SKRIPTA IZ RAUNALNE GRAFIKE

176

19.2.2. RGB MODEL


RGB model proizaao je iz pokuaja da se imitira nain na koji ovjek vidi boje.
Naime, ovjek ima osjetila za tri osnovne (primarne) boje: crvenu, zelenu i plavu. Uzevi tu
injenicu u obzir, pretpostavilo se je da se sve boje mogu prikazati kao linearna kombinacija
ovih triju osnovnih boja. Na ovaj nain, da bismo pamtili boju jedne toke, trebamo pamtiti tri
broja: koliko imamo crvene, koliko imamo zelene, te koliko imamo plave. Ako sve tri
komponente iznose nula, dobiti emo crno. Ako sve tri komponente iznose maksimum, dobiti
emo bijelo. Ukoliko su pojedine komponente prisutne sa razliitim udjelima, dobiti emo
razliite boje. Nijanse sivih boja dobivati emo ukoliko sve tri osnovne boje drimo jednake
po iznosu, i taj iznos variramo. Fizikalno si ovaj proces moemo zamisliti na slijedei nain:
imamo na raspolaganju tri svjetlosna izvora: izvore crvene, zelene i plave. Sva tri izvora tuku
u istu toku. Ukoliko su sva tri izvora ugaena, toka je crna jer nema nikakve svjetlosti koja
bi je obasjala. Ponemo li zatim paliti pojedine izvode, toka e poprimati razliite boje jer e
doi do mijeanja boja. Zbog ovog svojstva da se pojedine komponente svjetlosti zbrajaju,
ovo mijeanje zovemo aditivno mijeanje. Proces je prikazan na slici 19.2.2.1.

Slika 19.2.2.1.
Opisani model vrlo je jednostavan. Meutim, ima jednu manu. Sve boje ne mogu se
opisati pomou ovih triju primarnih boja, barem ne ako imamo u vidu fizikalnu sliku
mijeanja boja. Naime, pokazuje se da bi se sve boje mogle prikazati kada bi crveni izvor,
osim emitiranja crvene svjetlosti mogao i oduzimati crvenu svjetlost iz niega. Naime, za
prikaz svih boja, koeficijent crvene boje potezao bi se i u pozitivnom podruju, i u
negativnom podruju, kao to to prikazuje slika 19.2.2.2.

SKRIPTA IZ RAUNALNE GRAFIKE

177

V( )

390 nm
ljubiasta

760 nm
crvena

Slika 19.2.2.2.
Ovaj nedostatak rezultirao je sastankom CI (Commission Internationale de
l'clairage) gdje se je pokuao definirati model koji bi takoer imao samo tri primarne boje X,
Y i Z, i koji bi opisivao sve boje uz pozitivne koeficijente. Rezultat je prikazan na slici
19.2.2.3. :

V( )

390 nm
ljubiasta

760 nm
crvena

Slika 19.2.2.3.

CI je takoer definirala kromatski dijagram koji opisuje sve boje. Dijagram je


prikazan na slici 19.2.2.4.

SKRIPTA IZ RAUNALNE GRAFIKE

520

178

540

Green

560
Yellow

500

580
600

Cyan

Red

700

Purple
480
400

Slika 19.2.2.4.
Ovaj dijagram ima veliku vanost, utoliko to omoguava da bolje shvatimo nau
ogranienost u prikazivanju boja. Naime, ukoliko imamo na raspolaganju tri izvora boja (npr.
izvore crvene, zelene i plave boje), boje koje moemo prikazati u kromatskom se dijagramu
nalaze unutar trokuta koji zatvaraju te tri boje (slika 19.2.2.5.). Ovaj trokut naziva se
GAMUT.

520

540

Green

560
Yellow

500

580
600

Cyan

Red

700

Purple
480
400

Slika 19.2.2.5.

Boje koje se nalaze izvan tog trokuta, ne mogu se prikazati kombinacijom tih triju
boja! Ako pokuate umjesto sa tri izvora uporabiti etiri nita se ne mijenja; lik sada nee

SKRIPTA IZ RAUNALNE GRAFIKE

179

biti trokut, ve etverokut, i povrina e biti neto vea. No opet e biti boja koje ne moemo
prikazati!
Model RGB koristi se u ureajima u kojima je mogue ostvariti tri izvora boja i
njihovo mijeanje, na nain kako smo to opisali. To u praksi znai da e se model koristiti
prvenstveno u monitorima. Openito vrijedi: trokut koji razapinju boje topova u monitoru
naziva se GAMUT ureaja.

19.2.3. CMY/CMYK MODEL


Model CMY slijedi upravo obratnu filozofiju od RGB modela. Pretpostavka je da bez
ikakvih utjecaja na toku boja toke mora biti bijela. Boje emo dobiti tako da od bijele
oduzimamo pojedine komponente u razliitim iznosima. Osnovne boje koje se ovdje koriste
su Cyan (cijan), Magenta (neka verzija ljubiaste) i Yellow (uta). Ovo je primjer
subtraktivnog modela, i to je komplementarni model RGB modelu. tovie, ukoliko
normiramo pojedine komponente RGB modela (dakle, svake boje ima u iznosu od 0 do
maksimalno 1), tada vrijedi relacija:

C=1-R
M=1-G
Y=1-B
Slika 19.2.3.1. prikazuje mijeanje ovih osnovnih boja.

Slika 19.2.3.1.
Uvjet da je toka sama po sebi bijela ukoliko na nju ne djeluje nita nalazimo upravo
kod bijelog papira zbog toga se ovaj model koristi upravo kod printera. Zapravo, kod
printera se koristi CMYK model, koji je ekonomiziran CMY model. Naime, teorijske
pretpostavke i praksa obino se ba i ne slau najbolje, pa tako maksimalnim mijeanjem boja
CMY dobivamo crnu koja ba i nije onako crna kako bismo to eljeli. S druge strane, veina
dokumenata koja se danas jo uvijek ispisuje obilato koristi upravo crnu boju, to za ovaj

SKRIPTA IZ RAUNALNE GRAFIKE

180

model znai maksimalnu potronju svih boja a uope ne ispisujemo u boji. Zbog tih razloga,
u model je uvedena jo i crna boja, te je model dobio u oznaci slovo k od rijei blacK. Tako
se uvode slijedee relacije:

K=min(C,M,Y)
C=C-K
M=M-K
Y=Y-K

19.2.4. HLS MODEL


HLS model (Hue, Lightnes, Saturation) nastao je iz potrebe da se olaka odabir boje.
Naime, prethodno opisani modeli vrlo su nezgrapni kada je rije o odabiru boje. Zamislite da
ste nali kombinaciju koja vam daje neku nijansu naranaste boje, i sada elite dobiti samo
malo zasieniju boju, ili pak malo svjetliju. to uiniti da bi se to postiglo? Problem je u tome
to treba mijenjati sve tri komponente RGB modela, a to znai smrt jednostavnoj uporabi.
Ideja je da promjenom vrijednosti H obilazimo sve boje. Kada pronaemo odgovarajuu boju,
sa L odredimo eljenu svjetlinu, te sa S njezinu zasienost.
Komponente H, L i S ine stoac, prema slici 19.2.4.1.

Slika 19.2.4.1.
H je predstavljen kutom u odnosu na pozitivnu x os, i njime se biraju boje. Vrijedi slijedee:

H vrijednost
0
60
120

Odgovarajua boja
Plava
Magenta
Crvena

SKRIPTA IZ RAUNALNE GRAFIKE

181

180
240
300

uta
Zelena
Cijan

Ukoliko zasienost stavimo na nulu (S=0), tada promjenom svjetline (L) od 0 do 1


dobivamo sve nijanse sive boje, ukljuujui crnu (L=0), i bijelu (L=1).

19.3. GAMMA KOREKCIJA


Zamislimo da se nalazimo pred slijedeim problemom: imamo na raspolaganju 256
lokacija na kojima moemo pamtiti intenzitet boje. Intenzitet je u rasponu od 0 do 1 (0 je
minimalni, 1 maksimalni). Potrebno je odrediti koliki intenzitet emo pohraniti u pojedinu
lokaciju, a da pri tome dobijemo takvu raspodjelu koja e biti uoljiva ljudskom oku. Npr.
intenzitete moemo raspodijeliti prema slici 19.3.1.

lokacije
255

0.1

intenzitet

Slika 19.3.1
Lokacija 0 sadravati e intenzitet 0, lokacija 255 intenzitet 0.1, dok e intenziteti izmeu 0 i
0.1 biti linearno pridjeljeni lokacijama 1 do 254. Meutim, ovakva raspodjela nije dobra jer
emo cijelu sliku nacrtanu pomou ovakvih intenziteta jedva vidjeti naime, intenziteti su
raspodijeljeni kao da je na snazi opa opasnost i metode zamraivanja. To nije dobro. Moda
je bolja raspodjela prikazana na slici 19.3.2.

SKRIPTA IZ RAUNALNE GRAFIKE

182

lokacije
255

intenzitet

Slika 19.3.2

Tu je intenzitet takoer linearno raspodijeljen, i to tako da se u pojedinim lokacijama nalaze i


najmanji, a u pojedinim i najvei intenziteti. To je, dakako, bolje. Meutim... Ljudsko oko
intenzitete ne raspoznaje ba na ovaj nain. Naime, da bi oko primijetilo da se je intenzitet
poveao, to poveanje mora biti za potenciju vee! Naime, karakteristika ljudskog oka je
logaritamska! To znai da oko primijeti intenzitet koji je vei za 1 tek kada logaritam tog
intenziteta poraste za jedan, a logaritam poraste za jedan samo ako potencija poraste za jedan!
Dakle, umjesto linearne raspodjele intenziteta sa slike 19.3.2:

I0 = I0
I1 = r I 0

I 2 = (r + r ) I 0
...

I n = (n r ) I 0

treba napraviti eksponencijalnu raspodjelu intenziteta:

I0 = I0
I1 = r I 0
I2 = r 2 I0

(rel. 19.3/1)

...

In = r n I0
Ujedno znamo da je In upravo jednak 1, pa moemo izraunati faktor r:
1

1 n
I n = r n I 0 = 1 r =
I0
U opem sluaju se, dakle, moe napisati formula:

(rel. 19.3/2)

SKRIPTA IZ RAUNALNE GRAFIKE

1
j
I j = r I 0 =
I0

1
n

183

1
I 0 = (I 0 ) n

(rel 19.3/3)

Kako u naem sluaju imamo 256 razina, odnosno razine od 0 do 255, vrijedi:
1
r =
I0

255
,

I j = (I 0 )

j
255

j = 0,1,...,255

Ovakva raspodjela prikazana je na slici 19.3.3.

lokacije
255

intenzitet

Slika 19.3.3

Pogledajmo sada situaciju sa klasinim CRT monitorom. Osvjetljenje neke toke na


zaslonu monitora rezultat je pogaanja te toke (odnosno fosfora u toj toci) zrakom
elektrona. Intenzitet tako dobivene svjetlosti to je vei, to vie elektrona pogaa tu toku u
jedinici vremena. Matematiki se ovisnost intenziteta moe opisati relacijom:

I = k N
(rel 19.3/4)

I...intenzitet koji emitira fosfor


k...konstanta
...konstanta

Broj elektrona proporcionalan je naponu koji uzrokuje pojavu, te vrijedi:

I = k (k1 V ) = k k1 V = K V
(rel 19.3/4)

I...intenzitet koji emitira fosfor


k,k1,K...konstanta
...konstanta

Ukoliko je poznat intenzitet koji elimo dobiti, napon koji je potreban za njegov prikaz dobiti
emo izjednaavanjem relacija 19.3/1 i 19.3/4:
1

K V j = r I 0 V j = r j 0
K

(rel: 19.3/5)

SKRIPTA IZ RAUNALNE GRAFIKE

184

Treba uoiti da je karakteristika samog monitora, pa e zbog toga na razliitim


monitorima odgovarajui naponi biti razliiti ili pak isti, ali tada e prikazane slike biti
razliite, a to ipak ne elimo.

19.4. PAMENJE BOJA NA RAUNALU


Rad sa bojama na raunalima izveden tako da se moe prilagoditi potrebama i
memorijskim zahtjevima, odnosno raspoloivim memorijskim resursima samog raunala.
Osnovni nain prezentacije boje na raunalu je putem RGB sustava. Dakle, za svaku boju
pamte se tri komponente: crvena, zelena i plava. Meutim, tu postoje dva moda rada:
Uporaba paleta boja
Direktna reprezentacija boja

Prva metoda razvijena je zbog utede memorije, i time naravno namee odreena
ogranienja. Glavni faktor koji odreuje koliko emo razliitih boja moi prikazati naziva se
dubina. Ovisnost dubine boja i broja moguih razliitih boja dana je relacijom 19.4/1:
n = 2d

n...broj raspoloivih boja


d...dubina

Dubina se mjeri u broju bitova. Ideja je da se formira jedna tablica koja ima onoliko
elemenata koliko mi to odredimo preko dubine. Svaki taj element sadravati e tri
komponente: koliinu crvene, koliinu zelene te koliinu plave boje. Boja pojedinog piksela
(npr. boja j) odreivati e se brojem od 0 do n-1, i odgovarati e onoj boji ija se definicija
nalazi u odgovarajuem elementu tablice (dakle, j-ti element). Slika 19.4.1. prikazuje kako to
radi.
Zapis slike u memoriji
x
y

R
0
1
2
3
4
5
6
7

00
FF
00
00
FF
FF
00
FF

G
00
00
FF
00
FF
00
FF
FF

B
00
00
00
FF
00
FF
FF
FF

Paleta boja

Slika 19.4.1.

Paleta boja definira slijedee boje:


Indeks u paleti boja
0
1
2
3

Boja
Crna
Crvena
Zelena
Plava

CRT

SKRIPTA IZ RAUNALNE GRAFIKE

4
5
6
7

185
uta
Magenta
Cijan
Bijela

U navedeno primjeru, na koordinata (x,y) nalazi se boja 1. Prije iscrtavanja na zaslonu,


gleda se u paletu boja i pronalazi pod brojem 1 definicija crvene boje. Na zaslonu se crta
crvena toka. U ovom primjeru tablica je imala 8 elemenata jer je zadana dubina iznosila 3
bita. Ukoliko odaberemo dubinu od 8 bitova, imati emo na raspolaganju 256 moguih boja.
Ova metoda dobra je kada nemamo puno memorije na raspolaganju, a niti ne elimo
prikazivati true-color slike.
Poveavamo li dubinu do veliine od 24 bita, paleta boja nam se vie ne isplati jer
paletom boja moemo definirati jednaki iznos boja kao i da direktno definiramo boju. Naime,
uz 24 bita po jednom pikselu, bitove moemo grupirati u grupe po 8: 8 bitova za crvenu, 8
bitova za zelenu i 8 bitova za plavu. U tom sluaju vie ne koristimo palete, ve se za svaki
piksel direktno definira boja. Mana ove metode je to zahtjeva enormne koliine memorije za
pohranu malo vee slike. Metoda je prikazana na slici 19.4.2.
Zapis slike u memoriji
x
y

FF 00 00
CRT

Slika 19.4.2.

Sada na lokaciji (x,y) pie kompletan zapis boje: FF 00 00 to odgovara crvenoj boji.

SKRIPTA IZ RAUNALNE GRAFIKE

186

20. DODATAK A.
PROBLEM I.
r r r
Zadan je trodimenzionalni prostor S pomou tri bazna vektora tog prostora: e , f i g . Vektori
su jedinini (norma im je 1) te meusobno okomiti. Zadana je toka T sa koordinatama
(Tx,Ty,Tz) u tom prostoru. Umjesto prostora S eli se koristiti prostor S' zadan baznim
r r
r
r r
r
vektorima a , b i c . Pri tome je poznat zapis vektora a , b i c pomou komponenti u
prostoru S. Zapis glasi:
r
r
r
r
a = ax e + a y f + az g
r
r
r
r
b = bx e + b y f + bz g (rel:20/1)
r
r
r
r
c = cx e + c y f + cz g
r r r
Bazni vektori a , b i c takoer su jedinini i meusobno okomiti.

Potrebno je pronai koje e koordinate toka T imati gledano iz prostora zadanog baznim
r r r
vektorima a , b i c ?
Rjeenje.
Toka T u prostoru S' imati e zapis pomou baznih vektora prostora S'. To znai da e
proizvoljna toka T imati u prostoru S' zapis:

T = [

] = a + b + c (rel:20/2)

Ukoliko u prethodni izraz uvrstimo (rel:20/1), dobiti emo:

r
r
r
r
r
r
r
r
r
T = a x e + a y f + a z g + bx e + b y f + bz g + c x e + c y f + c z g

odnosno nakon grupiranja:


r
r
r
T = ( a x + bx + c x ) e + ( a y + b y + c y ) f + ( a z + bz + c z ) g

(rel:20/3)
r r r
Posljednji izraz daje zapis toke T preko baznih vektora e , f i g (dakle zapis toke u prostoru
r r r
S). No mi ve znamo zapis toke T preko baznih vektora e , f i g ; on glasi:

T = Tx

Ty

r
r
r
Tz = T x e + T y f + T z g

(rel:20/4)

Izjednaavanjem zapisa danih u (rel:20/3) i (rel:20/4) dobije se sustav:

SKRIPTA IZ RAUNALNE GRAFIKE

a x + bx + c x = Tx
a y + by + c y = Ty

187

(rel:20/5)

a z + bz + c z = Tz
U ovom sustavu nepoznanice su jedino koordinate toke T u prostoru S': , i . Rijeimo
najprije nepoznanicu . Prema pravilima iz linearne algebre, moemo pisati:

Tx
Ty

bx
by

cx
cy

Tz

bz

cz

ax
ay
az

bx
by
bz

cx
cy
cz

Tx (b y c z c y bz ) T y (bx c z c x bz ) + Tz (bx c y c x b y )

a x (b y c z c y bz ) a y (bx c z c x bz ) + a z (bx c y c x b y )

(rel:20/6)

Da bismo razrijeili to nam posljednji izraz zapravo govori, treba se neega prisjetiti. Ako
r r
imamo zadane vektore b i c , kako pronai neki vektor koji bi bio okomit na oba? Jedan od
naina je x-produktom.
r
e
r
= bx

r
f
by

r
g
r
r
r
bz = (b y c z bz c y ) e (bx c z bz c x ) f + (bx c y b y c x ) g

cx

cy

cz

(rel:20/7)

r r
Komponente tog vektora koji je okomit na polazne vektore b i c definirane su ptrehodnim
r r
izrazom (rel:20/7). Ukoliko su vektori b i c jedinini, tada je i vektor odreen x-produktom
r
r
takoer jedinini. I sada treba dobro razmisliti. Ukoliko je vektor okomit i na vektor b , i
r
r
r
na vektor c , i pri tome je jedinini, tada je vektor ili jednak vektoru a , ili je jednak minus
r
vektoru a ! Naime, budui da se nalazimo u 3D prostoru, tada su dva vektora koja su okomita
r
r
na iste meusobno okomite vektore uvijek kolinearni! Kako su i vektor , i vektor a
istovremeno i jedinini, tada se mogu razlikovati samo po smjeru! Dakle vrijedi:
r r
= a (rel:20/8)

ili
r
r
= a (rel:20/9)
r
Prema relaciji (rel:20/7) komponente vektora iznose:

SKRIPTA IZ RAUNALNE GRAFIKE

188

x = b y c z bz c y

y = (bx c z bz c x )

(rel:20/10)

z = bx c y b y c x
Uvrtavanjem (rel:20/10) u (rel:20/6) dobiva se:

Tx x + T y y + Tz z

(rel:20/11)

ax x + a y y + az z

Ukoliko vrijedi (rel:20/8), tada (rel:20/11) prelazi u:


r r r r
Ta Ta r r
= r r = r 2 = T a (rel:20/12)
=
ax ax + a y a y + az az a a
a
Tx a x + T y a y + T z a z

r
Nazivnik u (rel:20/12) nestaje jer je norma vektora a jednaka 1.

Ukoliko vrijedi (rel:20/9), tada (rel:20/11) prelazi u:

( )

r r
Ta
= r r =
=
a x a x a y a y a z a z (a a )
Tx a x T y a y Tz a z

r r
Ta r r
r 2 = T a (rel:20/13)
a

jednaka je skalarnom
Obje pretpostavke (rel:20/8 i rel:20/9) vode na isti rezultat: koordinata
r
produktu radij vektora toke T (zapisane u prostoru S) i vektora a (zapisanog u prostoru S).

Identinim se postupkom moe pokazati da openito vrijedi za sve koordinate:


r r
r r
= Tb
r r
= Tc

= Ta

(rel:20/14)

Ovi izrazi vrijede tako dugo dok se potuju pretpostavke uz koje su izvedeni, a to su:

Svi bazni vektori su jedinini.


Svi bazni vektori pojedinog prostora su meusobno okomiti.

Relaciju (rel:20/14) moemo pisati i u matrinom obliku:


a x bx c x
r r r r r r
T = [ ] = Tx T y Tz a y b y c y = T a T b T c
a z bz c z

(rel:20/15)

PROBLEM II.
Zadani su sustavi S i S' kao i u prethodnom razmatranju, no poznate su koordinate toke T u
sustavu S': T=[ ] a trai se zapis toke u sustavu S: T=[Tx Ty Tz].

SKRIPTA IZ RAUNALNE GRAFIKE

189

Rjeenje:
U prethodnom razmatranju pokazali smo da vrijedi relacija (rel:20/5). Ona direktno daje
vrijednosti pojedinih komponenata u prostoru S. Matrino relacija moe zapisati:
a x a y a z

Tx T y Tz = [ ] bx b y bz (rel:20/16)
c x c y c z

Relaciju (rel:20/15) mogli smo izvesti direktno iz relacije (rel:20/16) mnoenjem cijele
jednadbe sa desne strane inverzom matrice baznih vektora za koju se pokazuje da je jednaka
upravo transponiranoj matrici:

[T

Ty

Tz = [

a x

] bx
c x

ay
by

a x

Tz bx
c x

ay
by

a x
Tz a y
a z

bx

cy

a x

bx
c x

az

bz
c z

ay
by
cy

az

bz
c z

to daje:

] = [Tx T y

cy

az

bz
c z

= Tx

Ty

a x

Tz bx
cx

ay
by
cy

az

bz
c z

iz ega slijedi:

] = [Tx T y

by
bz

cx
c y
c z

to je upravo relacija (rel:20/15)! Naravno, sada e "matematiari" odmah graknuti da kako se


za inverz matrice moe uzeti transponirana matrica. Ovo dakako openito ne vrijedi, no
uzevi u obzir od ega je matrica graena, lako je pokazati da to u ovom sluaju vrijedi:
a x

bx
c x

ay
by
cy

a z a x

bz bx
c z c x

ay
by
cy

a x
az

bz = bx
c x
c z

ay
by
cy

a z a x

bz a y
c z a z

bx
by
bz

r r r r r v
c x a a a b a c
r r r r r v
c y = b a b b b c = I
v r v r v v
c z c a c b c c

r r r
jer su vektori a , b i c meusobno okomiti pa su im skalarni produkti jednaki nuli, odnosno
budui da su vektori jedinini, tada je skalarni produkt vektora sa samim sobom jednak 1.

SKRIPTA IZ RAUNALNE GRAFIKE

190

RJEENI ZADACI
ZADATAK 1.
Odredi jednadbu pravca u 2D koji prolazi
a) kroz toke radnog prostora TS=(1,2) i TE=(5,10) i diskutiraj poloaj toaka (3,6), (3,7)
i (7,14) u odnosu na dvije poznate toke pravca.
b) kroz toke homogenog prostora TS=(1,2,1) i TE=(10,20,2) i provjeri lei li toka
TQ=(6,12,2) na pravcu.
Rjeenje:
a) Pravac emo zapisati u parametarskom obliku
TP = (TE TS ) + TS

to uvrtavanjem zadanih koordinata daje

[TP1 TP 2 ] = ([TE1 TE 2 ] [TS1


= ([5 10] [1 2]) + [1 2]
= [4 8] + [1 2]

TS 2 ]) + [TS 1 TS 2 ]

Toka (3,6)
(3,6) = (4,8) + (1,2)
1
2

1
6 = 8 + 2 =
2

3 = 4 +1 =

Toka (3,6) je na pravcu jer je jednak za


sve komponente. Dodatno, kako je 0<<1
zakljuujemo da se toka nalazi izmeu
toaka TS i TE.

Toka (3,7)
(3,7) = (4,8) + (1,2)
1
2

5
7 = 8 + 2 =
8

3 = 4 +1 =

Toka (7,14)

Toka (3,7) ne nalazi se na pravcu jer ne


moe istovremeno poprimiti dvije razliite
vrijednosti.

SKRIPTA IZ RAUNALNE GRAFIKE

(7,14) = (4,8) + (1,2)


3
2

3
14 = 8 + 2 =
2
7 = 4 +1 =

191
Toka (7,14) nalazi se na pravcu. Kako je
>1, zakljuujemo da se toka nalazi iza
toke TE, tj. toka nije dio segmenta pravca
odreenog tokama TS i TE.

Drugi nain rjeavanja zadatka temelji se na implicitnom zapisu jednadbe pravca i to u


homogenom prostoru. Toke TS i TE prebaciti emo u homogeni prostor:
TSh = (1,2,1)

TEh = (5,10,1)

U poglavlju 2.2.1 izvedena je jednadba za implicitni oblik pravca u radnom prostoru:


(TE 2 TS 2 ) TP1 (TE1 TS 1 ) TP 2 (TE 2 TS 2 ) TS1 + (TE1 TS1 ) TS 2 = 0
Uvrtavanjem koordinata TS i TE dobiva se:
(10 2) TP1 (5 1) TP 2 (10 2) 1 + (5 1) 2 = 0
8 TP1 4 TP 2 + 0 = 0
Uvrtavanjem homogenih koordinata za toku TPh dobiva se:
8 TPh1 4 TPh 2 + 0 hP = 0
ili matrino:

[TPh1

TPh 2

8
hP ] 4 = 0
0

Sada moemo pomou ovog oblika diskutirati poloaj pojedinih toaka u ovisnosti o pravcu.
Toka (3,6).
Proirujemo toku u homogeni prostor: (3,6,1)
8
[3 6 1] 4 = 3 8 6 4 + 1 0 = 24 24 + 0 = 0
0
Zakljuak: toka (3,6) nalazi se na pravcu. Gdje se nalazi u odnosu na toke TS i TE iz ovog se
oblika ne moe odrediti.
Toka (3,7).
Proirujemo toku u homogeni prostor: (3,7,1)
8
[3 7 1] 4 = 3 8 7 4 + 1 0 = 24 28 + 0 = 4
0

SKRIPTA IZ RAUNALNE GRAFIKE

192

Zakljuak: toka (3,7) nalazi se ispod pravca. Gdje se nalazi u odnosu na toke TS i TE iz
ovog se oblika ne moe odrediti.
Toka (7,14).
Proirujemo toku u homogeni prostor: (7,14,1)
8
[7 14 1] 4 = 7 8 14 4 + 1 0 = 56 56 + 0 = 0
0
Zakljuak: toka (7,14) nalazi se na pravcu. Gdje se nalazi u odnosu na toke TS i TE iz ovog
se oblika ne moe odrediti.
b) Idemo odmah primijeniti parametarsku jednadbu, smatrajui homogenu koordinati
"normalnom" koordinatom.

[TP1 TP 2 hP ] = ([TE1 TE 2 hE ] [TS1 TS 2


= ([10 20 2] [1 2 1]) + [1 2 1]
= [9 18 1] + [1 2 1]

hS ]) + [TS1 TS 2

hS ]

Kada kao TP uvrstimo toku (3,6,1)(6,12,2) dobiti emo:

[3

6 1] = [9 18 1] + [1 2 1]

to je ekvivalentno sustavu od tri jednadbe sa jednom nepoznanicom:


Izgleda kao da toka (3,6,1) ne lei na
pravcu! No pogledate li malo bolje pravac i
sve toke, vidjeti ete da pravac prolazi kroz
2
6 = 18 + 2 =
toke u radnom prostoru (1,2) i (5,10) te da
9
smo upravo ispitivali je li toka (3,6) na tom
1 = 1 + 1 = 0
pravcu. Maloprije smo vidjeli da jest. A sada
tvrdimo da nije? Tu neto ne valja!
U emu je tos? Pa zapravo je dosta jednostavno vidjeti o emu se radi. Mi smo primjenom
parametarskog oblika jednadbe pravca pretpostavili da se sve koordinate nekako mijenjaju
r
ovisno o vektoru pravca v P i parametru . I doista, kada govorimo o pravcu u radnom
prostoru, ovo je razumna pretpostavka. No primjenjujui ovu pretpostavku na pravac zapisan
preko homogenih koordinata, pretpostavka ne vrijedi! Naime, homogeni parametar toke ne
mora slijediti apsolutno nikakav zakon! Pa rekli smo ve da jedna toka u radnom prostoru
ima beskonano mnogo prikaza u homogenom prostoru. Tako pravac koji prolazi tokom
(1,2) u radnom prostoru, prolazi toakama (1,2,1),(2,4,2),(3,6,3)... u homogenom prostoru.
Da bismo mogli koristiti parametarski oblik jednadbe pravca, potrebno se je pridravati
jednog malog dogovora: sve toke treba prikazati pomou istog homogenog parametra. Ako
r
to uinimo, tada e vektor pravca v P kao komponentu homogenog parametra imati vrijednost
0, te e jednadba pravca direktno preslikavati homogeni parametar poetne toke pravca u
svaku drugu toku pravca. Dakle, pravilo kae: sve toke treba prikazati pomou istog
homogenog parametra. Idemo odabrati najjednostavnije: h=1. Tada nae toke glase:
3 = 9 +1 =

2
9

TS = (1,2,1), TE = (5,10,1), TQ = (3,6,1)

SKRIPTA IZ RAUNALNE GRAFIKE

[TP1
= ([5
= [4

TP 2

hP ] = ([TE1 TE 2

hE ] [TS1 TS 2

193

hS ]) + [TS1 TS 2

hS ]

10 1] [1 2 1]) + [1 2 1]
8 0] + [1 2 1]
1
2
1
6 = 8 + 2 =
2

3 = 4 +1 =

Sada je sve u redu. Toka (3,6,1) doista lei


na pravcu. Treba uoiti to se je sada
dogodilo. Kako sve toke imaju isti
homogeni parametar, homogeni parametar
vektora pravca iznosi nula i dobije se
jednadba: 0 = 0

1
2
Kako je ova jednadba ispunjena za svaki parametar , odabiremo ba onaj koji nam treba da
pokaemo kako je toka na pravcu!
1 = 0 + 1 R, npr. =

ZADATAK 2.
Odredi najmanju udaljenost izmeu dva pravca koji nisu paralelni. Pravci su zadani u
parametarskom obliku:
r
T P = v P + TS
r
TP' = v P' + TS'
Pronai rjeenje za sluaj:
r
v p = [1 0 0]
r
v P' = [0 1 0]

TP = [1 1 0]

TP' = [1 0 2]
Rjeenje.

SKRIPTA IZ RAUNALNE GRAFIKE

T' p

v' p

194

T' X

Tp

vp

vX
TX

Najmanja udaljenost izmeu dva pravca dobiva se na onom mjestu gdje je spojnica ta dva
pravca okomita i na jedan i na drugi pravac. Neka se ta spojnica protee od toke T X na
jednom pravcu do toke T X' na drugom pravcu. Spojnica takoer lei na pravcu. Taj pravac
r
opisati emo vektorom pravca v X i poetnom tokom T X . Kako je spojnica okomita na oba
r
pravca, slijedi da je vektor pravca v X okomit na vektore pravaca oba pravca:
r r
vP v X = 0
r r
v P' v X = 0
Takoer toka T X lei na pravcu pa vrijedi:
r
T X = v P + TS
Toka T X' lei na drugom pravcu pa vrijedi:
r
TX' = vP' + TS'
Toke T X i T X' lee na spojnici pa vrijedi:
r
T X' = v X + T X
Ovih sedam jednadbi raspada se na 11 jednadbi sa 12 nepoznanica (nakon raspisivanja po
r
komponentama) te je oito da rjeenje nije jedinstveno (kritini su v X i jer o njima nita
r
nismo rekli). Sustav moemo upotpuniti zahtjevom da vektor v X nastane ba kao razlika
r
toaka T X' i T X , odnosno: v X = T X' - T X , i tada vrijedi =1. No unato tome sustav je
preglomazan da bi ga ili raunati runo. Zbog toga emo si malo olakati problem i krenuti u
rjeavanje postupno. Ve je reeno da zadani pravci nisu paralelni. To znai da im vektori
pravaca nisu kolinearni. Zbog toga moemo jednostavno nai vektor koji je okomit na oba
pravca. Ovakvih vektora ima beskonano (i svi su meusobno kolinearni, tj. lee na istom
pravcu, samo su razliito "dugaki"). No nama treba bilo koji od njih. Pa jednog takvog
moemo dobiti kao npr. x-produkt. Ili moemo rijeiti sustav koji nastaje iz uvjeta okomitosti:
r r
vP v X = 0
r r
v P' v X = 0
Ovo je sustav dvije jednadbe sa tri nepoznanice. Sustav oito nije jednoznaan ba zbog
injenice da nismo nita rekli o eljenoj duini (odnosno normi) vektora. Uz zadane
vrijednosti za vektore, i odabirom v X 3 = 1 slijedi: v X 1 = 0, v X 2 = 0 , tj. v X = [0 0 1]. Sada

SKRIPTA IZ RAUNALNE GRAFIKE

195

kada smo pronali okomiti vektor, iskoristimo injenicu da T X lei na jednom pravcu, te da
drugi kraj spojnice lei na drugom pravcu i na samoj spojnici:
r
T X = v P + TS
r
r
T X + v X = v P' + TS'
Ovo se raspada u sustav od 6 jednadbi sa 6 nepoznanica, no uz zadane toke rjeenje se
dobije trivijalno:
=0

=1
=2

r
Udaljenost izmeu dva zadana pravca jednako je duljini vektora v X , tj.
r
2
2
2
d = v X = (v X 1 ) + (v X 2 ) + (v X 3 ) = 2 1 = 2

ZADATAK 3.
Odredi najmanju udaljenost izmeu dva paralelna pravca. Pravci su zadani u parametarskom
obliku:
r
TP = v P + TS
r
TP' = v P + TS'
Rjeenje.
T1

v1

T2

prvi pravac

d
v2
T3

drugi pravac

Slika uz 3. zadatak

Budui da su pravci paralelni, pronaemo li dvije toke na jednom pravcu i jednu toku na
drugom pravcu, te toke lee u ravnini i ine trokut. Toke emo odrediti sasvim proizvoljno.
Npr.
r
T1 = T p ( = 0) = v P 0 + TS = TS
r
r
T2 = T p ( = 1) = v P 1 + TS = v P + TS
r
T3 = TP' ( = 0) = v P 0 + TS' = TS'

SKRIPTA IZ RAUNALNE GRAFIKE

196

r
Poznavajui toke T1 i T2, imamo vektor v1 = T2 T1 . Poznavajui toke T1 i T3, imamo
r
r r
vektor v 2 = T3 T1 . Kut to ga ine v1 i v 2 moe se izraunati:
r r
v1 v 2
r r
cos (v1 , v 2 ) = r r
v1 v 2
No taj isti kut odreen je odnosom katete koja predstavlja visinu trokuta, i hipotenuze koju
r
predstavlja udaljenost izmeu toaka T3 i T1, a to je upravo norma vektora v 2 . Slijedi:

d
r r
r r
sin (v1 , v 2 ) = 1 cos 2 (v1 , v 2 ) = r
v2
slijedi da je
r r
r 2
d 2 = 1 cos 2 (v1 , v2 ) v2

Kosinus se moe odmah izraunati, te uvrtavanjem u posljednju relaciju dobiva se i kvadrat


udaljenosti.

ZADATAK 4.
Odredi najmanju udaljenost izmeu toke T=(T1,T2,T3) i pravca zadanog u parametarskom
r
obliku TP = v P + TS .
Rjeenje.

T
TS
d

vp

TX
Slika uz 4. zadatak

Na pravcu treba odrediti onu toku TX koja je najblia toki T. To e biti ona toka za koju je
spojnica povuena iz T prema TX okomita na pravac (odnosno vektor pravca). Dobiju se
jednadbe:

(T TX ) vrP

= 0 ... uvijet okomitosti


r
T X = v P + TS ... T X pripada pravcu

Sustav se raspada u etiri jednadbe sa etiri nepoznanice. Dobije se:

SKRIPTA IZ RAUNALNE GRAFIKE

197

(T1 TX 1 ) vP1 + (T2 TX 2 ) vP 2 + (T3 TX 3 ) vP 3 = 0


TX 1 = vP1 + TS 1
TX 2 = vP 2 + TS 2
TX 3 = vP 3 + TS 3

Ako se tri posljednje jednadbe uvrste u prvu, dobiti e se jednadba sa nepoznanicom :

vP1 (T1 TS 1 ) + vP 2 (T2 TS 2 ) + vP 3 (T3 TS 3 )


vP21 + vP2 2 + vP2 3

Sada se iz jednadbi za Txi mogu izraunati pojedine komponente toke TX jednostavnim


uvrtavanjem parametra . Zadana udaljenost naposljetku je jednaka udaljenosti toaka T i
TX, odnosno normi vektora T-TX.
d=

(T1 TX 1 )2 + (T2 TX 2 )2 + (T3 TX 3 )2

ZADATAK 5.
Odredi sjecite dva pravca. Pravci su zadani u parametarskom obliku:
r
T P = v P + TS
r
TP' = v P' + TS'
Rjeenje.
Pravci se mogu sjei, i ne moraju. Ukoliko se sijeku, tada postoje takvi i da TP = TP' . Ako
se ovo napie po komponentama, slijedi:
v P1 + TS 1 = v P' 1 + TS'1
v P 2 + TS 2 = v P' 2 + TS' 2
v P 3 + TS 3 = v P' 3 + TS' 3

Ovo je sustav tri jednadbe sa dvije nepoznanice: i . Za rjeavanje je dovoljno rijeiti


sustav po proizvoljne dvije jednadbe, no tada treba provjeriti je li i ona trea zadovoljena!
Ako nije, pravci se ne sijeku! Ako je, pravci se sijeku.

ZADATAK 6.
r
Odredi najmanju udaljenost izmeu toke T=(T1,T2,T3) i ravnine zadane preko normale v N i
r
toke TS koja pripada ravnini: (TR TS ) v N = 0 .

Rjeenje.

SKRIPTA IZ RAUNALNE GRAFIKE

198

Na ravnini je potrebno pronai takvu toku TR za koju je spojnica te toke sa tokom T


r
okomita na ravninu, odnosno kako znamo vektor v N koji je okomit na ravninu, traiti emo
r
da spojnica bude paralelna (kolinearna) sa vektorom v N to je identian zahtjev zahtjevu
okomitosti. Upravo izgovoren tekst pretoen u jednadbe glasi:

(TR TS ) vrN

= 0 ... TR je na ravnini
r
T TR = v N ....... Uvjet kolinearnosti

Sustav se raspada na etiri jednadbe sa etiri nepoznanice: tri komponente toke TR i


parametar .

(TR1 TS1 ) vN 1 + (TR 2 TS 2 ) vN 2 + (TR3 TS 3 ) vN 3 = 0


T1 TR1 = v N 1
T2 TR 2 = v N 2
T3 TR 3 = v N 3

Uvrtavanjem donje tri jednadbe u prvu, dobiva se jednadba po parametru :

(T1 TS1 ) vN 1 + (T2 TS 2 ) vN 2 + (T3 TS 3 ) vN 3


v N2 1 + v N2 2 + v N2 3

gdje se moe izraunati. Zatim se izraunati uvrsti u gornje tri jednadbe i izrauna se
toka TR za koju se dobije:
TRi = Ti v Ni

Raunanje toke TR i nije nuno za odreivanje udaljenosti toke od ravnine. Naime,


udaljenost toke od ravnine je udaljenost izmeu toaka TR i T, odnosno norma vektora T-TR.
No ova norma se moe dobiti direktno iz gornje tri jednadbe koje opisuju Ti - TRi:
d = (T TR ) =

(T1 TR1 )2 + (T2 TR 2 )2 + (T3 TR 3 )2

( vN 1 )2 + ( vN 2 )2 + ( vN 3 )2 =

r
= vN

=
2

vN 1 + vN 2 + vN 3 =

Iz posljednje relacije direktnim uvrtavanjem izraunatog parametra dobiva se traena


udaljenost.

ZADATAK 7.
r
r
Odredi sjecite dviju ravnina: (TR TS ) v N = 0 i (TR' TS' ) v N' = 0 .

Rjeenje.

SKRIPTA IZ RAUNALNE GRAFIKE

199

Ukoliko se dvije ravnine sijeku, tada postoje zajednike toke. To znai da je zahtjev da toka
TR = TR' to rezultira sustavom:
r
(TR TS ) v N = 0
r
(TR TS' ) v N' = 0
Ovo je sustav od dvije jednadbe sa tri nepoznanice. Ukoliko rjeenje postoji, tada emo imati
jednadbu sa jednim parametrom. Zakljuujemo da ukoliko se ravnine sijeku, sijeku se po
pravcu. Kada raspiemo jednadbe, dobije se:
(TR1 TS1 ) v N 1 + (TR 2 TS 2 ) v N 2 + (TR 3 TS 3 ) v N 3 = 0
(TR1 TS'1 ) v N' 1 + (TR 2 TS' 2 ) v N' 2 + (TR 3 TS' 3 ) v N' 3 = 0

Sustav treba rijeiti nekom od metoda za rjeavanje sustava linearnih jednadbi. No da ne


kompliciramo, pretpostaviti emo da su koeficijenti uz TR1 razliiti od 0, odnosno da se TR1
pojavljuje u obje jednadbe. Tada se TR1 moe izluiti iz gornje jednadbe i uvrstiti u donju
(ukoliko pretpostavka o koeficijentima ne vrijedi, umjesto TR1 moe se uzeti TR2 ili TR3; neto
e uvijek postojati!). Dobiti e se jednadba oblika:
a TR 2 + b TR 3 + c = 0 tj.
c
b
ili
TR 2 = TR 3
a
a
T R 2 = E TR 3 + F
Uvrtenjem ovog rjeenja u npr. prvu jednadbu dobiti e se i TR1 kao funkcija od TR3, to e
biti oblika:
TR1 = G TR 3 + H

Proglasimo li sada TR3 parametrom dobiti emo:


TR1 = E + F
TR 2 = G + H
TR 3 = 1 + 0
to je parametarski oblik jednadbe pravca!

ZADATAK 8.
r
r
r
Odredi sjecite triju ravnina: (TR TS ) v N = 0 , (TR' TS' ) v N' = 0 i (TR'' TS'' ) v N'' = 0 .

Rjeenje.
Ukoliko se tri ravnine sijeku, tada postoje zajednike toke (praviti emo se da ne znamo
koliko ih je pa emo o broju raspravljati nakon to napiemo sustav). To znai da je zahtjev da
toka TR = TR' = TR'' to rezultira sustavom:
r
(TR TS ) v N = 0
r
(TR TS' ) v N' = 0
r
(TR TS'' ) v N'' = 0

SKRIPTA IZ RAUNALNE GRAFIKE

200

Ovo je sustav od tri jednadbe sa tri nepoznanice. Ukoliko rjeenje postoji, tada emo imati
jedno jedinstveno rjeenje. Zakljuujemo da ukoliko se ravnine sijeku, sijeku se u toci. Kada
raspiemo jednadbe, dobije se:
(TR1 TS 1 ) v N 1 + (TR 2 TS 2 ) v N 2 + (TR 3 TS 3 ) v N 3 = 0
(TR1 TS'1 ) v N' 1 + (TR 2 TS' 2 ) v N' 2 + (TR 3 TS' 3 ) v N' 3 = 0
(TR1 TS''1 ) v N'' 1 + (TR 2 TS''2 ) v N'' 2 + (TR 3 TS''3 ) v N'' 3 = 0
Sustav treba rijeiti nekom od metoda za rjeavanje sustava linearnih jednadbi. Kao rjeenje
e se dobiti toka TR = (TR1, TR2, TR3)

ZADATAK 9.
2
7
. Zapisati ovu ravninu pomou njezine normale!
Zadana je ravnina R =
2

13

Rjeenje.
r
Ravninu treba prikazati u obliku (TR TS ) v N = 0 . Da bismo ovo mogli, treba nam vektor
normale, te jedna (bilo koja) toka ravnine.
Ukoliko se za prikaz toaka ravnine koristi predloeni matrini oblik, moemo pisati:

2
7
=0
TR R = 0 odnosno TR
2

13
Slijedi :

[TR1

TR 2

TR 3

2
7
=0
1]
2

13

odnosno :
2TR1 7TR 2 2TR 3 13 = 0
r
Ukoliko krenemo iz zapisa preko normale (TR TS ) v N = 0 , raspisivanjem izraza dobiva se
r
da su faktori uz komponente toke TR upravo komponente vektora v N . Znai da direktnim
oitavanjem bilo iz matrice R, bilo iz zapisa koji se dobije mnoenjem toke TR sa matricom
r
R, slijedi da vektor v N glasi:
r
v N = [2 7 2]
Jo nam preostaje da odredimo bilo koju toku ravnine koju emo proglasiti tokom TS. No
kako sve toke ravnine zadovoljavaju jednadbu:

SKRIPTA IZ RAUNALNE GRAFIKE

201

2TS1 7TS 2 2TS 3 13 = 0


odabirom npr. TS3=0, TS2=1 slijedi TS1=10, tj. TS=(10, 1, 0), te zapis pomou normale glasi:
2
(TR [10 1 0]) 7 = 0
2

ZADATAK 10.
2
1
7

i R B = 12 . Nai sjecite ovih ravnina!


Zadane su ravnina R A =
2
18

13
35

Rjeenje.
Ravnine RA i RB moemo kao u zadatku 9 napisati pomou normale, te sjecite nai kao u
zadatku 7. No moe i krae. Matrice RA i RB odreuju dvije implicitne jednadbe ravnina.
Zahtjevom da toke pripadaju istovremeno obim ravninama proizlazi sustav:
2TR1 7TR 2 2TR 3 13 = 0
TR1 + 12TR 2 + 18TR 3 35 = 0

Ovo je sustav dviju jednadbi sa tri nepoznanice. Eliminiranjem nepoznanice TR1 dobiva se:
17TR 2 + 34TR 3 84 = 0
TR 2 = 2TR 3 +

pa je

84
17

Uvrtavanjem izraza za TR2 u npr. prvu jednadbu dobiva se:


413
17
Vidimo da izrazi za TR1 i TR2 ovise o TR3. Zato emo TR3 proglasiti parametrom , i imamo
parametarski oblik jednadbe pravca koji je ujedno i jednadba sjecita:
TR1 = 6TR 3 +

413
17
84
= 2 +
17
= 1 + 0

TR1 = 6 +
TR 2
TR 3

Pravac moemo zapisati preko karakteristine matrice pravca L:

SKRIPTA IZ RAUNALNE GRAFIKE

202

6 2 1 0

L = 413 84
17 17 0 1
U ovom zapisu u prvom se retku nalazi vektor pravca u homogenom prostoru (zato etiri
komponente i to je razlog to je homogena komponenta jednaka nuli), a u drugom retku se
nalazi bilo koja toka pravca opet u homogenom izdanju (zato je uzeto h=1 i prepisana je
toka TS iz parametarskog oblika jednadbe pravca).

You might also like