Professional Documents
Culture Documents
RG Komplet
RG Komplet
SADRAJ
1.0
1.1
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
RAVNINA__________________________________________________________ 20
4.1
JEDNADBA RAVNINE___________________________________________ 20
4.2
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.
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].
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.
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 :
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)
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.
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 .
12
0 1 TS 1 1 TS TE TS
L=
=
=
1 1 TE 1 0 TE TS
(r:2.1.2/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
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)
13
y 2 y1
( x x1 )
x 2 x1
(r:2.2.1/3')
(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')
(r:2.2.1/5)
(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:
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.
15
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:
TPhi
odnosno TPhi = TPi h
h
16
(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).
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).
17
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
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)
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:
18
TP G = 0, TP je na pravcu
< 0, T je ispod pravca
P
(r:3.4/5)
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
a TPh,1 + b TPh, 2 + c h = 0
to se moe napisati kao:
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.
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
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:
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:
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 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)
TRh1
T
T
+ B Rh 2 + C Rh 3 + D = 0
hR
hR
hR
(r:4.1/7)
[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:
23
(r:4.1/10)
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
T Ah 3
TBh 3
TCh 3
h A ] = [0 0 1] R
hB ] = [1 0 1] R
hC ] = [1 1 1] R
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)
24
25
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);
}
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.
27
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++ ) {
28
osvijetli_pixel(x,yc);
yf=yf+a;
if(yf>=0.) {
yf=yf-1.;
yc=yc+1;
}
}
Moe li bolje? Naravno...
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
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:
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.
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:
31
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
33
a) Konveksni poligon
b) Konkavni poligon
6.1.1.
34
T4
b3
b4
T3
T5
b2
b5
T2
b1
b6
T1
T6
6.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.
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.
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:
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.
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.
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
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.
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.
41
Elementu lijevi pridruen je tip int u nedostatku prikladnijeg tipa. Tip koji bi najbolje
odgovarao bio bi boolean koji u C-u ne postoji.
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;
42
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).
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
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.
45
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
(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!
46
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.
47
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)
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
bi
b i+1 T
i+1
b i+2
bi
b i+2
b)
Ti
T i+3
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
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.
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
= (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;
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);
}
a)
Oznaka
b)
c)
7.7.1.
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).
a)
53
b)
7.7.2.
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.
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
56
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
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
ZRAKA SE PRIJE
SJECITA NALAZI
ZRAKA SE POSLIJE
SJECITA NALAZI
SLIKA
AKCIJA
DA
IZVAN
IZVAN
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!
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.
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
DA
Ignoriraj slijedea
dva sjecit a.
Nast avi sa sjecit em
iza ova dv a.
NE
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
60
#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 <
}
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);
}
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
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
63
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).
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.
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.
65
periodike neperiodike
racionalne neracionalne
otvorene zatvorene
interpolacijske aproksimacijske
8.5.1. C KONTINUITETI
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'
67
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.
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.
69
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!
71
}
}
}
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
72
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.
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.
74
moe zapisati:
i>0
i=0
oznakom i,n, pri emu e kod Bezierovih
a kod Bernsteinovih teinskih funkcija b. Pri
75
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
f n',n (1) = 1,
f i ,' n (1) = 0,
in
76
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
a1, y
a1, x
, odakle slijedi:
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 ) =
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
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.
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
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
i
)!
Ovo je najjednostavniji oblik za uporabu u raunalima, i mi emo ga koristiti u nastavku.
Pojava faktorijela takoer ne komplicira stvari.
80
f i ,n (t ) = b j ,n (t )
j =i
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:
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;
}
}
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 );
}
}
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
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
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
6
1
P
A =
18 21 81 81 21
6 27 54 33
odnosno po komponentama:
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:
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.
TKh ,3 TKh ,h ] = t
a1 a 2
t 1 b1 b2
c1 c 2
a3 a
b3 b = t 2
c3 c
t 1 K
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
[
] = [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
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
t12 t1 1 T Ah t12 t1 1 T Ah ,1 T Ah , 2
T Ah ,3 T Ah ,h
TBh ,3 TBh ,h
TCh ,3 TCh ,h
0 2 0 1 T Ah 2 4 2 T Ah
88
= 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
''
TKh'' = TKh
TKh'' , 2
,1
TKh'' ,3
a1 a 2
TKh'' ,h = [2 0 0] b1 b2
c1 c 2
a3 a
b3 b = [2 0 0] K
c3 c
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
TKh = t 2
t 1 K
90
d1 d 2 d 3 d
= 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
] [
TKh' ,3 TKh' ,h = 3t 2
2t 1 0 A
[
= [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
TK ,3 1] = TKh ,h [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
= 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
T
TKh ,h K'
TK
1
0
TKh' ,h =
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'' ,3 TKh'' ,h =
= T
''
Kh , h
2 T
'
Kh , h
TKh ,h
TK ,1 TK , 2 TK ,3 1
2 T
'
Kh , h
TKh ,h
TK
TK'
TK''
TKh'' ,h =
1
0
0
11.7. PRIMJERI
Pomou razlomljene kvadratne funkcije elimo odrediti krivulju koja e prolaziti slijedeim
tokama:
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:
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
TKh = t
R 0 0 1
t 1 0 2 R 0 0
R
0 0 1
[
= [T
T0,3 ]
T1,3 ]
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
94
Za prvu derivaciju u homogenom prostoru u poglavlju 11.6. smo izveli vezu sa derivacijom u
radnom prostoru:
] [
T0'h ,h = 3t 02
2t 0 1 0
[
= [T
T1h ,h ] = t
3
1
'
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
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
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
95
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.
TKh ,1 = P3 (t )
TKh , 2 = Q3 (t )
TKh ,3 = R3 (t )
TKh ,h = 1
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
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.
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
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:
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
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:
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
TK = 4
1
2
1
4
1
2
0 1
=
1 2
2
1
2
1
4
1
2
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 .
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.
'
'
'
1
0
Th ,1 Th , 2 Th ,h = [Th ,1 Th , 2 Th ,h ] 0
1 2 1
1
tr = 0
1
101
0
0
1
0
1
2
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
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
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
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:
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.
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
psk
k 0 0
= 0 k 0
0 0 1
psk
= 0
0
1
0
105
1
k
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
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.
106
y, y' y
x' y
y' x
x, x' x
12.5.2.
[T
'
h ,1
Th', 2
Th',h = [Th ,1 Th , 2
1
Th ,h ] tg
0
tg
1
0
0
1
1
sm
1
1 tg tg
tg
=
1 tg tg
tg
1 tg tg
1
1 tg tg
0
0
0
1
107
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
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.
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.
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
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
0
1
0
0
0
2
1
3
0
0
0
1
0
Th ,h ]
0
1
0
2
0
1
3
0
0
0
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.
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
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:
'
roty
cos
0
=
sin
sin
1
0
0
cos
0
0
111
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
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:
k2
0
0
0
k3
0
112
0
0
0
sk1
1
k
1
0
=
0
1
k2
1
k3
psk
0
=
0
0
1
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:
sm
1
tg
=
tg
tg
tg
1
tg
tg
1
113
0
0
0
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
114
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.
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.
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
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:
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.
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.
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
0
1
0 1
per.proj =
0 0
0 0
TPx = Tx
1
H
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.
0
'per.proj =
0
1
H
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:
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
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:
123
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.
124
( ) ( )
( ) ( )
G x'' = 0
G y'' = 0
G z'' =
(G ) + (G )
' 2
x
' 2
z
= G x2 + G y2 + G z2
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
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:
cos
sin
4 =
0
sin
cos
0
0
1
0
0
126
G''
K'''
y,y'
x,x'
14.2.5.
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.
127
1
0
0
1
0
0
0
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.
1
0
1 =
0
Q x
1
0
Qy
0
1
Qz
128
0
0
0
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
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
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
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
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''
( ) ( )
( ) ( )
(R ) + (R )
'' 2
x
'' 2
z
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:
130
per.proj
0
=
0
1
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.
131
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 :
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)
(rel: 14.3.4/9)
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:
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
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.
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.
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).
136
N
izvor
L
15.2.2.1.
I d = I i k d cos( )
(rel:15.2.2.1/1)
r r
I d = Ii kd L N
(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)
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 .
138
15.2.3.2.
I g = I a ka
(rel:15.2.4/1)
r r
r r
I = I a ka + I i kd L N + k s R V
))
n
(rel:15.2.5/1)
139
))
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.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;
140
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
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
142
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)
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.
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.
x
(I b I a )
xb x a
144
Pri tome x oznaava korak po x-osi. Ukoliko popunjavamo svaki pixel, to je uobiajeno, x
iznosi 1.
N1
izvorna povrina
Ns
N2
poligonizirana povrina
15.4.1.
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.
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
146
posebno). To je jo jedan razlog daleko vee raunske zahtjevnosti na sklopovlje koje izvodi
ove kalkulacije.
147
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
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.
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
16.3.2.
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.
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;
152
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.
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.
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:
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++;
155
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);
}
Sada emo svaku liniju iterativno zamjenjivati tim segmentima. Rezultat je slijedei:
pa
156
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.
z 0 = 0 + 0i
157
(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
(rel:17.3/1)
158
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
159
W=4./(5.3)
W=4./(5.4)
W=4./(5.5)
W=4./(5.6)
W=4./(5.7)
160
W=4./(5.8)
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:
z n +1 = z n2 + c
161
z 0 = u + vi
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
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
163
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
165
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 &&
166
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.
167
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
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.
169
Topovi
B
G
R
R
G
B
Sitasta reetka
Prikaz topova i sitaste reetke kod FST-a
170
Zatezna iica
Zatezna iica
Maska
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.
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
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.
Statiki
naboj
- -
Kazeta tonera
-
ienje
Fotoosjetljivi bubanj
+
+
Papir
173
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.
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.
176
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.
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.
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
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.
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
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
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
181
180
240
300
uta
Zelena
Cijan
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.
182
lokacije
255
intenzitet
Slika 19.3.2
I0 = I0
I1 = r I 0
I 2 = (r + r ) I 0
...
I n = (n r ) I 0
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)
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
lokacije
255
intenzitet
Slika 19.3.3
I = k N
(rel 19.3/4)
I = k (k1 V ) = k k1 V = K V
(rel 19.3/4)
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)
184
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
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.
Boja
Crna
Crvena
Zelena
Plava
CRT
4
5
6
7
185
uta
Magenta
Cijan
Bijela
FF 00 00
CRT
Slika 19.4.2.
Sada na lokaciji (x,y) pie kompletan zapis boje: FF 00 00 to odgovara crvenoj boji.
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)
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
(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)
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:
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
r
Nazivnik u (rel:20/12) nestaje jer je norma vektora a jednaka 1.
( )
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).
= Ta
(rel:20/14)
Ovi izrazi vrijede tako dugo dok se potuju pretpostavke uz koje su izvedeni, a to su:
(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].
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
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.
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
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,7)
(3,7) = (4,8) + (1,2)
1
2
5
7 = 8 + 2 =
8
3 = 4 +1 =
Toka (7,14)
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.
TEh = (5,10,1)
[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
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.
hS ]) + [TS1 TS 2
hS ]
[3
6 1] = [9 18 1] + [1 2 1]
2
9
[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 =
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.
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
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'
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
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
197
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
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.
198
(TR TS ) vrN
= 0 ... TR je na ravnini
r
T TR = v N ....... Uvjet kolinearnosti
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
( vN 1 )2 + ( vN 2 )2 + ( vN 3 )2 =
r
= vN
=
2
vN 1 + vN 2 + vN 3 =
ZADATAK 7.
r
r
Odredi sjecite dviju ravnina: (TR TS ) v N = 0 i (TR' TS' ) v N' = 0 .
Rjeenje.
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
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
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:
201
ZADATAK 10.
2
1
7
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
413
17
84
= 2 +
17
= 1 + 0
TR1 = 6 +
TR 2
TR 3
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).