Tietokonegrafiikan perusteet

Koko: px
Aloita esitys sivulta:

Download "Tietokonegrafiikan perusteet"

Transkriptio

1 Tietokonegrafiikan perusteet Tuomo Rossi Jyväskylän yliopisto Tietotekniikan laitos 7. syyskuuta

2 2

3 Sisältö 1 Lineaarialgebran kertausta Vektorit Vektorien yhteenlasku ja reaaliluvulla kertominen Vektorien sisätulo Kantavektorit Vektorien ristitulo Neliömatriisit Matriisien yhteenlasku ja reaaliluvulla kertominen Diagonaalimatriisi, transpoosimatriisi ja matriisin symmetrisyys Matriisien kertolasku Matriisi vektori -kertolasku Transponointi ja sisätulo, käänteismatriisi Tasografiikka Siirto, kierto, skaalaus, vääntö Siirto-operaatio vektoriyhteenlaskuna Origokeskinen kierto Skaalaus, peilaus Vääntö Muunnokset homogeenisissa koordinaateissa Homogeeniset koordinaatit Siirto, kierto, skaalaus ja vääntomatriisit homogeenisissa koordinaateissa Esimerkki hierarkisesta mallista Normaalivektorien kuvautuminen hierarkisessa mallissa Sekalaisia tasogeometrian ongelmia Kummalla puolen suoraa piste on? i

4 ii SISÄLTÖ Leikkaavatko annetut janat toisensa? Onko tason piste suljetun monikulmion sisäpuolella? Janan leikkaaminen suorakulmiolla Janan leikkaaminen konveksilla monikulmiolla Monikulmion leikkaaminen konveksilla monikulmiolla, Sutherlandin ja Hodgmanin algoritmi Monikulmion leikkaaminen monikulmiolla: Weilerin ja Athertonin menetelmä Monikulmion jakaminen konvekseiksi monikulmioiksi Rasterointi: mallista pikseleiksi Janan rasterointi Midpoint line -menetelmä Ympyrän kaaren rasterointimenetelmä Alueiden täyttäminen Liukuvan suoran menetelmä Kolmas ulottuvuus Perusmuunnokset kolmessa ulottuvuudessa Homogeeniset koordinaatit Siirto-, skaalaus-/peilaus-, ja vääntömatriisit Kierrot avaruudessa R Eulerin kulmat Gimbal lock -ilmiö Orientaatiosta toiseen siirtyminen Yleinen kiertomatriisi Kiertojen laskuoppi ja interpolointi, kvaterniot Kulmasiirtymien interpolointi Kvaterniot Yksikkökvaterniota vastaavan kiertomatriisin muodostaminen Kiertomatriisia vastaavan yksikkökvaternion muodostaminen Yksikkökvaternioiden interpolointi Ohjelmalistauksia Esimerkki kiertojen soveltamisesta Yhteenveto kiertojen esittämisestä Projektiokuvan muodostaminen kolmiulotteisesta näkymästä Perspektiiviprojektio

5 SISÄLTÖ iii Yhdensuuntaisprojektioiden luokittelu Synteettinen kamera Kanoninen kuvanottotilanne Normalisointimuunnos ortografista projektiota käytettäessä Normalisointimuunnos perspektiiviprojektiota käytettäessä Normalisointimuunnos vinoa yhdensuuntaisprojektiota käytettäessä Monikulmioiden leikkaaminen, monikulmioliukuhihna Näkyvyys, realismi Näkyvien pintojen määrääminen Konservatiivinen menetelmä: taakse osoittavien monikulmioiden poistaminen Piirtojärjestyksen määrääminen mallitustarkkuudella: BSPpuu Näkyvien monikulmioiden määrääminen mallitustarkkuudella: Weilern ja Athertonin menetelmä Esitystarkkuudella toimiva menetelmä: Z-puskurointi Valaistuksen simulointi Valonlähteet Yksinkertainen ei-fysikaalinen lokaali valaistusmalli Warnin spottivalomalli Monikulmioiden sävytys Gouraudin sävytys: Kärkipisteittäisten RGB-arvojen interpolointi Phongin sävytys: normaalivektorien ja kärkipisteiden maailmankoordinaattien interpolointi Williamsin z-puskurivarjoalgoritmi

6 iv SISÄLTÖ

7 Luku 1 Lineaarialgebran kertausta Tässä luvussa kerrataan lineaarialgebran perustuloksia, joita jatkossa tarvitaan mitä moninaisimpiin tarkoituksiin. 1.1 Vektorit Tietokonegrafiikan sovelluksissa tarvitaan usein korkeintaan neliulotteisia vektoreita. Esitämme kuitenkin perustulokset yleisessä n-ulotteisessa tapauksessa. Mikäli ei erikseen mainita, käytämme pystyvektorimerkintää, eli mielivaltainen euklidisen avaruuden vektori x R n, komponentteinaan x 1,x 2,...,x n, x i R 1 R kirjoitetaan muotoon x 1 x 2 x =., xt = (x 1,x 2,...,x n ). (1.1) x n Edellisessä kaavassa on myös esitetty merkintä, jota käytetään, jos haluamme jossain yhteydessä käyttää vaakavektoreita. Tämä merkintä on myös myöhemmin käytössä matriisien transpoosimatriiseille. 1

8 2 LUKU 1. LINEAARIALGEBRAN KERTAUSTA Vektorien yhteenlasku ja reaaliluvulla kertominen Vektoriavaruuden R n vektoreille on olemassa tutut laskusäännöt: Olkoon x, y R n ja α R. Tällöin x + y R n, ( x + y) i = x i + y i i = 1,...,n, α x R n, (α x) i = αx i i = 1,...,n, (1.2) eli avaruus R n on suljettu edellä määritellyn vektorien laskutoimitusten, eli vektorien yhteenlaskun ja reaaliluvulla kertomisen suhteen. Joskus käytetään merkintää x/α, missä x R n ja α R, α 0. Tällä tarkoitetaan vektorin x kertomista reaaliluvulla 1/α. Edellä määritellyn vektorien yhteenlaskun neutraalialkiota merkitään 0:lla. Se on tietenkin se R n :n vektori, jonka kaikki komponentit ovat reaalilukuja 0. Jokaisella vektorilla x R n on olemassa yhteelaskun suhteen vastavektori x, jolle on voimassa x + x = 0. Vastavektorin x alkiot ovat tietenkin alkuperäisen vektorin x alkioiden vastalukuja Vektorien sisätulo Tärkeä vektorioperaatio on niin kutsuttu vektorien sisätulo (skalaaritulo, pistetulo). Olkoon x, y R n. Tällöin x:n ja y:n välinen sisätulo, jota merkitään ( x, y):llä, on reaaliluku, ja se lasketaan kaavalla ( x, y) = x 1 y 1 + x 2 y x n y n R. (1.3) On helppoa näyttää, että sisätulo on lineaarinen operaatio. Sille on voimassa ( x 1 + x 2, y) = ( x 1, y) + ( x 2, y), ( x, y 1 + y 2 ) = ( x, y 1 ) + ( x, y 2 ), (α x, y) = α( x, y), ( x, β y) = β( x, y), (1.4) missä x, x 1, x 2, y, y 1, y 2 R n ja α,β R. Sisätulo on erittäin tärkeä operaatio tietokonegrafiikassa. Sen avulla voidaan muunmuassa määritellä vektorien pituus, eli normi ja vektorien välinen kulma. Jatkossa käytämme vektorinormina tavallista euklidista normia, joka saadaan kaavasta x = ( x, x) = x1 2 + x x2 n. (1.5) Yksikkövektoriksi kutsutaan sellaista vektoria x R n, jolle pätee x = 1. Selvästikin 0 = 0 ja lisäksi 0 on ainoa R n :n vektori, jonka normi on nolla. Mikä

9 1.1. VEKTORIT 3 tahansa vektori x R n, lukuunottamatta vektoria 0 voidaan skaalata yksikkövektoriksi. Yksinkertaisesti riittää kertoa vektori x norminsa käänteisluvulla 1/ x, joka on siis reaaliluku. Kahden vektorin x, y R n väliselle kulmalle θ pätee cosθ = ( x, y) x y, (1.6) edellyttäen tietenkin, että x 0 ja y 0. Jos vektorit x ja y on etukäteen skaalattu yksikkövektoreiksi, supistuu kaava (1.6) yksinkertaiseen muotoon cosθ = ( x, y). (1.7) Itse asiassa grafiikkasovelluksissa olemme useammin kiinnostuneita vektorien välisen kulman θ kosinista, kuin kulmasta itsestään. Tämä pätee erityisesti valaistussimuloinneissa (luku 4.2). Vektorien x ja y sanotaan olevan kohtisuorassa (ortogonaalisia) toisiinsa nähden jos ( x, y) = 0. Huomaa, että vektori 0 on ortogonaalinen kaikkien vektorien kanssa Kantavektorit Avaruuden R n n:n vektorin joukon x 1, x 2,..., x n, sanotaan olevan lineaarisesti riippuvan, jos on olemassa reaalikertoimet α k, k = 1,...,n joista ainakin yksi eroaa nollasta ja silti α k x k = 0. k Jos vektorijoukko ei ole lineaarisesti riippuva, sanotaan sitä lineaarisesti riippumattomaksi. Huomaa, että jos jokin vektoreista x i on nollavektori, on joukko automaattisesti lineaarisesti riippuva. Samoin mikä tahansa R n :n vektorijoukko, jossa on yli n vektoria on väistämättä lineaarisesti riippuva. Lineaarisesti riippumattoman n:n kappaleen R n :n vektorin joukon x 1, x 2,..., x n sanotaan virittävän avaruuden R n, eli se muodostaa avaruudelle niin kutsutun kannan. Tämä tarkoittaa sitä, että mikä tahansa vektori y R n voidaan lausua vektorien x i lineaarikombinaationa (summana reaaliluvuin kerrotuista vektoreista x i ), eli joillakin kertoimilla α i R. y = n i=1 α i x i, (1.8)

10 4 LUKU 1. LINEAARIALGEBRAN KERTAUSTA Ehkä helpommin miellettävä tulkinta lineaarisesti riippuvalle avaruuden R n n:n vektorin joukolle x 1, x 2,..., x n on se, että on olemassa jokin vektori y R n, jota ei voida lausua muodossa (1.8). Toisin sanoen emme voi muodostaa polkua vektoreista x i, jota pitkin origosta lähtien kulkemalla päädymme samaan pisteeseen, johon vektori y origosta johdattaa valitsimmepa kertoimet α i kuinka tahansa. Yleensä kantavektorijoukon toivotaan olevan ortonormaalin, eli { 1, i = j, ( x i, x j ) = δ i j, missä δ i j = (1.9) 0, i j. Lähtien liikkeelle mistä tahansa lineaarisesti riippumattomasta n:n vektorin joukosta, voidaan siitä muodostaa ortonormaali vektorijoukko. Tässä hyödynnetään jälleen sisätulon erästä ominaisuutta, nimittäin sitä, että jos b = 1, on ( a, b) annetun vektorin a vektorin b suuntaiselle suoralle projisoituvan osan pituus, katso kuva 1.1. Näin ollen, voimme ortonormalisoida lineaarisesti riippumattoman (eli a α b kaikilla α R) vektoriparin a, b, b = 1 seuraavasti: Ensin lasketaan apuvektori a = a ( a, b) b, josta saamme yksikkövektorin a ˆ asettamalla a ˆ = a/ a. Nyt todellakin on voimassa sekä (ˆ a, b) = 0, että ˆ a = b = 1. Tämä nähdään suoralla laskulla. Ensiksikin ˆ a = b = 1, koska b oletettiin yksikkövektoriksi ja a ˆ saatiin vektorista a skaalaamalla se myös yksikkövektoriksi. Nyt sisätulon lineaarisuudesta (kaava (1.4)) seuraa helposti, että (ˆ a, b) = 1 ( a, b) = 1 a a ( a ( a, b) b, b) = 1 ( ) ( a, b) ( a, b)( b, b) = 0, a (1.10) koska ( b, b) = 1, sillä b oletettiin yksikkövektoriksi. Menetelmä yleistyy helposti n:n lineaarisesti riippumattoman vektorin x 1, x 2,..., x n ortonormalisointiin. Aluksi skaalataan x 1 yksikkövektoriksi x ˆ 1 asettamalla x ˆ 1 = x 1 / x 1. Tämän jälkeen lasketaan silmukassa i = 2,...,n: i 1 x i = x i j=1 α i, j ˆ x j, xi ˆ = x i / x i, (1.11) missä α i, j = ( x i, x ˆ j ). Lopuksi vektorijoukko x ˆ 1, x ˆ 2,..., x ˆ n on ortonormaali. Tämä menetelmä on n.k. Gram-Schmidtin vektorijoukon ortonormalisointimenetelmä.

11 1.1. VEKTORIT 5 z Vektori (a,b)b Vektori a (a,b)b y Vektori a Vektorin b suuntainen suora x Vektori b, b =1 Projektion pituus on (a,b) Kuva 1.1: Kahden lineaarisesti riippumattoman vektorin ortogonalisointi. Tällä tekniikalla saamme muodostettua ortonormaalin kantavektorijoukon mielivaltaisesta lineaarisesti riippumattomasta vektorijoukosta. Lisäksi käyttäen näin saatua vektorijoukkoa kantana lausekkeessa (1.8), saadaan lausekkeen kertoimet α i kaavalla α i = ( y, x ˆ i ). Yleensä tietokonegrafiikassa käytetään tavallista euklidisen avaruuden kantaa e 1, e 2,..., e n, missä merkinnän ( e i ) j tarkoittaessa vektorin e i j:nnettä alkiota. ( e i ) j = δ i j, (1.12) Vektorien ristitulo Tapauksessa n = 3 tarvitaan usein vektorien ristitulo-operaatiota. Kahden kolmiulotteisen vektorin x, y R 3 ristituloa merkitään x y:llä ja se on kolmiulotteinen vektori, joka määritellään seuraavasti: x 1 y 1 x 2 y 3 x 3 y 2 x 2 y 2 = x 3 y 1 x 1 y 3 R 3. (1.13) x 3 y 3 x 1 y 2 x 2 y 1 Ristitulolle on voimassa ( x y, x) = ( x y, y) = 0, eli ristitulovektori on ortogonaalinen kumpaakin kerrottavaa vektoria x ja y kohti. Jos x ja y ovat lineaarisesti riippuvia, on niiden ristitulo nollavektori. Ristitulolla on seuraava geometrinen tulkinta. Sen normi x y on vektorien x ja y rajaaman suunnikkaan pinta-ala,

12 6 LUKU 1. LINEAARIALGEBRAN KERTAUSTA eli x y = x y sinθ = x y 1 ( x, y)2 ( x, x)( y, y), missä θ on vektorien x ja y välinen kulma. Lisäominaisuuksia: x y = y x, x ( y + z) = x y + x z, (α x) y = α( x y). (1.14) Edellä x, y, z R 3 ja α R. Tietokonegrafiikassa ristitulolla on tärkeä tehtävä. Sitä käytetään muunmuassa tasomonikulmion normaalivektorin laskemisessa (olihan ristitulo ortogonaalinen kerrottavia vektoreita kohden). Ristitulovektori täydentää lineaarisesti riippumattoman vektoriparin x ja y vektorikolmikoksi x, y, x y joka on oikeakätisesti suunnattu. Tällä on seuraava (anatominen) tulkinta: Jos oikea kämmen asetetaan sormet suorana vektorin x suuntaiseksi ja sen jälkeen kierretään sormia nyrkkiin kohti vektoria y, jää peukalo ristitulovektorin x y puolelle, katso kuva 1.2. Lisäksi, jos vektorit x ja y ovat yksikkövektoreita ja keskenään ortogonaalisia, täydentää ristituloveketori ne oikeakätiseksi ortonormaaliksi kolmikoksi. Tällöinhän x ja y rajaavat virittämällään tasolla yksikköneliön, jonka pinta-ala on 1. Tätä seikkaa hyödynnetään kurssilla nk. normalisointimuunnoksen yhteydessä. Huomautus: Aiemmin totesimme ristitulon täydentävän ortonormaalin vektoriparin x, y ortonormaaliksi oikeakätiseksi kolmikoksi x, y, x y. Aivan yhtälailla on myös kolmikko y, x y, x oikeakätinen, niinkuin on kolmikko x y, x, y. Lisäksi tarvitsemme myöhemmin luvussa 3.2 seuraavia sisä- ja ristitulon ominaisuuksia: Olkoon x, y, z R 3 ( x, y) 2 + x y 2 = x 2 y 2 ( x, z) y ( y, z) x = ( x y) z (1.15) 1.2 Neliömatriisit Tietokonegrafiikan sovelluksissa tarvitaan neliömatriiseja, joiden dimensio n on pieni (tyypillisesti n = 3,4). Lineaarialgebran kurssilla opimme, että reaaliset n n-neliömatriisit esittävät lineaarikuvauksia avaruudelta R n itselleen. Itse matriisin alkioiden lukuarvot riippuvat avaruudelle R n valitusta kantavektorikokoelmasta.

13 1.2. NELIÖMATRIISIT 7 x y y Kuva 1.2: Ristitulo täydentää lineaarisesti riippumattoman vektoriparin x, y oikeakätisesti suunnatuksi vektorikolmikoksi x, y, x y. x Tällä kurssilla riittää tietää matriisien ja vektorien peruslaskusäännöt, jotka esitellään seuraavaksi. Neliömatriisi A R n n esitetään kaksiulotteisena n rivisenä ja n sarakkeisena taulukkona a 11 a a 1n a 21 a a 2n A =......, (1.16) a n1 a n2... a nn missä matriisin A alkioita merkitään a i j :llä. Alkiot a i j ovat reaalilukuja, ja alkioita indeksoidaan kahdella indeksillä, ensimmäinen on rivi- ja toinen on sarakeindeksi. Merkintää R n n käytetään yleisesti reaalisten n n-matriisien avaruudelle. Jatkossa käytetään lyhennysmerkintää A = { a i j } n i, j=1 Rn n, lueteltaessa n n-neliömatriisi alkioittain Matriisien yhteenlasku ja reaaliluvulla kertominen Neliömatriiseille on määritelty yhteenlasku ja reaaliluvulla kertominen: Olkoon A = { } n a i j i, j=1 ja B = { } n b i j kaksi reaalista neliömatriisia, ja α reaaliluku. i, j=1 Tällöin A + B = { } n a i j + b i j i, j=1, αa = { } n αa i j i, j=1. (1.17)

14 8 LUKU 1. LINEAARIALGEBRAN KERTAUSTA Selvästi matriisien yhteenlasku on vaihdannainen ja on olemassa yhteenlaskun suhteen neutraalialkio, nollamatriisi ja vastamatriisi, jonka alkiot ovat alkuperäisen matriisin vastalukuja Diagonaalimatriisi, transpoosimatriisi ja matriisin symmetrisyys Neliömatriisia A = { a i j } n i, j=1 sanotaan diagonaalimatriisiksi, jos a i j = 0, kun i j, ja usein matriisi tällöin esitetään luettelemalla vain sen diagonaalialkiot käyttäen vain yhtä indeksiä A = diag{a 1,a 2,...,a n }. Neliömatriisin A = { a i j } n i, j=1 transpoosimatriisilla, jota merkitään AT :llä, tarkoitetaan matriisia A T = { a ji } n i, j=1, (1.18) eli se muodostetaan alkuperäisestä matriista peilaamaalla päädiagonaalin suhteen. Neliömatriisia A sanotaan symmetriseksi, jos A = A T. Ilmeisesti ainakin kaikki diagonaalimatriisit ovat symmetrisiä ja mielivaltaiselle matriisille A pätee A = (A T ) T Matriisien kertolasku Neliömatriiseille on määritelty myös kertolasku (vastaaville lineaarikuvauksille tämä { } tarkoittaa yhdistettyä kuvausta). Se määritellään seuraavasti: Olkoon A = n ai j i, j=1 ja B = { } n b i j kaksi reaalista neliömatriisia. Tällöin niiden tuloa i, j=1 merkitään AB:llä ja tulomatriisin alkiot ovat AB = { n } n a ik b k j. (1.19) k=1 i, j=1 Tämä voidaan tulkita myös seuraavasti: Määritellään vektorit a i1 a i2 a in b 1 j b 2 j a i =., ja b j =., b n j

15 1.2. NELIÖMATRIISIT 9 eli a i on matriisin A i:s rivivektori (vektori johon on järjestyksessä poimittu alkiot A:n i:nneltä riviltä) ja b j on matriisin B j:s sarakevektori (vektori johon on järjestyksessä poimittu alkiot B:n j:nneltä sarakkeelta). Nyt tulomatriisin AB alkiot voidaan yhtäpitävästi esittää muodossa { } n AB = ( a i, b j ), (1.20) i, j=1 eli tulomatriisin AB i:nnen rivin sarakkeessa j sijaitseva alkio saadaan laskemalla matriisin A i:nnen rivivektorin ja matriisin B j:nnen sarakevektorin sisätulo. Matriisikertolaskussa matriisien järjestystä ei saa vaihtaa, sillä matriisikertolasku ei välttämättä kommutoi. Yleisille neliömatriiseille A ja B AB BA. Edes se seikka, että toinen matriiseista A, B on diagonaalimatriisi ei takaa, että matriisitulo kommutoisi. Matriisikertolaskulle on kuitenkin voimassa seuraavat ominaisuudet: Olkoon A, B,C reaalisia n n-neliömatriiseja ja α, β reaalilukuja. Tällöin A(αB + βc) = αab + βac, (αa + βb)c = αac + βbc. (1.21) Matriisikertolaskun neutraalialkio on identtinen matriisi I = diag{1,1,...,1}, (1.22) jolle siis pätee AI = IA = A Matriisi vektori -kertolasku Neliömatriiseilla voidaan myös kertoa samandimensioisia vektoreita (soveltaa matriisia vastaavaa lineaarikuvausta avaruuden alkioon). Tämä saadaan erikoistapauksena matriisitulosta. Olkoon A = { } n a i j i, j=1 reaalinen neliömatriisi ja x Rn annettu vektori. Pystyvektori x voidaan kertoa vasemmalta matriisilla A, ja tulos on n-alkioinen pystyvektori: n j=1 a 1 jx j ( a 1, x) n j=1 A x = a 2 jx j. ( a 2, x)., (1.23) n j=1 a n jx j ( a n, x)

16 10 LUKU 1. LINEAARIALGEBRAN KERTAUSTA missä a i tarkoittaa siis matriisin A i:nnettä rivivektoria. Vastaavasti vaakavektori x T voidaan kertoa oikealta neliömatriisilla B = { } n b i j. Tällöin tulos on n- i, j=1 alkioinen vaakavektori x T B = ( n j=1 b j1 x j, n n b j2 x j,..., b jn x j ) = (( b 1, x),( b 2, x),...,( b n, x)), (1.24) j=1 j=1 missä b i tarkoittaa siis matriisin B i:nnettä sarakevektoria. Matriisi-matriisitulolle ja matriisi-vektoritulolle pätee lisäksi seuraavat ominaisuudet: Olkoot A,B reaalisia neliömatriiseja, x, y R n ja α R (A + B)(α x) = (αa) x + (αb) x = α(a x + B x), (α x T )(A + B) = x T (αa) + x T (αb) = α( x T A + x T B), A( x + y) = A x + A y, ( x T + y T )A = x T A + y T A, (AB) T = B T A T, (A x) T = x T A T. (1.25) Transponointi ja sisätulo, käänteismatriisi Transpoosimatriisilla on vielä eräs tärkeä ominaisuus (itse asiassa se joskus määritellään kuten seuraavassa): Olkoon A reaalinen neliömatriisi ja x, y R n. Tällöin (A x, y) = ( x,a T y). (1.26) Jos neliömatriisi A on hyvin käyttäytyvä (eli sitä vastaava lineaarikuvaus on bijektio), on sillä olemassa käänteismatriisi A 1, jolle A 1 A = AA 1 = I. Tällöin matriisia kutsutaan kääntyväksi (ei-singulaariseksi). Tällä kurssilla kaikki esiintulevat matriisit ovat tällaisia, jopa siten, että käänteismatriisi voidaan muodostaa triviaalisti. Jos matriisi A on kääntyvä on myös sen transpoosi A T kääntyvä, ja on voimassa (A T ) 1 = (A 1 ) T. (1.27) Matriisitulolle on lisäksi voimassa (AB) 1 = B 1 A 1. (1.28) Huomautus: Käytännössä käänteismatriisia tarvitaan eksplisiittisesti erittäin harvoin. Jos A R n n, vaatii A 1 :n alkioiden laskeminen yleisessä tapauksessa kertaluokkaa n 3 laskutoimitusta. Yleensä käytännössä, kuten ratkaistaessa lineaarisia yhtälöryhmiä, ollaankin (asiaa tarkemmin harkittua) kiinnostuneita ainoastaan lopputulosvektorista x = A 1 y. Tällaisissa sovelluksissa kannattaa yleensä

17 1.2. NELIÖMATRIISIT 11 käyttää erilaisia matriisihajotelmia kuten LU- tai Cholesky-hajotelmaa. Näistä asioista kerrotaan tarkemmin kursseilla Numeeriset menetelmät ja Numeerinen lineaarialgebra.

18 12 LUKU 1. LINEAARIALGEBRAN KERTAUSTA

19 Luku 2 Tasografiikka Tässä luvussa esitetään perustekniikat kaksiulotteisista taso-objekteista koostuvien kuvien tuottamiseksi. Piirrettävät objektit määritellään niin kutsuttujen hierarkisten mallien avulla lähtien liikkeelle yksinkertaisista perusmuodoista eli primitiiveistä. Primitiivit voidaan niin haluttaessa määritellä omissa koordinaattijärjestelmissään käyttäen luontevia mittayksiköitä. Hierarkinen malli kuvaa vaihe vaiheelta primitiiviobjektit välikoordinaattijärjestelmien kautta monimutkaisemmiksi kokonaisuuksiksi. Kaikki piirrettävät objektit kuvataan yhteen tasokoordinaatistoon, niin kutsuttuun maailmankoordinaatistoon (englanniksi world coordinate system), josta rajataan lopullista piirtoa varten (yleensä) suorakulmion muotoinen alue, kuvaikkuna. Ainoastaan objektien ja kuvaikkunan leikkausjoukko piirretään katseltavaksi halutulla näyttölaitteella (piirturi, tulostin, graafisen käyttöliittymän ikkuna jne.). Aluksi tarkastellaan tasogeometrian alkeismuunnoksia, joita tarvitaan kaksiulotteisen grafiikan tuottamisessa. Samalla esitellään niin kutsutut homogeeniset koordinaatit, jotka näennäisestä monimutkaisuudestaan huolimatta helpottavat a- sioiden käsittelyä ja menetelmien käytännön toteutusta huomattavasti. Myöhemmin samankaltainen tekniikka esitellään myös kolmiulotteisessa tapauksessa. Tässä kappaleessa käsitellään tilanteita, joissa piirrettävä tason objekti muodostetaan janoista sopivasti yhdistelemällä, ja keskitytään affiineihin muunnoksiin (lineaarinen muunnos yhdistettynä siirrolla), jotka kuvaavat tason suorat toisiksi tason suoriksi. Affiineista muunnoksista on se etu, että kuvan piirtoa varten niitä riittää soveltaa vain janan päätepisteisiin. Objekti uudelleen asemoituna voidaan piirtää yhdistämällä muunnetut päätepisteet (pikseli)janoilla. Seuraavaksi esitetään vaihe vaiheelta esimerkin avulla hierarkisen mallin laatiminen ja sen esittäminen puuna. Lisäksi esitellään kuinka objektien maailman- 13

20 14 LUKU 2. TASOGRAFIIKKA koordinatit voidaan helposti laskea puuesitys läpikäyden, ja kuinka suuntainformaatio, esimerkiksi pinnan niin kutsutut normaalivektorit, kuvautuu primitiivien määrittelykoordinaatistosta maailmankoordinaatistoon. Tasogeometrian alkeisongelmien ratkaisumenetelmiä esitellään kappaleessa 2.4. Näitä tarvitaan moniin käytännön ongelmiin, kuten piirrettävien objektien ja kuvaikkunan leikkausjoukon laskemiseen ja myöhemmin esiteltäviin kolmiulotteisen grafiikan ongelmiin esimerkkinä vaikkapa annetusta katselupisteestä näkyvien objektien pintojen määräämiseen. Lopuksi esitetään perusmenetelmät kuvan rasterointiin, eli pikseliesityksen tuottamiseen, mukaanlukien janojen ja ympyränkaarten rasterointi, alueiden täyttäminen ja täytettyjen monikulmioiden piirtäminen. 2.1 Siirto, kierto, skaalaus, vääntö Tasografiikan perusmuunnoksia ovat siirto (englanniksi translation), kierto (rotation), skaalaus (scaling) ja vääntö (shear) Siirto-operaatio vektoriyhteenlaskuna Siirto tarkoittaa muunnettavan objektin (kärki)pisteiden poikkeuttamista alkuperäiseltä paikaltaan annetun kaksiulotteisen siirtovektorin t ( ) δx t = δ y määräämään suuntaan siirtovektorin pituuden t verran. Tämä tapahtuu siten, että jokainen piirrettävän objektin piste, jonka koordinaatit ovat (x, y), tulkitaan tason R 2 vektorina, johon siirtovektori yksinkertaisesti lasketaan yhteen, katso kuva 2.1. Täten pisteen (x,y) uusiksi koordinaateiksi tulee (x + δ x,y + δ y ). Siirtooperaation käänteisoperaatio on tietenkin siirto vektorilla t Origokeskinen kierto Tutkitaan kuvan 2.2 tilannetta. Siinä mielivaltainen tason piste (x, y) kierretään origo keskipisteenä vastapäivään kulman ψ verran. Tällöin piste kuvautuu uudeksi pisteeksi (x,y ). Jos nämä pisteet tulkitaan vektoreina, a = ( x y ) ( x, b = y ),

21 2.1. SIIRTO, KIERTO, SKAALAUS, VÄÄNTÖ 15 y x y x+ δ x y+ δ y δ x δ y Kuva 2.1: Tason siirto-operaatio vektoriyhteenlaskuna. x (x,y ) (x,y) φ+ψ φ Kuva 2.2: Origokeskinen tason kierto.

22 16 LUKU 2. TASOGRAFIIKKA on tietenkin voimassa a = b = x 2 + y 2, koska kierrettäessä vektoria origon ympäri ei vektorin pituus muutu. Esitetään vektorit a ja b skaalattuina yksikkövektoreina. Selvästikin a = x 2 + y 2 ( cosφ sinφ ), b = ( ) cos(φ + ψ) x 2 + y 2, (2.1) sin(φ + ψ) missä φ on kulma, jonka vektori a muodostaa x-akselin kanssa. Vastaavasti vektorin b ja x-akselin välinen kulma on φ + ψ. Hyödynnetään sitten kosinin ja sinin summakulman lausekkeita, jotka löytyvät taulukkokirjasta: cos(φ + ψ) = cosφ cosψ sinφ sinψ, sin(φ + ψ) = sinφ cosψ + cosφ sinψ. Nyt suoralla laskulla nähdään, että ( ) x b = y = ( ) cos(φ + ψ) x 2 + y 2 sin(φ + ψ) = ( ) cosφ cosψ sinφ sinψ x 2 + y 2 cosφ sinψ + sinφ cosψ ( ) cosψ sinψ = x ( ) cosφ sinψ cosψ 2 + y 2 sinφ ( ) ( ) ( ) cosψ sinψ x cosψ sinψ = a, sinψ cosψ y sinψ cosψ (2.2) (2.3) eli vektori a kiertyy origon suhteen kulman ψ verran (vastapäivään, jos ψ > 0), kunhan se kerrotaan (vasemmalta, a on pystyvektori) matriisilla ( ) cosψ sinψ R(ψ) =. (2.4) sinψ cosψ Kaavan (2.4) määrittelemä matriisi R(ψ) on erikoinen. Ensinnäkin sen molemmat rivi- ja sarakevektorit ovat yksikkövektoreita (helppo havaita, kun muistaa kaavan cos 2 α + sin 2 α = 1). Lisäksi rivivektorit ovat keskenään ortogonaaliset, samoin kuin sarakevektorit. Tällaista matriisia sanotaan ortogonaaliseksi, ja sillä on silloin näppärä ominaisuus: R(ψ) 1 = R(ψ) T. (2.5) Intuitiivisesti kierron kulman ψ verran käänteisoperaatio on kierto kulman ψ verran. Näin todellakin on, sillä kosinifunktion parillisuudesta ja sinifunktion parittomuudesta seuraa, että ( ) cosψ sinψ R( ψ) = = R(ψ) T = R(ψ) 1. (2.6) sinψ cosψ

23 2.1. SIIRTO, KIERTO, SKAALAUS, VÄÄNTÖ 17 y Kuva 2.3: Kierto saattaa aiheuttaa ei-toivotun siirron. Huomaa, että yllämainittu kiertomatriisi kiertää origon ympäri ja saattaa samalla aiheuttaa objektien ei-toivotun siirtymän, katso kuva 2.3 Jos objektia halutaan kiertää annetun kiertokeskipisteen (x, y) ympäri, täytyy käyttää kolmivaiheista menetelmää (kuva 2.4): Vaiheessa 1 siirretään koko objektia (käytännössä siis vain kärkipisteitä) siten, että haluttu kiertokeskipiste (x, y) siirtyy koordinaatiston origoon. Tätä operaatiota vastaa siirtovektori t = ( x, y) T. Vaiheessa kaksi kerrotaan siirretyt pisteet (vektorit) kiertomatriisilla R(ψ), missä ψ on haluttu kiertokulma. Lopuksi, vaiheessa 3, siirretään vaiheessa 2 kierretyt pisteet vaiheen 1 siirron käänteissiirrolla, jota siis vastaa siirtovektori t = (x,y) T. Ongelma tässä menetelmässä on sen kolmivaiheisuus, joka monimutkaistaa sen toteutusta. Ongelman syynä on se, että siirto ei ole lineaarinen operaatio, vaan affiini, joten sitä ei voi esittää matriisina kuten kiertoa. Jos näin olisi, voisimme muodostaa yhden matriisin jolla kertomalla haluttu lopputulos saavutetaan. Tämä on mahdollista tehdä, kun siirrytään niin kutsuttujen homogeenisten koordinaattien käyttöön luvussa 2.2. x Skaalaus, peilaus Objektin skaalaus toteutetaan kertomalla objektin kärkipisteiden koordinaatit annetuilla skaalauskertoimilla s x,s y, eli uudet koordinaatit x ja y saadaan vanhoista asettamalla x = s x x, y = s y y. Jos skaalauskerroin valitaan negatiiviseksi, skaalausoperaatio samalla peilaa objektin koordinaattiakselin suhteen. Jos s x < 0 (vast. s y < 0), peilautuu objekti y-akselin (vast. x-akselin) suhteen. Selvästi skaalaus voidaan toteuttaa matriisi-vektori kertolaskun avulla, vieläpä diagonaalimatriisil-

24 18 LUKU 2. TASOGRAFIIKKA y y (x,y) (a) x (0,0) (b) x y y (x,y) (0,0) x x (c) Kuva 2.4: Kierto halutun pisteen ympäri: alkutilanne (a), kierron keskipiste siirretty origoon (b), kierto origon ympäri (c), tehdään vaiheen (a) (b) käänteissiirto, lopputulos (d). (d)

25 2.1. SIIRTO, KIERTO, SKAALAUS, VÄÄNTÖ 19 y 3x 3y x y Kuva 2.5: Skaalaus saattaa aiheuttaa ei-toivotun siirron. la kertomalla. Skaalausmatriisi S on luonnollisesti ( ) sx 0 S =. (2.7) 0 s y Kuten kierto saattaa skaalauskin aiheuttaa objektin ei-toivotun siirron. Tätä on havainnollistettu kuvassa 2.5, jossa objektia skaalataan kertoimin s x = 3, s y = 3. Tämä voidaan ehkäistä kuten kierronkin tapauksessa: Siirretään objektin kiintopiste origoon, skaalataan ja siirretään objekti alkuperäiselle paikalleen ensimmäisen siirron käänteissiirrolla Vääntö Objektin väännöllä tarkoitetaan objektin pisteiden toisen koordinaatin, esimerkiksi x-koordinaatin (vast. y-koordinaatin), muuttamista sen y-koordinaatin avulla annetun kertoimen määräämänä (vast. x-koordinaatin). Uudet väännetyt koordinaatit lasketaan vanhoista seuraavasti: Väännettäessä x-akselin suuntaisesti asetetaan x = x + v x y ja y = y, ja väännettäessä y-akselin suuntaisesti asetetaan x = x ja y = y + v y x. Tässä v x ja v y ovat annetut vääntöparametrit. Näitä operaatioita vastaavat matriisit ovat V x = ( ) 1 vx, ja V 0 1 y = x ( ) 1 0. (2.8) v y 1

26 20 LUKU 2. TASOGRAFIIKKA y y θ x x Kuva 2.6: Vääntö x-akselin suuntaan, v x = 1/2. y y x θ x Kuva 2.7: Vääntö y-akselin suuntaan, v y = 1/2.

27 2.2. MUUNNOKSET HOMOGEENISISSA KOORDINAATEISSA 21 Jatkossa x-akselin (vast. y-akselin) suuntaista vääntöä kutsutaan x-väännöksi (vast. y-väännöksi). Vääntöoperaatioita on havainnollistettu kuvissa 2.6 ja 2.7. Kuten havaitaan, x-vääntö säilyttää x-akselin suuntaisten suorien suunnat ja y- vääntö puolestaan y-akselin suuntaisten suorien suunnat. Halutessamme, että väännetyt, alunperin y-akselin suuntaiset suorat muodostavat x-väännön jälkeen kulman θ y-akseliin nähden, valitaan vääntöparametriksi v x = tanθ. Kuvan 2.6 esimerkissä on olettu kulman, joka y-akseliin nähden muodostuu olevan positiivinen. Vastaavasti valitsemalla y-väännön parametriksi v y = tanθ, muodostavat muunnetut x-akselin suuntaiset suorat kulman θ x-akseliin nähden. Kuvassa 2.7 on kulma oletettu negatiiviseksi. Kuten jo aiemmin mainittiin, on esitellyissä tasogeometrian muunnoksissa se huono puoli, ettei siirtoa voi esittää matriisi-vektori -kertolaskuna. Täten emme voi koota yhdeksi matriisiksi (kertomalla peräkkäisiä muunnoksia vastaavat matriisit keskenään) komposiittioperaatioita, kuten kierto annetun pisteen ympäri, skaalaus annettu piste kiintopisteenään tai peilaus annetun suoran suhteen. Ongelmaan on olemassa korjaus, ja ensimmäisen vihjeen siitä antaa edellä esitetty vääntömatriisi. 2.2 Muunnokset homogeenisissa koordinaateissa Edellä, kappaleessa 2.1.4, esitetyllä x-vääntö -operaatiolla on mielenkiintoinen ominaisuus. Tarkastellaan sen toimintaa tason R 2 suoralla y = 1 (joka on samalla eräs R 2 :n hypertaso, eli 2-1 -ulotteinen taso), muistaen, että x-vääntö säilyttää x-akselin suuntaisten suorien suunnat. Otetaan mielivaltainen suoran y = 1 piste (x,1) ja kerrotaan sitä vastaava vektori kaavassa (2.8) esitetyllä matriisilla V x. Saadaan ( 1 vx 0 1 )( x 1 ) = ( x + vx 1 ). (2.9) Havaitaan, että piste (x,1) kuvautuu suoralla y = 1 pisteeksi (x + v x,1), eli piste siirtyy pitkin tätä suoraa, kuva 2.8. Olemme siis itse asiassa onnistuneet esittämään reaalilukujen (yksiulotteisten vektoreiden) yhteenlaskun matriisi-vektorikertolaskuna tasossa R 2. Suora y = 1 on itse asiassa eräs tason R 2 affiini aliavaruus. Sen alkiot ovat muotoa ( ) ( ) x 0 +, (2.10) 0 1 eli ne saadaan siirtämällä R 2 :n lineaarinen aliavaruus R 1 vakiosiirtymävektorilla (0, 1). Affiini aliavaruus ei ole lineaarinen aliavaruus, eli se ei ole suljettu ava-

28 22 LUKU 2. TASOGRAFIIKKA y x 1 x+vx 1 suora y=1 vx vektori 0 Kuva 2.8: Tason x-vääntö siirtää pisteitä suoralla y = 1. x ruudessa R 2 yhteenlaskun ja reaaliluvulla kertomisen suhteen. Tämä on helppo todentaa laskemalla: Olkoon x ja y mielivaltaisia affiinin aliavaruuden A 2 = {(x,y) R 2 y = 1} vektoreita, x = (a,1) T, y = (b,1) T, ja α R x + y = ( ) a + b / A 2 2, α x = ( ) αa A α 2 α = 1. (2.11) Peruslaskuoperaatioiden puuttumisen takia affiiniin aliavaruuteen A 2 kuuluvia R 2 :n alkioita ei kutsutakaan jatkossa vektoreiksi, vaan niistä käytetään nimitystä piste. Affiinin aliavaruuden A 2 pisteeseen (x,1) T voidaan kuitenkin laskea yhteen R 2 :n vektoriyhteenlaskun avulla R 2 :n lineaariseen aliavaruuteen R 1 kuuluvia vektoreita, jotka ovat muotoa (a,0) T (kuvan 2.8 esimerkissä a = v x ) ilman, että päädymme ulos affiinista aliavaruudesta A 2. Tällaisia siirrettävään aliavaruuteen kuuluvia vektoreja kutsutaan jatkossa suuntavektoreiksi, koska ne käytännössä kuvaavat suuntia eivätkä paikkalokaatioita Homogeeniset koordinaatit Edellä esitelty tekniikka yleistyy suoraviivaisesti tasogeometrian operaatioihin. Ideana on, analogisesti edellisen johdannon kanssa, samaistaa avaruus R 2 avaruuden R 3 affiiniin aliavaruuteen A 3 = {(x,y,z) R 3 z = 1}. Tällöin voimme havaita edellisen esimerkin mukaisesti, että R 3 :ssa määritelty xy-vääntöoperaatio (joka nyt pitää xy-tason suuntaiset R 3 :n hypertasot samansuuntaisina), matriisimuodos-

29 2.2. MUUNNOKSET HOMOGEENISISSA KOORDINAATEISSA 23 saan 1 0 v x V xy = 0 1 v y, (2.12) aiheuttaa A 3 :n pisteelle (x,y,1) T siirron suuntavektorin (v x,v y,0) T määräämänä. Tason pisteen (x, y) homogeenisiksi koordinateiksi kutsutaan yleisessä tapauksessa R 3 :n vektoria, joka on muotoa wx wy, missä w R, w 0. (2.13) w Huomaamme, että yhtä tason pistettä kohden on yksiparametrinen parvi homogeenisia koordinaatteja, ne määrittelevät suoran (poislukien origo), joka kulkee origon ja pisteen (x,y,1) kautta avaruudessa R 3. Homogeenisia koordinaatteja käytetään seuraavasti tasografiikkasovelluksissa: Aluksi samaistamme operoitavat tason pisteet, koordinaatteinaan (x,y) R 3 :n vektoreiksi (wx,wy,w) T,w R,w 0 (käytännössä valitaan aina w = 1, jolloin muodostettavat vektorit ovat samalla R 3 :n affiinin aliavaruuden A 3 pisteitä ja siirto-operaatiot toimivat intuitiivisesti). Sen jälkeen sovellamme muodostettuun vektoriin kohta esiteltäviä muunnosmatriiseja haluamallamme tavalla. Lopputuloksena saadaan vektori x y, missä w R, w 0. (2.14) w Lopulliset muunnetut tason koordinaatit saadaan jakamalla kaksi ensimmäistä koordinaattia kolmannella koordinaatilla w, tulos on (x /w,y /w ). Huomautus: Tässä luvussa esitettäviä muunnosmatriiseja käytettäessä, edellyttäen että muunnettavan pisteen homogeeniset koordinaatit muodostetaan valinnalla w = 1, ei loppuvaiheen jakolaskua tarvitse käytännössä toteuttaa. Tämä johtuu siitä, että esitettävät muunnosmatriisit kuvaavat affiinin aliavaruuden A 3 itselleen. Loppuvaiheen jakolaskuoperaatio on kuitenkin muistettava tehdä myöhemmin kolmiulotteisen tapauksen yhteydessä esitettävää perspektiivimuunnosta käytettäessä. Siinä tapauksessa loppuvaiheen jakolasku itse asiassa aiheuttaa perspektiiviefektin.

30 24 LUKU 2. TASOGRAFIIKKA Siirto, kierto, skaalaus ja vääntomatriisit homogeenisissa koordinaateissa Kuten luvussa havaittiin, sopiva siirtomatriisi homogeenisia koordinaatteja käytettäessä on R 3 :ssa operoiva xy-vääntömatriisi. Nimeämme sen nyt uudelleen, samalla parametrisoiden matriisin x- ja y-suunnan siirtoparametrein. Siirto- eli translaatiomatriisi (englanniksi translation matrix) ja sen käänteismatriisi ovat siis 1 0 t x T (t x,t y ) = 0 1 t y, T (t x,t y ) 1 = T ( t x, t y ), (2.15) missä parametrit t x ja t y määrittelevät matriisin aiheuttaman siirron x- ja y-akseleiden suuntaan. Huomaa, että siirtomatriisi kopioi sillä kerrottavan vektorin kolmannen komponentin sellaisenaan tulosvektoriin, eli käyttämämme affiini aliavaruus A 3 on invariantti matriisilla T (t x,t y ) kertomisen suhteen. Huomatus: Itse asiassa mikä tahansa xy-tason kanssa samansuuntainen taso on invariantti tämän matriisin suhteen. Mutta ainoastaan tasolla z = 1 on aiheutuva siirtymä suoraan täsmälleen haluttu (t x,t y,0) T. Tämän takia valitaankin yleensä w = 1, siirryttäessä homogeenisiin koordinaatteihin, koska jakolaskua ei tarvitse suorittaa lopussa palattaessa karteesisiin koordinaatteihin (paitsi perspektiivimuunnosta käytettäessä). Homogeenisissa koordinaateissa operoiva kiertomatriisi (ja sen käänteismatriisi) saadaan helposti laajentamalla kaavan (2.4) matriisi 3 3 -matriisiksi cosψ sinψ 0 R(ψ) = sinψ cosψ 0, R(ψ) 1 = R( ψ), (2.16) joka on parametrisoitu kiertokulmalla ψ. Kun matriisia R(ψ) sovelletaan avaruudessa R 3, aiheuttaa se kierron z-akselin ympäri samalla kiertokulmalla ψ kaikissa xy-tason suuntaisissa tasoissa, erityisesti tasossa z = 1. Affiini aliavaruus A 3 on täten invariantti matriisin R(ψ) suhteen. Skaalaus- ja peilausmatriisi (ja vastaava käänteismatriisi) saadaan samanlaisella laajennuksella kuin edellä. Parametrisoimme syntyvän 3 3-matriisin x- ja y-akselin suuntaisilla skaalauskertoimilla s x ja s y : s x 0 0 S(s x,s y ) = 0 s y 0, S(s x,s y ) 1 = S(1/s x,1/s y ). (2.17) 0 0 1

31 2.2. MUUNNOKSET HOMOGEENISISSA KOORDINAATEISSA 25 Käänteismatriisi on tietenkin määritelty ainoastaan silloin kun kummatkin skaalauskertoimet toteuttavat s x 0 ja s y 0. Samaa ideaa käytetään myös x- ja y-vääntömatriiseille: 1 v x V x (v x ) = ja V y (v y ) = v y 1 0. (2.18) Selvästi V x (v x ) 1 = V x ( v x ) ja V y (v y ) 1 = V y ( v y ). Esimerkkinä esiteltyjen matriisien hyödyllisyydestä palaamme luvun kuvan 2.4 tapaukseen. Siinä haluttiin kiertää objektia jonkin origosta poikkeavan pisteen ympäri. Ongelmaan esitettiin aiemmin kolmivaiheinen menetelmä. Sama operaatio voidaan homogeenisia koordinaatteja käyttäen tehdä yhdellä matriisivektori -kertolaskulla jokaiselle kierrettävän objektin kärkipisteelle. Tämä tehdään kertomalla peräkkäin yhdeksi 3 3-matriisiksi kuhunkin vaiheeseen liittyvät muunnosmatriisit. Vaiheessa 1 halusimme siirtää kierron keskipisteen (x, y) origoon. Tämä voidaan toteuttaa kertomalla kuvan 2.4 (a) objektin kärkipisteet, (esitettynä tietenkin homogeenisissa koordinaateissa) siirtomatriisilla T ( x, y). Seuraavaksi kerrotaan edellä saadut muunnetut koordinaattivektorit kiertomatriisilla R(ψ), missä ψ on haluttu kiertokulma. Viimeinen muunnos on kierron keskipisteen (nyt origo) palauttaminen alkuperäiselle paikalleen. Se tapahtuu kertomalla edellisen vaiheen tulokset siirtomatriisilla T (x,y). Algoritmimuodossa: 1. Laske kaikille alkuperäisen objektin kärkipisteille p i (esitettynä homogeenisissa koordinaateissa) p i = T ( x, y) p i. 2. Kaikille p i, laske p i = R(ψ) p i. 3. Kaikille p i laske p i = T (x,y) p i. 4. Lopulliset koordinaatit saadaan jakamalla kaikkien vektorien p i kaksi ensimmäistä alkiota kolmannella alkiolla (turhaa, jos alunperin siirryttäessä homogeenisiin koordinaatteihin valittiin w = 1). Edellistä algoritmia voi helposti optimoida. Havaitsemme heti, että p i = T (x,y)r(ψ)t ( x, y) p i = M(x,y,ψ) p i, (2.19)

32 26 LUKU 2. TASOGRAFIIKKA missä kolmiparametrinen 3 3-matriisi M(x,y,ψ) on edellisessä algoritmissa sovellettujen muunnosmatriisien tulo: M(x,y,ψ) T (x,y)r(ψ)t ( x, y) cosψ sinψ ysinψ + x(1 cosψ) = sinψ cosψ y(1 cosψ) xsinψ (2.20) Huomautus: Edellä kaavassa (2.20) esitetty matriisi M täytyy muodostaa kertomalla siirto- ja kiertomatriisit keskenään täsmälleen oikeassa järjestyksessä, muutoin tulos ei ole toivottu. Tämä seikka pätee myös muillekin muunnosten yhdistämisille sillä muunnosmatriisit eivät yleensä kommutoi. 2.3 Esimerkki hierarkisesta mallista Nyt käytössämme on tarvittava tietous, jotta voimmme konstruoida yksinkertaisia hierarkisia malleja. Näin voimme koostaa yksinkertaisista taso-objekteista (primitiiveistä) monimutkaisempia kokonaisuuksia vieläpä siten, että malli on luontevasti parametrisoitu esimerkiksi animaatiokuvasarjojen piirtämiseen. Kehitetään esimerkkinä hierarkinen malli kuvan 2.9 esittämälle kolminiveliselle laitteelle. Kuvan 2.9 laite koostuu viidestä osasta. Laitteen jalustaosa on suorakulmio, jonka vasemman alakulman koordinaatit ovat (x 0,y 0 ) ja sen pituus ja korkeus ovat l 2 + 2h ja h. Jalustan päälle on sijoitettu kiinteästi kuvan osoittamaan paikkaan toinen suorakulmio, jonka leveys ja korkeus ovat h ja l 1 + h. Tähän on nivelletty kuvan osoittamalla tavalla kolmas suorakulmio mittoinaan l 2 + 2h h ja niiden väliin muodostuu kulma θ 1. Kulman θ 1 kasvaessa kolmas suorakulmio kiertyy myötäpäivään nivelen ympäri, ja kun θ 1 = 0, ovat suorakulmiot yhdensuuntaiset. Kolmanteen suorakulmioon on vielä nivelletty neljäs mittoinaan l 3 + 2h h siten että ne muodostavat kulman θ 2. Tähän puolestaan laakeroidaan säännöllinen yhdeksänkulmio, jossa etäisyys keskipisteestä kärkipisteeseen on r. Tätä monikulmiota voidaan kiertää laakeripisteen ympäri kulmaa θ 3 muuttamalla. Tällä kertaa kuitenkin kulman θ 3 kasvaessa monikulmio kiertyy vastapäivään. Objektin parametrit ovat x 0, y 0, h, r, l 1, l 2, l 3, θ 1, θ 2 ja θ 3. Käytännössä niitä kuitenkin kannattanee hieman rajoittaa. Kuvan 2.9 tapauksessa oletetaan kaikki pituusparametrit ainakin ei-negatiivisiksi. Kuva 2.9 on piirretty tapauksessa, missä nivelkulmat ovat θ 1 = θ 2 = θ 3 = π/2.

33 2.3. ESIMERKKI HIERARKISESTA MALLISTA 27 y nivel 1 h θ1 l2+2h h nivel 2 l2 h l1+h l1 l3+2h l3 θ2 nivel 3 r θ3 h l2+2h h (x0,y0) x Kuva 2.9: Kolminivelinen taso-objekti. Kuvan esittämä objekti voidaan muodostaa kahden primitiivikappaleen avulla. Ensimmäinen primitiivi on tason yksikköneliö kärkipisteinään (0, 0), (1, 0), (1, 1) ja (0, 1), ja toinen on origokeskinen säännöllinen yhdeksänkulmio, jossa kärkipisteiden etäisyys origosta on r = 1. Tämä kannattanee määritellä siten, että jokin kärkipisteistä on helppo, esimerkiksi piste (0,1) kuten kuvassa Kuten johdannossa tuli jo mainittua, ei hierarkiaesitys ole välttämättä yksikäsitteinen. Johdettava esitys on siis vain eräs kaikista mahdollisista. Lähdetään liikkeelle yhdeksänkulmion ja neljännen suorakaiteen keskinäisestä asemoinnista. Pyritään geometriamuunnoksin saattamaan niistä muokatut objektit kuvassa 2.11 esitettyyn asemaan toisiinsa nähden Tämä saavutetaan seuraavasti: Yksikköneliö skaalataan varren mittoihin ja siirretään kuvan 2.11 osoittamaan paikkaan. Lisäksi kuvan 2.10 säännöllinen yhdeksänkulmio -primitiivi skaalataan oikean kokoiseksi, kierretään sopivaan asentoon ja siirretään kuvan 2.11 osoittamaan paikkaan. Suorakaide yhdeksänkulmiokokonaisuus on koostettu objekti, eräänlainen korkeamman asteen primitiivi, jonka kanoninen asema omassa koordinaatistossaan on juuri kuten kuvassa Huomaa, että sijoitimme origoon sen nivelpisteen, jonka kautta tämä kokonaisuus liittyy ylempään tasoon. Se helpottaa asemointia myöhemmässä vaiheessa.

34 28 LUKU 2. TASOGRAFIIKKA y y (0,1) (0,1) (1,1) r=1 x (0,0) (1,0) x Kuva 2.10: Yhdeksänkulmio- ja yksikköneliöprimitiivit. y h h x l3+2h l3 r θ3 Kuva 2.11: Suorakulmion ja yhdeksänkulmion asemointi.

35 2.3. ESIMERKKI HIERARKISESTA MALLISTA 29 Yksikköneliötä (sen kärkipisteitä esitettynä homogeenisissa koordinaateissa) kuvaamme muunnoksella M 4,1 M 4,1 (l 3,h) = T ( h/2, l 3 h)s(h,l 3 + 2h). (2.21) Selvästi tämä muunnos kuvaa yksikköneliön kärkipisteet (0, 0) ja (1, 1) tason pisteiksi ( h/2, l 3 h) ja (h/2,h). Vastaavasti yhdeksänkulmioprimitiivi kuvataan muunnoksella M 4,2 M 4,2 (l 3,θ 3,r) = T (0, l 3 )R(θ 3 π)s(r,r). (2.22) Kiertomatriisin vaihemuunnos aiheutuu siitä, että yhdeksänkulmioprimitiivin peruskärkipisteeksi otimme pisteen (0, 1). Halusimme kuitenkin, että suuntavektori joka määrää suunnan kiertopisteestä peruskärkipisteeseen muodostaa kulman θ 3 varsimonikulmion suuntavektorin (0, 1,0) T (perusasemassaan) kanssa. Lisäksi kulman θ 3 kasvaessa yhdeksänkulmion tuli kiertää vastapäivään. Helpolla laskulla nähdään, että yhdeksänkulmioprimitiivin peruspiste (0, 1) kuvautuu edellisellä muunnoksella tason pisteeksi ( r sin(θ 3 π),r cos(θ 3 π) l 3 ). Kuva 2.11 on piirretty tapauksessa θ 3 = π/2. Tällä valinnalla pisteen (0,1) kuvapisteen lauseke supistuu muotoon (r, l 3 ). Edellinen koostamisoperaatio voidaan esittää binaaripuumuodossa: Puun juurisolmu kuvaa koostettua objektia. Ensimmäinen latvasolmu kuvaa primitiiviobjektia yksikköneliö ja toinen primitiiviobjektia säännöllinen yhdeksänkulmio. Puun haaroihin liitetään muunnosmatriisit M 4,1 ja M 4,2 kuten kuvassa 2.12, tarkoittaen sitä, että koostettaessa ylemmän tason objektia alipuiden esittämistä yksinkertaisemmista objekteista, tulee alipuun objektit muuntaa haaraan liittyvällä geometriamuunnoksella. Tästä jatkamme liittämällä edellisen alikokonaisuuden nivelen 2 avulla vaakavarsimonikulmioon. Vaakavarsi muodostetaan jälleen yksikköneliöstä skaalaamalla ja siirtämällä. Tämän tekee muunnosmatriisi M 3,1 = M 3,1 (l 2,h) = T ( h, h/2)s(l 2 + 2h,h). (2.23) Edelliseen alipuuhun puolestaan sovelletaan kiertomatriisia, joka suorittaa halutun kierron kulman θ 2 verran, ja sen jälkeen siirtomatriisia, joka siirtää objektin oikealle paikalleen. Muunnos on M 3,2 = M 3,2 (l 2,θ 2,h) = T (l 2,0)R(π/2 θ 2 ). (2.24)

36 30 LUKU 2. TASOGRAFIIKKA Haarautumissolmu y l3+2h h h l3 x r θ3 M 4,1 M 4,2 Latvasolmu primitiivi: yksikköneliö Latvasolmu primitiivi: 9 kulmio y (0,1) (1,1) y (0,1) r=1 (0,0) (1,0) x x Kuva 2.12: Koostettu objekti puuesityksenä.

37 2.3. ESIMERKKI HIERARKISESTA MALLISTA 31 y h l2+2h l2 h θ2 x Kuva 2.13: Suorakulmion ja edellisen alikokonaisuuden asemointi. Kiertomatriisin kulmaparametri aiheutuu siitä, että halusimme kulman θ 2 kasvavan, kun alikokonaisuus kiertyy myötäpäivään ja kulman arvolla θ 2 = 0 halusimme alikokonaisuuden varren yhdensuuntaiseksi vaakavarsimonikulmion kanssa. Nyt olemme päätyneet kuvan 2.13 tilanteeseen. Kuvassa 2.13 esitetyn kaksinivelisen objektin puuesitys saadaan muodostamalla uusi haarautumissolmu. Tähän solmuun liitetään latvasolmu, jonka primitiiviobjekti on yksikköneliö ja haaraan liitetään muunnosmatriisi M 3,1. Toiseen haaraan puolestaan kytketään muunnosmatriisin M 3,2 avulla alipuuksi edellisen vaiheessa muodostettu binaaripuu, katso kuva Tästä jatketaan edelleen samalla periaatteella. Lisätään uusi haarautumissolmu, joka kuvaa ylemmän tason kokonaisuutta ja siitä haarautuviksi alipuiksi valitaan, sopivin muunnoksin operoituna, alemman tason kokonaisuuksia tai primitiivikappaleita kuvaavat alipuut. Koostetaan objektia eteenpäin yhdistämällä tähän mennessä rakennettuun kokonaisuuteen pystyvarsi, joka jälleen tehdään yksikköneliöstä, tällä kertaa vain skaalaamalla. Muodostetaan muunnosmatriisi M 2,1 = M 2,1 (l 1,h) = S(h,l 1 + h), (2.25) joka kuvaa yksikköneliön pystyvarren muotoiseksi suorakaiteeksi, jonka vasen alakulma on origossa. Kuvan 2.13 objekti muunnetaan puolestaan matriisilla M 2,2 = M 2,2 (l 1,θ 1,h) = T (h/2,l 1 )R(π/2 θ 1 ). (2.26) Lopputuloksena saadaan kuvan 2.15 esittämä koostettu objekti. Vastaava täydennetty puu on esitetty kuvassa 2.16.

38 32 LUKU 2. TASOGRAFIIKKA Haarautumissolmu y h l2+2h l2 h θ2 x M 3,1 M 3,2 Latvasolmu primitiivi: yksikköneliö y (0,1) (1,1) (0,0) (1,0) x l3+2h Alipuu y h h l3 r θ3 x Kuva 2.14: Seuraava ylempi taso puussa, oikea alipuu on esitetty kuvassa y θ1 l1+h l1 h x Kuva 2.15: Pystyvarsi liitetään edelliseen alikokonaisuuteen.

39 2.3. ESIMERKKI HIERARKISESTA MALLISTA 33 Haarautumissolmu y θ1 l1+h l1 h x M 2,1 M 2,2 Latvasolmu primitiivi: yksikköneliö Alipuu y (0,1) (1,1) y h l2+2h l2 h θ2 x (0,0) (1,0) x Kuva 2.16: Seuraava ylempi taso puussa, oikea alipuu on esitetty kuvassa 2.14.

40 34 LUKU 2. TASOGRAFIIKKA y (x2,y2) (x1,y1) h l2+2h h x Kuva 2.17: Koostettu objekti valmiina asemoitavaksi lopulliselle paikalleen. Olemme saaneet lopullisen objektin lähes valmiiksi. Enää tarvitsee liittää varsikokonaisuus kiinteästi pohjasuorakulmioon oikeaan paikkaan ja asemoida saatu kokonaisuus siten, että sen alanurkan koordinaateiksi tulee vaaditut (x 0,y 0 ). Pohjataso kannattaa asemoida siten, että sen vasen alanurkka sijaitsee origossa, jolloin viimeisessä vaiheessa riittää tehdä pelkkä siirto-operaatio. Pohjataso syntyy jälleen yksikköneliöstä skaalaamalla. Muunnosmatriisi on M 1,1 = M 1,1 (l 2,h) = S(l 2 + 2h,h). (2.27) Varsikokonaisuutta puolestaan operoidaan pelkällä siirtomatriisilla, joka asemoi sen oikealle paikalleen. Muunnos on M 1,2 = M 1,2 (h) = T (h/2,h). (2.28) Lopputulos on esitetty kuvassa 2.17, puun ylin taso kuvassa 2.18, ja puu kokonaisena kuvassa Itse objektin mallittamista ei ehkä kannata jatkaa enää eteenpäin, sillä tässä asemassaan sen rakenne on jo valmis ja sen kiintopiste on mielekkäässä paikassa, eli origossa, joten objektin jatkomuokkaus tästä eteenpäin (skaalaus, kierto, siirto haluttuun paikkaan tasossa) on enemmänkin loppusovelluskohtaista. Huomautus: Jos haluamme mallin täsmälleen kuvan 2.9 objektista, tehdään puuhun vielä uusi juurisolmu, jonka toinen haara on tyhjä ja jonka toiseen haaraan liitetään alipuuksi kuvan 2.19 esittämä puu. Muunnosmatriisi, jota sovelletaan alipuuhun on selvästi siirtomatriisi T (x 0,y 0 ). Toinen vaihtoehto saavuttaa sama lopputulos esitetään tämän luvun lopussa.

41 2.3. ESIMERKKI HIERARKISESTA MALLISTA 35 y Juurisolmu h l2+2h h x M 1,1 M 1,2 Latvasolmu primitiivi: yksikköneliö Alipuu y (0,1) (1,1) y θ1 l1+h l1 (0,0) (1,0) x h x Kuva 2.18: Ylin taso puussa, oikea alipuu on esitetty kuvassa 2.16.

42 36 LUKU 2. TASOGRAFIIKKA y Juurisolmu h l2+2h h x M 1,1 M 1,2 Latvasolmu primitiivi: yksikköneliö y (0,1) (1,1) Haarautumissolmu y θ1 l1+h l1 (0,0) (1,0) x h x M 2,1 M 2,2 Latvasolmu primitiivi: yksikköneliö y (0,1) (1,1) y h Haarautumissolmu l2+2h l2 h x θ2 (0,0) (1,0) x M 3,1 M 3,2 Latvasolmu primitiivi: yksikköneliö Haarautumissolmu y y (0,1) (0,0) (1,1) (1,0) x h h l3+2h l3 r θ3 x M 4,1 M 4,2 Latvasolmu primitiivi: yksikköneliö Latvasolmu primitiivi: 9 kulmio y (0,1) (1,1) y (0,1) r=1 (0,0) (1,0) x x Kuva 2.19: Luotu (binaari)puu.

43 2.3. ESIMERKKI HIERARKISESTA MALLISTA 37 Kuinka nyt lasketaan käyttäjän antamin parametriarvoin h, r, l 1, l 2, l 3, θ 1, θ 2 ja θ 3 annetun pisteen koordinaatit kuvan 2.17 koordinaatistossa? Ne saadaan laskettua kulkemalla puuta sen juurisolmusta kohti sitä latvasolmua, jonka primitiivikappaleen piste kysytty piste on. Tämä toteutetaan siten, että alustetaan kokonaismuunnosmatriisiksi M = I. Kuljettaessa puuta kohti latvaa kerrotaan samalla tähän mennessä kumuloitunut kokonaismuunnosmatriisi oikealta muunnosmatriisilla joka on liitetty sen alipuun haaraan, johon on siirryttävä kuljettaessa kohti päämääränä olevaa lehtisolmua. Esimerkkinä lasketaan kuvassa 2.17 olevan kahden kärkipisteen koordinaatit. Molemmat liittyvät aivan ensivaiheessa muodostettuun pystyvarteen ja yhdeksänkulmioon. Pisteeksi (x 1,y 1 ) kuvautuu primitiivi yhdeksänkulmion peruspiste (0,1), ja pisteeksi (x 2,y 2 ) puolestaan pystyvarreksi muokatun yksikköneliön kärkipiste (0,1). Käymällä puu edellä kuvatulla tavalla läpi, saadaan x 1 0 y 1 = M 1,2 (h)m 2,2 (l 1,θ 1,h)M 3,2 (l 2,θ 2,h)M 4,2 (l 3,θ 3,r) 1, 1 1 x 2 0 y 2 = M 1,2 (h)m 2,2 (l 1,θ 1,h)M 3,2 (l 2,θ 2,h)M 4,1 (l 3,h) (2.29) Itse kuvan piirtämistä varten objektit sijoitetaan yhteen ja samaan koordinaatistoon, jota kutsutaan maailmankoordinaatistoksi (englanniksi world coordinates). Jos haluamme sijoittaa edellä mallitetun laitteen maailmankoordinaatistoon kuvan 2.9 esittämään asemaan, alustamme puuta läpikäydessä kokonaismuunnosmatriisiksi M sen geometrisen muunnoksen, joka siirtää, kiertää ja skaalaa laitteen sopivasti. Tässä tapauksessa pelkkä siirto riittää, joten alustamme M = T (x 0,y 0 ). Parametrien määräämä objekti kuvataan maailmankoordinaatistoon läpikäymällä puu rekursiivisesti vaikkapa esijärjestyksessä aloittaen juurisolmusta. Kärkipisteiden maailmankoordinaatit (binaaripuutapauksessa) saadaan seuraavalla algoritmilla: Jos vuorossa oleva puun solmu on latvasolmu, kerrotaan siihen liittyvän primitiiviobjektin homogeenisissa koordinaateissa esitetyt kärkipisteet kumuloituneella muunnosmatriisilla M ja palataan edelliselle tasolle. Jos solmu on puolestaan haarautumissolmu, toteutetaan sama algoritmi ensin vasemmalle alipuulle kertomalla sen läpikäyntiä varten tähän tasoon mennessä kumuloitunut muunnosmatriisi M oikealta vasempaan haaraan liittyvällä muunnosmatriisilla. Tämän jälkeen sama algoritmi toteutetaan oikealle alipuulle, mutta tällöin muunnosmatriisiksi asetetaan tähän tasoon mennessä kumuloitunut muunnosmatriisi M ker-

44 38 LUKU 2. TASOGRAFIIKKA (0,1) T y (0,1) (1,1) ( 1,0) T (1,0) T (0,0) (1,0) x (0, 1) T Kuva 2.20: Yksikköneliö normaalivektoreineen. rottuna oikealta oikeaan haaraan liittyvällä muunnosmatriisilla. Lopuksi palataan edelliselle tasolle Normaalivektorien kuvautuminen hierarkisessa mallissa Myöhemmin erityisesti valaistussimuloinnissa kolmiulotteisen grafiikan yhteydessä tarvitsemme objektin pinnan ulkonormaalivektoreita maailmankoordinaatistossa. Pinnan pisteeseen liittyvä ulkonormaalivektori on siis se vektori n, joka on kohtisuorassa pisteeseen liittyvää tangenttitasoa vastaan ja osoittaa lokaalisti poispäin objektista. Koska käsittelemme kaksiulotteisia monikulmio-objekteja, on tangenttitaso luonnollisesti monikulmion pintajanan suuntainen suora. Huomautus: Vaikka tässä luvussa käsitelläänkin ainoastaan kaksiulotteista tapausta, toimii sama tekniikka myös kolmiulotteisissa hierarkisissa malleissa. Hierarkisen mallituksen ideana on, että primitiiviobjektit esitetään omissa mallituskoordinaatistoissaan, joissa niiden määrittely on miellyttävää. Primitiivikappaleen ulkonormaalivektorit ovat yleensä myös helppoja määritellä mallituskoordinaatistossa. Esimerkiksi yksikköneliön neljään sivuun liittyvät ulkonormaalit ovat tietenkin vektorit (1,0) T, (0,1) T, ( 1,0) T ja (0, 1) T, katso kuva Primitiivikappale kuvataan mallituskoordinaateista maailmankoordinaatteihin kertomalla sen kärkipistekoordinaatit homogeenisissa koordinaateissa operoivalla muunnosmatriisilla M = M 1 M 2...M q, jolle on olemassa käänteismatriisi M 1 =

45 2.3. ESIMERKKI HIERARKISESTA MALLISTA 39 Mq 1...M2 1 M 1 1. Merkitään pinnan ulkonormaalivektoria maailmankoordinaatistossa esitettynä n w :llä (w - world) ja mallituskoordinaatistossa esitettynä n o :lla (o - object). (Huomautus: homogeenisia koordinaatteja käytettäessä ne tulee esittää suuntavektoreina, eli lavennettaessa ne R 3 :n vektoreiksi asetetaan viimeinen komponentti nollaksi. Katso tämän kappaleen loppuosa) Olkoon p o 1 = (xo 1,yo 1,1) ja po 2 = (xo 2,yo 2,1), po 1 po 2 kaksi mielivaltaista primitiiviobjektin erään pintajanan pistettä esitettynä homogeenisissa koordinaateissa. Tällöin suuntavektori p o 2 po 1 = (xo 2 xo 1,yo 2 yo 1,0)T on pintajanan suuntainen ja täten kohtisuorassa kyseisen janan ulkonormaalisuuntavektorin n o = (n o x,n o y,0) kanssa, eli ( n o, p o 2 po 1 ) = 0. Sovellettaessa muunnosta M pisteisiin po 1 ja po 2, ne kuvautuvat maailmankoordinaatistoon samalle janalle pisteiksi p w 1 = Mpo 1 ja p w 2 = Mpo 2. Täten maailmankoordinaatistossa esitetty suuntavektori pw 2 pw 1 on janan pinnan suuntainen sillä käytettävät geometriset muunnokset kuvaavat suorat suoriksi. Halutun maailmankoordinaatiston ulkonormaalisuuntavektorin n w tulisi siis toteuttaa (p w 2 pw 1, nw ) = 0 (2.30) kaikille kuvatun janan pisteille p w 1 ja pw 2. Nyt matriisi-vektorikertolaskun ja sisätulon ominaisuuksien perusteella on 0 = (p w 2 pw 1, nw ) = (M(p o 2 po 1 ), nw ) = (p o 2 po 1,MT n w ). (2.31) Koska matriisi M on ei-singulaarinen (eli on olemassa M 1 ), täytyy edellisen olla voimassa mielivaltaisille pisteille p o 1, po 2 primitiiviobjektin janalla. Nyt ainoa (itse asiassa se on skaalausta vaille yksikäsitteinen) suuntavektori, joka on kohtisuorassa kaikkia mahdollisia suuntavektoreita p o 2 po 1 vastaan on no, joten täytyy olla M T n w = n o n w = (M T ) 1 n o (M 1 ) T n o. (2.32) Koska (M 1 ) T = (Mq 1 M2 1 M 1 1 )T = (M1 1 )T (M2 1 )T (Mq 1 ) T, (2.33) kannattaa puuesityksen haarautumiskohtiin tallettaa sekä itse muunnosmatriisi, että sen käänteismatriisin transpoosimatriisi. Matriisi M = (M 1 ) T jolla mallituskoordinaattien normaalit siis kuvataan maailmankoordinaatteihin lasketaan puuta läpikäydessä samalla tavalla kuin itse muunnosmatriisi M. Se muodostetaan, alkaen identtisestä matriisista M = I, kertomalla kyseiseen tason asti kumuloitunut

46 40 LUKU 2. TASOGRAFIIKKA matriisi M oikealta siirryttävään haaraan liittyvällä muunnoksen käänteismatriisin transpoosimatriisilla. Lehtisolmuun päädyttäessä saamme maailmankoordinaatistoesitykset objektin ulkonormaalisuuntavektoreille kertomalla primitiiviobjektin lokaalit ulkonormaalisuuntavektorit kumuloituneella matriisilla: x w i x o i n w i = y w i = M y o i M n o i. (2.34) 0 0 Huomautus: Vaikka primitiiviobjektin normaalit esitettäisiin yksikkövektorina, eivät saadut maailmankoordinaatiston normaalivektorit välttämättä ole enää yksikkövektoreita, sillä mahdollisesti käytetty skaalausoperaatio muuttaa pituuksia. Loppukäyttöä varten saattaa siis olla välttämätöntä skaalata saatu vektori yksikkövektoriksi. Huomautus: Normaalivektorit tulee käsitellä suuntavektoreina (muuten tulos voi olla täysin väärä), eli muunnettaessa ne homogeeniseen koordinaatistoon, tulee viimeiseksi komponentiksi asettaa nolla, kuten kaavassa (2.34). Homogeenisissa koordinaateissa esitettyjen muunnosmatriisien vasemman yläkulman 2 2-lohkoa sanotaan muunnoksen vektoriosaksi, sehän operoi suoraan R 3 :n vektorialiavaruudessa R 2. Tämä on se osa muunnosmatriiseista, joka vaikuttaa suuntainformaatioon. Esimerkiksi siirto-operaatio ei vaikuta millään tavalla kappaleen suunnistukseen, se vain vaihtaa kappaleen paikkaa. 2.4 Sekalaisia tasogeometrian ongelmia Seuraavaksi käsittelemme muutamia hyödyllisiä tekniikoita tavanomaisimpien tasogeometrian ongelmien ratkaisemiseksi Kummalla puolen suoraa piste on? Olkoon xy-tasossa määritetty suunnattu suora L, sekä olkoon annettu tason piste (x,y). Tavoitteena on päätellä kummalla puolen, oikealla vai vasemmalla, annettu piste on suoraan L nähden, kun katsotaan suoran suuntaan. Kaikki suoran pisteet voidaan esittää parametrisoidussa muodossa (x(t),y(t)) = (x 0 + at,y 0 + bt), t R, (2.35)

47 2.4. SEKALAISIA TASOGEOMETRIAN ONGELMIA 41 z Vektori t x s =(0,0,b(x x0) a(y y0)) T y Vektori s=(a,b,0) T (x0,y0,0) (x0+a,y0+b,0) (x,y,0) Suora L Vektori t=(x x0,y y0,0) T x Kuva 2.21: Piste oikealla puolen suoraa, ristitulovektori on positiivisen z-akselin suuntainen. missä (a,b) T on suoran suuntavektori ja (x 0,y 0 ) on jokin suoran piste. Tulkitaan sama tilanne avaruudessa R 3. Tällöin suora kulkee edelleen pitkin xy-tasoa ja parametrisoinniksi tulee (x(t),y(t),z(t)) = (x 0 + at,y 0 + bt,0), t R. (2.36) Suoran suuntainen vektori on tällöin s = (a,b,0) T. Muodostetaan vektori t = (x x 0,y y 0,0) T ja lasketaan ristitulo t s, saadaan 0 t s = 0 b(x x 0 ) a(y y 0 ). (2.37) Ristitulovektorin kolmannen komponentin etumerkki kertoo kummalla puolen tarkasteltavaa suunnattua suoraa L piste (x,y) on. Jos b(x x 0 ) a(y y 0 ) > 0, on piste oikealla puolella. Jos b(x x 0 ) a(y y 0 ) < 0, on piste puolestaan vasemmalla puolella. Jos b(x x 0 ) a(y y 0 ) = 0, on piste (x,y) eräs suoran L piste. Tämä aiheutuu ristitulo-operaation ominaisuudesta täydentää lineaarisesti riippumaton vektoripari oikeakätisesti suunnatuksi kolmikoksi, katso kuvat 2.21 ja Leikkaavatko annetut janat toisensa? Olkoon tasossa annettu kaksi janaa, joista ensimmäisen päätepistepari on (p 1,q 1 ), (r 1,s 1 ) ja toisen (p 2,q 2 ), (r 2,s 2 ), kuva Tutkitaan kahta eri lähestymistapaa.

48 42 LUKU 2. TASOGRAFIIKKA z Vektori t=(x x0,y y0,0) T (x,y,0) (x0,y0,0) y Vektori s=(a,b,0) T (x0+a,y0+b,0) Suora L x Vektori t x s =(0,0,b(x x0) a(y y0)) T Kuva 2.22: Piste vasemmalla puolen suoraa, ristitulovektori on negatiivisen z- akselin suuntainen. y (p1,q1) (1) (r2,s2) (2) (p2,q2) (r1,s1) x Kuva 2.23: Tason kaksi janaa päätepisteineen.

49 2.4. SEKALAISIA TASOGEOMETRIAN ONGELMIA 43 z Vektori t=(0,0,1) T y Vektori s=(r1 p1,s1 q1,0) T (p1,q1,0) (r1,s1,0) Janan suuntainen suora x Vektori s x t = (s1 q1,p1 r1,0) T Kuva 2.24: Tasojanan normaalivektorin määrääminen ristitulon avulla. Ensimmäinen soveltuu ehkä paremmin tapauksiin, joissa pelkkä tieto leikkaamisesta riittää, ja emme ole kiinnostuneita itse leikkauspisteestä. Määritetään aluksi janoja pitkin kulkevien tason suorien yhtälöt implisiittimuodossa. Tähän voidaan hyödyntää jälleen ristituloa. Sen avulla lasketaan vektori, joka on kohtisuorassa janaa pitkin kulkevan suoran suunnan osoittavan vektorin kanssa. Tarkastellaan janaa (1). Määritellään R 3 :n vektorit s = (r 1 p 1,s 1 q 1,0) T ja t = e 3 = (0,0,1) T. Selvästikin ( s, t) = 0, joten ne ovat kohtisuorassa toisiinsa nähden. Täten niiden ristitulovektori (kuva 2.24) täydentää ne oikeakätisesti suunnatuksi ortogonaaliseksi kolmikoksi: s 1 q 1 s t = p 1 r 1. (2.38) 0 Tästä saamme R 2 :n vektorin n 1, joka on kohtisuorassa janaa (1) kohden. Vektori n 1 on ( ) s1 q n 1 = 1, (2.39) p 1 r 1 ja sitä kutsutaan janan (1) (erääksi) normaalivektoriksi. Vektori n 1 osoittaa oikealle jos janaa (1) katsotaan vektorin s suuntaan. Vektorin n 1 avulla voimme lausua janan (1) suuntaisen suoran yhtälön kompaktissa muodossa. Olkoon (x (1) 0,y(1) 0 ) jokin suoran piste, esim. (x (1) 0,y(1) 0 ) = (p 1,q 1 ). Tällöin tason piste (x,y) kuuluu

50 44 LUKU 2. TASOGRAFIIKKA Suora L y Projektion pituus = (n,a1) = (n1,a1) / n1 (x0,y0) Vektori a1 (x,y) Vektori n=n1/ n1, n =1 x Vektori n1 Kuva 2.25: Pisteen etäisyys suorasta. suoralle, jos ja vain jos ( n 1, a 1 (x,y)) = 0, missä ( ) x x (1) a 1 (x,y) = 0 y y (1) R 2. 0 (2.40) Eli piste (x,y) kuuluu suoralle, jos ja vain jos sitä vastaava vektori a 1 (x,y) on kohtisuorassa normaalivektorin n 1 kanssa. Sisätulon ominaisuuksista seuraa myös se tosiasia, että jos piste (x, y) on vektorin s suuntaan katsottuna suoran oikealla (vast. vasemmalla) puolella, on tällöin ( n 1, a 1 (x,y)) > 0 (vast. ( n 1, a 1 (x,y)) < 0). Lisäksi kaavan (2.40) sisätulolausekkeen avulla saamme helposti laskettua annetun pisteen (x,y) kohtisuoran etäisyyden d L (x,y) janan (1) kautta kulkevaan suoraan L. Kuvassa 2.25 esitetään geometrinen perustelu sille, että d L (x,y) = ( n 1, a 1 (x,y)). (2.41) n 1 Tämä aiheutuu siitä, että selvästikin pisteen (x,y) kohtisuora etäisyys suorasta on vektorin a 1 projektion pituus normaalivektorin n 1 suuntaiselle suoralle. Tämähän voitiin laskea suoraan vektoreiden a 1 ja n sisätulon itseisarvona, missä n on yksikkövektoriksi skaalattu vektori n 1, eli n = n 1 / n 1. Edellä esitetyn suoran yhtälön avulla saamme seuraavan algoritmin: Kummallekin janalle (1) ja (2) muodostetaan edellä esitetyllä tavalla niitä vastaavat nor-

51 2.4. SEKALAISIA TASOGEOMETRIAN ONGELMIA 45 maalivektorit n 1 ja n 2. Sen jälkeen tutkitaan, onko voimassa ( n 1, a 1 (p 2,q 2 ))( n 1, a 1 (r 2,s 2 )) < 0, (2.42) eli ovatko pisteet (p 2,q 2 ) ja (r 2,s 2 ) eri puolilla janaa (1) pitkin kulkevaa suoraa. Jos (2.42) ei ole voimassa, eivät janat voi aidosti leikata. Jos (2.42) pätee, tutkitaan lisäksi päteekö ehto ( n 2, a 2 (p 1,q 1 ))( n 2, a 2 (r 1,s 1 )) < 0, missä a 2 (x,y) = ( x x (2) 0 y y (2) 0 ) R 2, (2.43) ja (x (2) 0,y(2) 0 ) on jokin janaa (2) pitkin kulkevan suoran piste, esimerkiksi piste (p 2,q 2 ). Se, että molemmat ehdot (2.42) ja (2.43) ovat samanaikaisesti voimassa tarkoittaa geometrisesti sitä, että kummankin janan päätepisteet ovat eripuolilla toista janaa pitkin kulkevaa suoraa eli janat leikkaavat toisiaan, kuten kuvassa Jos jokin lausekkeiden (2.42) ja (2.43) sisätuloista saa arvon nolla, leikkaavat janat vastaavassa janan päätepisteessä. Jos tarvitsemme myös leikkauspisteen koordinaatit, kannattanee määritellä janojen parametrisoidut esitykset { x 1 (t) = p 1 +t(r 1 p 1 ), y 1 (t) = q 1 +t(s 1 q 1 ), ja { x 2 (u) = p 2 + u(r 2 p 2 ), y 2 (u) = q 2 + u(s 2 q 2 ), (2.44) ja ratkaista t ja u saatavasta yhtälöparista (x 1 (t),y 1 (t)) = (x 2 (u),y 2 (u)). Tästä saadaan yhtälöryhmä ( )( ) ( ) r1 p 1 p 2 r 2 t p2 p = 1. (2.45) s 1 q 1 q 2 s 2 u q 2 q 1 Jos yllä olevan yhtälöryhmän kerroinmatriisi on singulaarinen, eli (r 1 p 1 )(q 2 s 2 ) = (s 1 q 1 )(p 2 r 2 ), ei yhtälöryhmällä ole yksikäsitteistä ratkaisua. Tämä tarkoittaa sitä, että vastaavat janat ovat täsmälleen yhdensuuntaiset tai ainakin toinen niistä on surkastunut pisteeksi. Jos yksikäsitteinen ratkaisu löytyy, ja saadut u ja t kuuluvat avoimelle välille (0, 1), leikkaavat janat aidosti sisäpisteissään ja leikkauspisteen koordinaatit saadaan sijoittamalla u tai t lausekkeeseensa kaavassa (2.44). Jos u tai t saa (2.45):n ratkaisussa arvon 0 tai 1, leikkaa vastaava jana toista toisessa päätepisteessään. Harjoitustehtävänä tutkittakoon kuinka determinanttilauseketta (r 1 p 1 )(q 2 s 2 ) (s 1 q 1 )(p 2 r 2 ), joka pitää ratkeavuuden selvittämiseksi laskea, voi myöhemmin hyödyntää ratkaistaessa itse yhtälöpari (2.45).

52 46 LUKU 2. TASOGRAFIIKKA y y (x,y) (0,0) x x Kuva 2.26: Siirretään monikulmio, ja tutkitaan montako sivujanaa positiivinen y- akseli leikkaa. Jos halutaan laskea janan ja suoran leikkauspiste voidaan soveltaa edellistä menetelmää. Muodostetaan suoran suuntainen jana ja lasketaan edellisellä tavalla janojen leikkauspiste, mutta sallitaan suoran suuntaisen janan leikkauspisteelle parametriarvoiksi kaikki reaaliluvut Onko tason piste suljetun monikulmion sisäpuolella? Olkoon annettu suljettu tason monikulmio ja tason piste (x, y). On selvitettävä onko piste (x, y) monikulmion sisällä. Ideana on tehdä tason siirto, joka kuvaa tutkittavan pisteen origoksi (0, 0) ja tutkia leikkaako positiivinen y-akseli parillisen vai parittoman määrän siirretyn monikulmion sivujanoja, kuva Jos leikkauspisteiden määrä on pariton, on piste monikulmion sisällä. Muussa tapauksessa piste on joko monikulmion reunalla tai sen ulkopuolella. Jos positiivinen y-akseli kulkee täsmälleen kulmapisteen kautta, toimitaan seuraavasti: Koska monikulmio on suljettu, liittyy jokaiseen kärkipisteeseen täsmälleen kaksi janaa. Tutkitaan ovatko näiden janojen toiset päätepisteet samalla puolella y-akselia. Jos ovat, lasketaan leikkauspiste mukaan kahdesti. Jos päätepisteet ovat eri puolella, lasketaan leikkauspiste mukaan vain kerran. Jos testausvuorossa olevan sivujanan päätepisteiden x-koordinaatit ovat samanmerkkiset, ei jana voi leikata y-akselia. Muutoin määrätään edellisen kappaleen menetelmällä vuorossa olevan janan ja esim. sen janan, jonka päätepisteet ovat (0, 0) ja (0, 1) leikkauspisteen y-koordinaatti. Jos se on positiivinen, leikkaa jana positiivista y-akselia. Tässä tapauksessa on sallittava kaikki positiiviset parametriarvot y-akselin suuntaisen janan parametriesitykselle, jotta löydetään leik-

53 2.4. SEKALAISIA TASOGEOMETRIAN ONGELMIA 47 y (x_max, y_max) (x_min, y_min) Kuva 2.27: Kuvaikkuna määriteltynä maailmankoordinaateissa. x kauspisteet pisteen (0,1) yläpuolelta. Liukulukuaritmetiikka voi aiheuttaa pyöristysvirheitä vertailuissa. Koska monikulmio oletettiin suljetuksi, on virhe yleensä samansuuntainen molemmilla samaan ongelmalliseen kärkipisteeseen liittyvillä reunajanoilla, joten ne kumoavat toinen toisensa. Silloinkin kun testattava jana on lähes y-akselin suuntainen, ei pikku virheistä ole haittaa vaan ne yleensä kumoavat toisensa. Täten pyöristysvirheet eivät haittaa testiä, jos testattava piste on selvästi monikulmion sisällä. Jos piste on aivan reunan vieressä, voi tulos olla epävarma Janan leikkaaminen suorakulmiolla Kuva piirretään maailmankoordinaatistoon sijoitetuista objekteista. Yleensä kuvaan rajataan jokin koordinaattiakselien mukaan suunnattu suorakulmion muotoinen alue, kuvaikkuna, koordinaatistotasosta. Tämä suorakaide kuvataan sitten rasterinäyttölaitteen pikselikoordinaateiksi sopivasti siirtämällä ja skaalaamalla. Lopuksi pikselikoordinaatit saadaan kokonaisluvuiksi pyöristämällä. Piirron nopeuttamiseksi ja mahdollisten indeksointiongelmien (laittomien pikselikoordinaattien) ehkäisemiseksi piirrettävät objektit yleensä leikataan kuvaikkunan kanssa. Olkoon leikkaava kuvaikkuna määritelty maailmankoordinaateissa vasemman alanurkan ja oikean ylänurkan koordinaattien (x min,y min ), (x max,y max ) avulla, katso kuva 2.27.

54 48 LUKU 2. TASOGRAFIIKKA y Leikattava (x_max, y_max) Ok (x_min, y_min) Ei tietoa x Kuva 2.28: Janojen luokittelu päätepisteiden avulla. Selvästikin piste (x,y) on kuvaikkunan sisällä, jos x min x x max ja y min y y max, ja annettu jana on kokonaan kuvaikkunan sisäpuolella jos sen molemmat päätepisteet ovat siellä. Tällöin jana voidaan triviaalisti hyväksyä piirrettäväksi. Jos toinen janan päätepisteistä on kuvaikkunasuorakaiteen sisäpuolella ja toinen ulkopuolella, tiedämme välittömästi, että jana täytyy leikata ikkunalla. Jos molemmat päätepisteet ovat ulkopuolella, emme voi tietää ilman lisätarkasteluja tarvitseeko janaa leikata, katso kuva Jatkossa käytämme parametrisoitua esitystä leikattaville janoille ja kuvaikkunan reunajanoille ja hyödynnämme kappaleessa esitettyä tekniikkaa. Cohenin ja Sutherlandin menetelmä Tarkastellaan ensiksi erästä varhaisemmista menetelmistä janan leikkaamiseksi suorakulmiolla. Menetelmän esittelivät Cohen ja Sutherland 1970-luvun puolivälissä. Menetelmässä on ideana jakaa reaalilukutaso R 2 yhdeksään osa-alueeseen kuvaikkunan määräämänä. Jokaiselle osa-alueelle annetaan nelibittinen koodi kuvaikkunan reunajanojen kautta kulkevien suorien avulla. Jokaiselle tason pisteelle (x,y) annetaan bittikoodi seuraavasti: Bitti 1=1, piste on kuvaikkunan yläreunan kautta kulkevan suoran yläpuolella (y > y max ),

55 2.4. SEKALAISIA TASOGEOMETRIAN ONGELMIA (x_max, y_max) (x_min, y_min) Kuva 2.29: R 2 :n jako osa-alueisiin kuvaikkunan avulla ja osa-alueiden bittikoodit. Bitti 2=1, piste on kuvaikkunan alareunan kautta kulkevan suoran alapuolella (y < y min ), Bitti 3=1, piste on kuvaikkunan oikean reunan kautta kulkevan suoran oikealla puolella (x > x max ), Bitti 4=1, piste on kuvaikkunan vasemman reunan kautta kulkevan suoran vasemmalla puolella (x < x min ). Tämä valinta johtaa kuvan 2.29 mukaiseen koodiesitykseen syntyneille osaalueille. Menetelmä toimii siten, että aluksi leikattavan janan päätepisteille P 1 ja P 2 määritellään nelibittiset kuvan 2.29 mukaiset koodit C 1 ja C 2 vertailemalla päätepisteiden koordinaatteja kuvaikkunan äärikoordinaatteihin. Jos C 1 = 0000 ja C 2 = 0000, voidaan jana hyväksyä sellaisenaan piirrettäväksi. Jos näin ei ole, tutkitaan seuraavaksi onko C 1 &C , missä & tarkoittaa biteittäistä andoperaatiota. Tämä ehto on voimassa, jos janan molemmat päätepisteet ovat saman reunasuoran kuvaikkunan ulkopuoleisessa puoliavaruudessa, eli vastaavat koodit jakavat ulkopuolellaolobitin. Tällöin testattava jana on kokonaan kuvaikkunan ulkopuolella, ja se voidaan unohtaa. Jollei janaa sellaisenaan voi välittömästi joko hyväksyä tai hylätä, jaetaan jana kahteen segementtiin joista ainakin toinen voidaan hylätä kuvaikkunan ulkopuolisena. Jako tehdään sellaisen reunasuoran määräämänä, jonka jana ylittää. Tässä

56 50 LUKU 2. TASOGRAFIIKKA D B A (x_max, y_max) G H I (x_min, y_min) E F Kuva 2.30: Cohenin ja Sutherlandin menetelmän toiminta. vaiheessa janan täytyy ylittää joku reunasuora, muuten se olisi jo aiemmin tullut hyväksytyksi tai hylätyksi. Tämän jälkeen reunasuoran kuvaikkunan ulkopuolelle jäänyt janasegmentti voidaan hylätä. Voimme testata janaa missä järjestyksessä tahansa reunasuorien kanssa, mutta kerran valittua järjestystä ei jatkossa tätä janaa käsiteltäessä saa muuttaa. Käytämme tässä bittikoodin mukaista järjestystä ylhäältä alas, oikealta vasemalle. Koska jana ei läpäissyt alun kahta testiä, tiedämme, että ainakin toisen päätepisteen koodi on nollasta poikkeava. Lisäksi tiedämme koodin nollasta erovan bitin perusteella, että janan täytyy ylittää kyseiseen bittiin liittyvä reunasuora. Algoritmi valitsee aina janan päätepisteen, joka on kuvaikkunan ulkopuolella ja siihen liittyvästä nelibittisestä koodista valitaan järjestyksessä ensimmäinen nollasta eroava bitti. Tämän määräämänä löydämme reunasuoran, jonka avulla jana leikataan kahteen segmenttiin, joista ulkopuolinen voidaan heti hylätä. Tämä toteutetaan korvaamalla ulkopuolinen päätepiste janan ja reunasuoran leikkauspisteellä, ja laskemalla uudelle päätepisteelle bittikoodi seuraavaa menetelmäaskelta varten. Esimerkkinä tarkastellaan kuvan 2.30 tilannetta. Janaa A-D käsiteltäessä lasketaan ensin päätepisteiden bittikoodit. Päätepisteelle A koodi on 0000, ja pisteelle D se on 1001, joten janaa A-D ei voi suoraan hyväksyä tai hylätä. Menetelmässä valitaan sitten päätepiste, jonka koodi eroaa nollasta, eli piste D. Pisteen D koodista havaitaan, että jana A-D ylittää kuvaikkunan yläreunaa ja vasenta reunaa

57 2.4. SEKALAISIA TASOGEOMETRIAN ONGELMIA 51 pitkin kulkevat suorat. Testausjärjestyksen perusteella lasketaan ensin janan A-D ja yläreunasuoran leikkauspiste B, korvataan vanha päätepiste D B:llä ja lasketaan uuden päätepisteen B koodi, joka on Seuraavalla algoritmin iteraatiolla segementti A-B voidaan suoraan hyväksyä piirrettäväksi. Jana E-I vaatii useampia iteraatioita. Ensimmäisen päätepisteen E koodi on 0100, joten oletetaan algoritmin valitsevan sen ensimmäiseksi ulkopuoliseksi pisteeksi. E:n koodista päätellen jana E-I leikkaa kuvaikkunan alareunaa pitkin kulkevan suoran, joten leikkauspisteeksi tulee F. E korvataan F:llä ja F:n koodi lasketaan, se on Seuraavalla iteraatiolla ulkopuoliseksi pisteeksi valitaan siis päätepiste I, jonka koodi on Täten testausjärjestyksen perusteella jana F-I katkaistaan kuvaikkunan yläpuolisen suoran määräämänä pisteessä H, I korvataan H:lla ja H:lle lasketaan uusi koodi Seuraavalla iteraatiolla ulkopisteeksi valitaan H, koska F:n koodi on H:n koodista havaitaan, että jana ylittää kuvaikkunan oikean reunasuoran. Leikkauspiste on G, jolla H korvataan ja G:lle lasketaan koodi, joka on Seuraavalla iteraatiolla algoritmi hyväksyy suoraan segmentin F-G piirtoa varten. Cyrusin ja Beckin / Liangin ja Barskyn menetelmä Edellä esitelty Cohenin ja Sutherlandin janan ja suorakulmion leikkauksen hakeva algoritmi oli ennen 1980-luvun puoliväliä pääasiallisesti käytetty menetelmä. Se onkin erityisen tehokas, jos suurin osa näkymän janoista tulee kokonaan näkyville lopputulokseen tai jos suurin osa jää kokonaan kuvaikkunan ulkopuolelle. Tämän aiheuttaa menetelmään sisäänrakennettu triviaalien tapausten käsittely. Jos janaa joudutaan leikkaamaan, on seuraavana esiteltävä Cyrusin ja Beckin / Liangin ja Barskyn menetelmä optimoidusti toteutettuna noin 30% tehokkaampi. Menetelmä perustuu jo aiemmin kappaleessa esitettyyn normaalivektorin avulla muodostettuun tason suoran yhtälöön. Leikattavan janan päätepisteet olkoon P 0 = (x 0,y 0 ) ja P 1 = (x 1,y 1 ). Jana esitetään parametrimuodossa P(t) = P 0 + (P 1 P 0 )t, missä P(t) = (x(t),y(t)) ja { x(t) = x 0 +t(x 1 x 0 ), (2.46) y(t) = y 0 +t(y 1 y 0 ). Ideana on parametriesityksen avulla hakea kyseisen janan ja kuvaikkunan reunasuorien (neljä kappaletta) leikkauspisteitä vastaavat parametriarvot t, päätellä mitkä niistä ovat merkitseviä (enintään kaksi) ja laskea sitten leikatun janan päätepisteet.

58 52 LUKU 2. TASOGRAFIIKKA Reunasuora E_i n i Reunasuoran piste P E_i Vektori P(t2) P E_i Kuvaikkuna Vektori P(t1) P E_i Vektori P(t3) P E_i P1 P0 Janan piste P(t2) Janan piste P(t3) Janan piste P(t1) Kuva 2.31: Merkintöjä. Olkoon kuvaikkunan reunasuorille E i määritelty ulkonormaalivektorit n i ja olkoon puolestaan P Ei mikä tahansa piste reunasuoralla E i. Jos janan piste P(t) on samalla myös reunasuoran E i piste, on voimassa (katso kappale ja kuva 2.31) ( n i,p(t) P Ei ) = 0. (2.47) Jos janan piste P(t) on reunasuoran kuvatason ulkopuolelle rajaamassa puoliavaruudessa, pätee ( n i,p(t) P Ei ) > 0, (2.48) ja jos se on puolestaan reunasuoran kuvatason puolelle rajaamassa puoliavaruudessa, on voimassa ( n i,p(t) P Ei ) < 0. (2.49) Kuvan 2.31 tapauksessa yhtälö (2.47) on voimassa pisteessä P(t 2 ), epäyhtälö (2.48) pisteessä P(t 1 ) ja epäyhtälö (2.49) pisteessä P(t 3 ). Kaavasta (2.47) voidaan ratkaista se parametrin t arvo, jolla jana leikkaa reunasuoraa E i : joten 0 = ( n i,p(t) P Ei ) = ( n i,p 0 + (P 1 P 0 )t P Ei ) = ( n i,p 0 P Ei ) + ( n i,p 1 P 0 )t, (2.50) t = ( n i,p 0 P Ei ), (2.51) ( n i, b)

59 2.4. SEKALAISIA TASOGEOMETRIAN ONGELMIA 53 missä vektori b on b = P 1 P 0, olettaen että kaavan (2.51) nimittäjälauseke on nollasta eroava. Sisätulo ( n i, b) voi saada arvon 0, jos joko n i = 0 (käytännössä mahdotonta, joten kyseessä liki varmasti käyttäjän virhe), b = 0 (jana on redusoitunut pisteeksi) tai vektorit n i ja b ovat kohtisuorassa, eli jana on yhdensuuntainen reunasuoran E i kanssa. Esitettävä algoritmi huolehtii kahdesta viimeisestä erikoistapauksesta. Annettu jana leikataan kuvaikkunan neljän reunasuoran kanssa, ja lopputuloksina saadaan enintään neljä vastaavaa parametrin t arvoa, joista heti voidaan hylätä ne, jotka eivät kuulu välille [0, 1]. Jäljelle jääneistä on pääteltävä kaksi parametriarvoa, jotka vastaavat todellisia kuvaikkunan leikkaaman janan päätepisteitä. Valinta tehdään luokittelemalla leikkauspisteet kahteen luokkaan: Leikkauspisteisiin PE, joissa jana mahdollisesti saapuu kuvaikkunan alueelle (PE - potentially entering) ja leikkauspisteisiin PL, joissa jana mahdollisesti poistuu kuvaikkunan alueelta (PL - potentially leaving). Janan ja reunasuoran leikkauspisteen luokittelu perustuu sisätulolausekkeen ( n i, b) etumerkkiin. Vektori b:hän on janan suuntavektori, jonka suuntaan janaa kuljetaan parametrin t kasvaessa. Jos ( n i, b) < 0, kuuluu janan ja suoran E i leikkauspiste luokkaan PE, sillä parametriä t kasvatettaessa leikkauspistearvosta suuremmaksi, janan piste P(t) siirtyy reunasuoran E i suhteen kuvaikkunan ulkopuolisesta puoliavaruudesta kuvaikkunan sisäpuoliseen puoliavaruuteen. Esimerkkinä katso kuva Siinä parametrin arvolla t = t 2 löytynyt leikkauspiste kuuluu luokkaan PE, koska normaalivektorin n i ja janan suuntavektorin b välinen kulma on itseisarvoltaan suurempi kuin π/2. Vastaavasti leikkauspiste luokitellaan olevan tyyppiä PL, jos ( n i, b) > 0. Varsinaista näkyvää janan osaa vastaavat parametriarvot t E ja t L (E entering, L leaving) saadaan valitsemalla parametriksi t E suurin leikkauspisteluokkaan PE kuuluvien leikkauspisteiden parametreista. Vastaavasti t L -parametriksi valitaan pienin leikkauspisteluokkaan PL kuuluvien leikkauspisteiden parametreista. Lisäksi rajoitetaan parametrit ehdoin t E 0 ja t L 1. Jos lopputuloksena saadaan pari t E, t L, joille on voimassa t L < t E, ei annettu jana voi näkyä lainkaan kuvaikkunassa. Muussa tapauksessa kuvaikkunassa näkyy janan pisteiden P(t E ) ja P(t L ) välinen segmentti. Esitetään menetelmä pseudokoodina: Olkoon janan päätepisteet P 0 ja P 1 ja olkoon reunasuorien ulkonormaalivektorit n i laskettu valmiiksi. if (P 1 ==P 0 ) then Jana surkastunut, käsittele pisteenä; else

60 54 LUKU 2. TASOGRAFIIKKA begin b = P 1 P 0 ; t E = 0; t L = 1; for (jokainen reunasuora E i ) if (( n i, b) 0) then {Hylätään yhdensuuntaiset} begin laske leikkauspisteen parametriarvo t; luokittele leikkauspiste ( n i, b):n etumerkin avulla; {( n i, b) < 0 PE, ( n i, b) > 0 PL} if (PE) then t E = max(t E,t); if (PL) then t L = min(t L,t); end if (t E > t L ) then return ei piirrettävää ; else return piirrä segmentti P(t E ), P(t L ) ; end end Jos oletetaan kuvaikkuna suunnatuksi koordinaattiakselien suuntaiseksi (kuten yleensä tehdään, näkymähän voidaan haluttaessa kiertää mieleiseen asentoon), yksinkertaistuvat tarvittavat laskutoimitukset merkittävästi. Aiemmin esitetyssä versiossa tarvitsimme jotain pistettä P Ei kultakin neljältä reunasuoralta. Pisteen voi valita vapaasti, sillä se supistuu lausekkeista pois. Ohessa taulukossa 2.1 on aukikirjoitettuna kaikille neljälle reunasuoralle tarvittavat laskutoimitukset Janan leikkaaminen konveksilla monikulmiolla Cyrusin ja Beckin / Liangin ja Barskyn menetelmä yleistyy suoraviivaisesti myös tapaukseen, jossa pitää määrätä janan ja tason yleisen konveksin monikulmion leikkaus. Tason konveksi monikulmio on sellainen jonka kaikki pisteet voi yhdistää toisiinsa yhdellä janalla siten, että yhdistävä jana kulkee koko matkan monikulmion alueella mukaanlukien sen reuna. Monikulmion reuna ilmoitetaan vaikkapa luettelemalla monikulmion k kärkipistettä P 0,P 1,...,P k 1 ennalta valitun kiertosuunnan määrämänä (esimerkiksi kierretään vastapäivään). Reunajanoille (tai itse asiassa niitä pitkin kulkeville suorille) pitää myös pystyä muodostamaan ulkonormaalivektorit n i ja määräämään jokin suoran piste. Tar-

61 2.4. SEKALAISIA TASOGEOMETRIAN ONGELMIA 55 Reunasuora i normaali n i P Ei P 0 P Ei t = ( n i,p 0 P Ei ) Vasen: x = x min Oikea: x = x max ( 1 0 ( ) 1 0 ) (x min,y) (x 0 x min,y 0 y) x 0 x min x 1 x 0 (x max,y) (x 0 x max,y 0 y) x 0 x max x 1 x 0 ( n i, b) Ala: y = y min ( 0 1 ) (x,y min ) (x 0 x,y 0 y min ) y 0 y min y 1 y 0 Ylä: y = y max ( 0 1 ) (x,y max ) (x 0 x,y 0 y max ) y 0 y max y 1 y 0 Taulukko 2.1: Sievennetyt kaavat kuvaikkunan ollessa koordinaattiakselien suuntainen suorakaide. Pn 1 P0 P1 Vektori Pi+1 Pi (Pi+1 Pi,ni)<0 Pi+1 Pi Pi 1 ni Kuva 2.32: Konveksin monikulmion reunajanojen ulkonormaalivektorien määrääminen.

62 56 LUKU 2. TASOGRAFIIKKA Kohdemonikulmio Leikkaava monikulmio Monikulmioiden leikkaus Kuva 2.33: Konveksin ja ei-konveksin monikulmion leikkaus saattaa olla epäyhtenäinen. vittavaksi suoran pisteeksi voidaan valita jompikumpi janan päätepisteistä. Jos kärkipisteiden kiertosuunta on etukäteen tunnettu, onnistuu normaalivektorin laskeminen helposti kuvan 2.24 osoittamalla tavalla. Tällöin riittää yksinkertaisesti valita ristitulolausekkeen vektori t osoittamaan kiertosuunnan mukaan joko positivisen tai negatiivisen z-akselin suuntaan. Jollei kiertosuuntaa etukäteen tiedetä, mutta tiedetään, että kärkipisteet on kuitenkin kiertojärjestyksessä lueteltu voidaan toimia seuraavasti. Ensin kärkipisteiden P i 1 ja P i mod k välisen janan normaalikandidaatti n i lasketaan kuten edellä. Sen jälkeen tutkitaan sisätulolausekkeen ( n i,p i+1 mod k P i mod k ) etumerkkiä. Jos se on negatiivinen, asetetaan n i = n i ja jos positiivinen on tällöin n i = n i. Tämä toimii tietenkin sen takia, että konveksin monikulmion tapauksessa siirryttäessä reunajanasta seuraavaan, kiertyy seuraava reunajana edellisen reunajanan rajaamaan objektin sisäpuoliseen puoliavaruuteen. Oletuksena on tietenkin se, etteivät mitkään kolme peräkkäistä kärkipistettä ole saman tason suoran pisteitä, eli konveksi monikulmio on esitetty minimimäärällä kärkipisteitä, katso kuva Itse menetelmän muokkaaminen lopulliseen muotoon jätetään harjoitustehtäväksi.

63 2.4. SEKALAISIA TASOGEOMETRIAN ONGELMIA Monikulmion leikkaaminen konveksilla monikulmiolla, Sutherlandin ja Hodgmanin algoritmi Käsitellään seuraavaksi yleisempää tilannetta, missä sekä leikkaava että leikattava objekti ovat monikulmioita, joista toinen on konveksi. Jatkossa nimitämme tällaisissa tapauksissa konveksia monikulmiota leikkaavaksi monikulmioksi ja eikonveksia kohdemonikulmioksi. Tällaisia menetelmiä tarvitaan, kun piirtoa varten halutaan rajata objektin monikulmiot kuvaikkunan alueelle. Ongelma on melko hankala, sillä lopputuloksena saatava leikkausmonikulmio voi koostua useasta erillisestä palasesta, katso kuva Näin saattaa käydä jos kohdemonikulmio ei ole konveksi. Yleensä kuitenkin primitiiviobjektit koostetaan konvekseista monikulmioista, enimmäkseen kolmioista tai tasonelikulmioista, joten tällaiset ongelmat eivät välttämättä ole kovin yleisiä. Lisäksi luvussa esitetään menetelmä, jolla voimme jakaa yksinkertaisen itseään leikkaamattoman tasomonikulmion konvekseiksi monikulmioisi. Seuraavaksi esiteltävä menetelmä tunnetaan Sutherlandin ja Hodgmanin algoritmina. Perusidea on hyvin yksinkertainen. Koska leikkaava monikulmio on konveksi, voimme käydä sitä läpi sivujana kerrallaan, muodostaa sivujanan suuntaisen suoran ja leikata suoran avulla kohdemonikulmiosta konveksin monikulmion ulkopuoliseen puoliavaruuteen jäävän osan pois. Kun kohdemonikulmio on käsitelty yhdellä leikkaavan monikulmion sivulla, saadaan uusi monikulmio, joka sitten käsitellään samalla tavoin seuraavalla leikkaavan monikulmion sivulla. Olkoon kummankin monikulmion kärkipisteet lueteltu vastapäivään kiertäen, eli kuljettaessa monikulmiota kärkipistejärjestyksessä ympäri jää monikulmion sisäpuoli vasemmalle kulkusuuntaan nähden. Käydään leikkaava monikulmio sivu kerrallaan silmukassa läpi. Jokaiselle leikkaavan monikulmion sivulle käydään tähän mennessä muokkaantunut tulosmonikulmio läpi (aluksi tulosmonikulmioksi valitaan alkuperäinen kohdemonikulmio) lähtien liikkeelle tulosmonikulmion kärkipisteestä s. Tutkitaan onko vuorossa oleva kärkipiste s leikkaavan monikulmion sisä- vai ulkopuolisessa puoliavaruudessa leikkaavan monikulmion vuorossa olevan sivujananan kautta kulkevan suunnatun suoran määräämänä. Tämä voidaan testata kappaleen menetelmällä. Sen jälkeen edellistä reunasuoraa käsiteltäessä muodostunutta tulosmonikulmiota kuljetaan kiertosuunnassa seuraavaan kärkeen p, ja sen mukaan onko kärki p leikkaussuoran suhteen sisä- vai ulkopuolella, muodostetaan uuden leikatun tulosmonikulmion listaa. Tässä on neljä vaihtoehtoa: Sekä s että p ovat sisäpuolella, viedään kärki p listaan, katso kuva 2.34, (a).

64 : : : 58 LUKU 2. TASOGRAFIIKKA Leikattava monikulmio Leikattava monikulmio s sisapuoli : : sisapuoli p (a) ulkopuoli Leikkaussuora Leikattava monikulmio p ulkopuoli sisapuoli sisapuoli s p i (b) i ulkopuoli p Leikkaussuora Leikattava monikulmio s ulkopuoli s Leikkaussuora Leikkaussuora (c) (d) Kuva 2.34: Sutherlandin ja Hodgmanin menetelmä: neljä eri vaihtoehtoa peräkkäisille kärkipisteille.

65 2.4. SEKALAISIA TASOGEOMETRIAN ONGELMIA 59 s on sisäpuolella ja p ulkopuolella. Määrätään janan s - p ja reunasuoran leikkauspiste i (kappale 2.4.2), ja viedään i listaan, katso kuva 2.34, (b). Sekä s että p ovat ulkopuolella, ei toimenpiteitä, katso kuva 2.34, (c). s on ulkopuolella ja p sisäpuolella. Määrätään janan s - p ja reunasuoran leikkauspiste i. Listaan viedään ensin i ja sitten p, katso kuva 2.34, (d). Esimerkki menetelmän toiminnasta on kuvassa 2.35, jossa monikulmiota leikataan suorakaiteella. Leikatun monikulmion kärkipisteiden numerointi vastaa järjestystä, jossa ne edellisessä vaiheessa vietiin listaan. Sutherlandin ja Hodgmanin menetelmällä on se ominaisuus, että lopputuloksena saatu leikkausmonikulmio on yhtenäinen vaikka topologisesti se koostuisikin erillisistä osista. Menetelmän palauttama monikulmio on erillisten osien välillä surkastunut kahdeksi päällekkäiseksi janaksi, jotka kulkevat leikkavan monikulmion sivua pitkin, katso kuva Jos tulosmonikulmion rajaama alue väritetään siten, että reunat otetaan mukaan väritykseen, tulee tästä mahdollisesti ylimääräisiä viivoja lopputulokseen. Jos täytetyt monikulmiot piirretään myöhemmin kappaleessa esiteltävällä liukuvan suoran menetelmällä, ei tämä aiheuta ongelmia Monikulmion leikkaaminen monikulmiolla: Weilerin ja Athertonin menetelmä Esitellään lopuksi ehkä klassisin menetelmä yleisimpään tapaukseen, eli kahden itseään leikkaamattoman tasomonikulmion leikkauksen määräämiseen. Tämä tunnetaan Weilerin ja Athertonin menetelmänä, ja se soveltuu jopa sellaisiin tapauksiin, missä leikkaavassa monikulmioissa voi olla reikiä. Sekä leikkaava monikulmio että kohdemonikulmio esitetään kärkipistelistoina. Kiertojärjestys on tällä kertaa sellainen, että kierrettäessä kärkipisteet järjestyksessä, jää monikulmion sisäpuoli oikealle. Tämä tarkoittaa sitä, että ulkoreuna kierretään myötäpäivään ja mahdolliset leikkaavan monikulmion reiät vastapäivään. Weilerin ja Athertonin menetelmän perusidea Menetelmän pääperiaate on seuraava: Aloitetaan kohdemonikulmion kiertäminen pisteestä, jossa sen sivujana menee leikkaavan monikulmion sisäpuolelle. Tämän jälkeen kuljetaan pitkin kohdemonikulmion sivua aina siihen pisteeseen saakka,

66 60 LUKU 2. TASOGRAFIIKKA 3 Leikkaussuora 1 Leikkaussuora Uudet pisteet Uudet pisteet 4 Leikkaava monikulmio 2 4 Leikkaava monikulmio Kohdemonikulmio (a) Vaiheen (a) tulosmonikulmio (b) Leikkaava monikulmio 2 Leikkaava monikulmio 4 Uudet pisteet 7 3 Uudet pisteet 6 Leikkaussuora Leikkaussuora 4 Vaiheen (b) tulosmonikulmio (c) 8 Vaiheen (c) tulosmonikulmio 7 (d) 1 Leikkaava monikulmio Lopputulos 4 (e) Kuva 2.35: Esimerkki Sutherlandin ja Hodgmanin menetelmän toiminnasta. Monikulmioiden kärkispistenumerot vastaavat listaanvientijärjestystä edellisessä vaiheessa

67 2.4. SEKALAISIA TASOGEOMETRIAN ONGELMIA 61 Kohdemonikulmio Leikkaava monikulmio Monikulmioiden leikkaus Kuva 2.36: Sutherlandin ja Hodgmanin menetelmässä monikulmioiden leikkaus surkastuu janoiksi erillisten palasten välillä. jossa kohdemonikulmion sivujana menee leikkaavan monikulmion ulkopuolelle. Tässä kohtaa siirrytään kulkemaan pitkin leikkaavan monikulmion sivua. Tätä jatketaan niin kauan, kunnes saavutaan jälleen pisteeseen, jossa kohdemonikulmion sivujana menee leikkaavan monikulmion sisälle. Tästä alkaen kuljetaan taas kohdemonikulmion sivua pitkin ja niin edelleen. Tätä jatketaan kunnes tullaan takaisin lähtöpisteeseen. Tässä vaiheessa on löydetty eräs kohdemonikulmion ja leikkaavan monikulmion leikkausalueen osa. Sen jälkeen haetaan seuraava sisäänmenopiste, jossa aiemmin ei vielä ole käyty ja toimitaan samoin. Weilerin ja Athertonin menetelmän toteuttaminen Tarkastellaan seuraavaksi kuinka menetelmä voidaan ohjelmoida. Esiteltävä toteutus on Aarni Perkon luentomonisteesta Graafinen Tietojenkäsittely. Ensimmäiseksi muodostetaan sekä leikkaavalle monikulmiolle että kohdemonikulmiolle listat, joihin sijoitetaan sekä monikulmioiden kärkipisteet että leikkauspisteet toisen monikulmion kanssa. Nämä pisteet sijoitetaan listoihin siinä järjestyksessä, missä ne monikulmiota kierrettäessä esiintyvät. Kummankin monikulmion listoihin sijoitetaan monikulmioiden leikkauspisteitä vastaavat alkiot. Kätevä tietorakenne näiden esittämiseen on kahteen suuntaan linkitty rengaslista. Lista-alkiotietueet sisältävät seuraavat kentät (kuva 2.37): ed ja seur : linkit rengaslistan edelliseen ja seuraavaan alkioon. s/u ilmoittaa onko tietueen esittämä piste sellainen jossa kohdemonikulmio menee sisään leikkaavan monikulmion alueeseen (s), tai ulos sieltä (u).

68 62 LUKU 2. TASOGRAFIIKKA ed seur s/u vast x y Kuva 2.37: Monikulmion rengaslistan alkio. vast osoittaa toisen monikulmion rengaslistan vastinalkioon, jos tietueen esittämä piste on monikulmioiden leikkauspiste, muutoin tyhjä -osoitin. x, y tietueen esittämän pisteen x- ja y-koordinaatit. Jos leikkausmonikulmiossa on reikiä, esitetään niiden reunamurtoviivat erillisinä renkaina. Silloin tarvitaan vielä taulukko osoittimista kunkin renkaan johonkin tietueeseen. Kuvassa 2.38 on esitetty esimerkki tietorakenteista jotka muodostetaan kuvan alareunan leikkaavalle monikulmiolle (laatikko, jossa kolmiomainen reikä) ja kohdemonikulmiolle (kolmio). Kuvan 2.38 kaltaiset leikkauspistelistat muodostetaan seuraavalla algoritmilla: 1. Listat alustetaan kohdemonikulmion ja leikkaavan monikulmion kulmapisteillä kiertojärjestyksessä. Jos monikulmiossa on reikiä, kukin reikä muodostaa oman rengaslistansa, joihin osoitetaan osoitintaulukon avulla. Alustetuissa listoissa kentät s/u ja vast asetetaan tyhjiksi. 2. Valitaan kohdemonikulmiosta seuraava vuorossa oleva sivu, jota ei vielä ole käsitelty. Tämän sivun päätepisteiden tietueet ovat rengaslistassa peräkkäisinä alkioina, koska niiden väliin ei vielä ole muodostettu leikkauspistetietueita. 3. Määrätään kohdemonikulmion vuorossa olevan sivujanan leikkauspisteet kaikkien leikkaavan monikulmion sivujanojen kanssa. Saaduista leikkauspisteistä kelpuutetaan vain ne jotka ovat aidosti janojen sisäpisteitä. Jos leikkauspiste löytyy, määrätään ristitulon avulla onko leikkauspiste s - vai u -tyyppiä. Jos vektori p ja q ovat kohdemonikulmion ja leikkausmonikulmion sivujanojen suuntavektorit, ja jos ristitulon p q kolmas komponentti on positiivinen, on leikkauspiste tyyppiä s. Leikkaavan monikulmion kulmapisteet löydetään sen renkaasta ohittamalla jo olemassaolevat leikkauspistetietueet (nämä tunnistetaan siitä, että niiden s/u kentät ovat epätyhjiä). 4. Kukin kohdassa 3 löydetty leikkauspiste liitetään mukaan kumpaankin läpikäytävään rengaslistaan omana tietueenaan (kaksi kappaletta). Kohdemoni-

69 2.4. SEKALAISIA TASOGEOMETRIAN ONGELMIA 63 Leikkaava monikulmio Kohde monikulmio 1 2 "" 0 Ax Ay "" 0 1x 1y "u" A1x A1y "" 0 2x 2y "" 0 Bx By "" 0 3x 3y "" 0 Cx Cy "s" C1x C1y "s" C1x C1y "u" F1x F1y "" 0 Dx Dy "s" E1x E1y "" 0 Ex Ey "u" A1x A1y "s" E1x E1y 1 Kohdemonikulmio "" "u" 0 Fx Fy F1x F1y A F A1 E1 E B 2 "" 0 Gx Gy D F1 G Leikkaava monikulmio C1 C 3 Kuva 2.38: Esimerkki tietorakenteista.

70 64 LUKU 2. TASOGRAFIIKKA Kohdemonikulmio Leikkaava monikulmio ei leikkauspiste leikkauspiste Kuva 2.39: Erikoistapauksia leikkauspisteiden määräämisessä. kulmion renkaasen tuleva uusi tietue sijoitetaan vuorossa olevan sivujanan päätepistetietueiden väliin leikkauspisteen parametrin t mukaisesti kasvavaan järjestykseen. Tätä varten parametrin t arvot talletetaan tässä vaiheessa esimerkiksi tietueen x -kenttään (leikkauspisteiden tasokoordinaatteja ei lasketa vielä). Vastaavalla tavalla uusi tietue sijoitetaan leikkaavan monikulmion rengaslistaan leikkauspisteen parametrin u mukaiseen paikkaan. Molempiin listoihin liitetyt uudet tietueet kytketään toisiinsa vast -osoittimien avulla, ja lisäksi leikkauspisteen tyyppi talletetaan tietueiden s/u -kenttiin. 5. Lopuksi kun kaikki kohdemonikulmion sivut on käsitelty, lasketaan uusille leikkauspistetietueille leikkauspisteitä vastaavat x- ja y-koordinaatit tietueisiin x -kenttään talletetun parametrin t tai u avulla. Leikkauspistelistoja muodostettaessa täytyy huolehtia eräistä erikoistapauksista, katso kuva Tällaisten erikoistilanteiden käsittelemiseksi täytyy tarkastella leikkauspisteen parametrit antavan yhtälöryhmän (2.45) kerroinmatriisin determinantin arvoa. Jos (r 1 p 1 )(q 2 s 2 ) (s 1 q 1 )(p 2 r 2 ) < εr 2, katsotaan janat yhdensuuntaisiksi. Tässä ε on käytetyn liukulukuesityksen laskutarkkuus (esim. ε 10 16, jos käytetään double-tarkkuutta) ja r on arvio monikulmion koosta (esim. r = x max x min + y max y min ). Jos janoja ei edellisen perusteella luokiteltu yhdensuuntaisiksi, katsotaan ratkaisuna saatujen parametriarvojen t ja u määräävän aidon leikkauspisteen, jos t,u [εr,1 εr]. Jos t tai u kuuluu väleille [ εr,εr] [1 εr,1 + εr], tutkitaan kumpi kuvan 2.40 tilanteista on kyseessä. Jos

71 2.4. SEKALAISIA TASOGEOMETRIAN ONGELMIA 65 Kuva 2.40: Lisää erikoistapauksia. janat aiemmin todettiin (liki) yhdensuuntaisiksi, tutkitaan ovatko ne miltei päällekkäin määräämällä toisen janan päätepisteen etäisyys toista janaa pitkin kulkevasta suorasta. Tämä voidaan testata kappaleessa esitetyllä tavalla pisteen ja suoran etäisyyden määräämiseksi. Jos saatu etäisyys on pienempi kuin ε, katsotaan että janat kuuluvat samalle suoralle. Kohdemonikulmion näkyvän osan määrääminen Kohdemonikulmion näkyväksi osaksi nimitetään leikkausjoukkoon kuuluvaa osaa kohdemonikulmiosta. Se on monikulmio, jonka kärkipisteet ovat joko alkuperäisen kohdemonikulmion kärkipisteitä, leikkaavan monikulmion kärkipisteitä tai monikulmioiden reunajanojen leikkauspisteitä. Tämä osa saadaan edellisistä tietorakenteistä seuraavalla algoritmilla: 1. Alustetaan uuden tulosmonikulmion kärkipistelista tyhjäksi. Jos edellä muodostettu tietorakenne ei sisällä monikulmioiden leikkauspisteitä vaan ainoastaan vanhoja kärkipisteitä, tutkitaan seuraavat erikoistapaukset: Onko kohdemonikulmio kokonaan leikkaavan monikulmion sisäpuolella? Jos on, kopioidaan kohdemonikulmio tulosmonikulmioksi. Onko leikkaava monikulmio kokonaan kohdemonikulmion sisäpuolella? Jos on, kopioidaan leikkaava monikulmio tulosmonikulmioksi. Ovatko monikulmiot toinen toistensa ulkopuolella? Jos ovat, on tulos tyhjä joukko.

72 66 LUKU 2. TASOGRAFIIKKA Näistä kaksi ensimmäistä kohtaa voidaan testata mielivaltaisen kärkipisteen avulla. Jos kumpikaan kahdesta ensimmäisestä vaihtoehdosta ei ole voimassa, on silloin voimassa kolmas. 2. Valitaan kohdemonikulmion rengaslistasta jokin sisäänmenoleikkauspiste. Tämä löydetään kulkemalla rengaslistaa eteenpäin, kunnes löydetään alkio jonka s/u -kenttään on talletettu merkintä s. Jos sellaisia alkioita ei enää ole, on tehtävä suoritettu. Löydetty s -tyyppinen kärkipiste talletetaan tulosmonikulmion listaan alkupisteeksi. 3. Kuljetaan edellä löytyneestä s -tyypin alkiosta lähtien eteenpäin kohdemonikulmion rengaslistaa, kunnes löydetään leikkauspiste, jonka on väistämättä oltava u -tyyppiä. Listaa kuljettaessa talletetaan läpikäytyjä alkioita vastaavat kärkipisteet tuloslistaan, mukaanlukien viimeisenä u -tyyppinen leikkauspiste. 4. Löydetyn u -tyypin lista-alkion vast -kentän avulla siirrytään leikkaavan monikulmion rengaslistaan, jota kuljetaan eteenpäin kunnes vastaan tulee s -tyyppinen leikkauspistelista-alkio. Listaa kuljettaessa talletetaan läpikäytyjä alkioita vastaavat kärkipisteet tuloslistaan, mukaanlukien viimeisenä s -tyyppinen leikkauspiste. 5. Löydetyn s -tyypin lista-alkion vast -kentän avulla siirrytään kohdemonikulmion rengaslistaan ja tarkastetaan, että vastinalkio on myös s -tyyppiä (pitää olla, muuten tietorakenne on väärin muodostettu). Jos alkio on sama, josta alunperin lähdettiin kohdassa 2 liikkeelle, on saatu muodostettua eräs näkyvistä osamonikulmioista, ja etsitään seuraavaa palasta toistamalla kohdasta 2. Muussa tapauksessa toistetaan kohdasta 3 Jottemme kävisi loputtomiin uudelleen ja uudelleen samaa monikulmiota läpi listassa, poistetaan s -merkinnät kaikista läpikuljetuista s -tyypin leikkauspistelista-alkioista, kun ne kohdataan edellisessä algoritmissa. Tämä varmistaa sen, että kohdassa 2 aloitetaan aina etsimään uutta näkyvää monikulmiota. Kohdemonikulmion näkymättömän osan määrääminen Kohdemonikulmion näkymättömäksi osaksi kutsutaan monikulmiojoukkoa, joka jää jäljelle, kun kohdemonikulmiosta poistetaan sen ja leikkaavan monikulmion leikkaus. Tämä voidaan hakea tietorakenteista samalla tavalla kuin edellä, paitsi

73 2.4. SEKALAISIA TASOGEOMETRIAN ONGELMIA 67 että uuden osamonikulmion hakeminen aloitetaan aina u -tyyppisestä leikkauspisteestä. Leikkaavan monikulmion renkaaseen siirrytään vast -linkin avulla kun kohdataaan s -tyyppinen leikkauspistelista-alkio. Leikkaavan monikulmion rengaslistaa on lisäksi kuljettava takaperin. Esimerkki I Haetaan kuvan 2.38 tietorakenteesta monikulmioiden leikkausjoukko, eli kohdemonikulmion näkyvä osa. Kuljettaessa kohdemonikulmion rengaslistaa eteenpäin, liittyy ensimmäinen vastaantuleva s -tyyppinen alkio leikkauspisteeseen C1. Tulosmonikulmion ensimmäinen kärkipiste on siis C1. Tästä jatketaan kohdemonikulmion listaa eteenpäin, kunnes kohdataan u -tyyppinen alkio, jota vastaa piste F1. Tässä vaiheessa tulosmonikulmion kärkipistelistassa on pisteet C1 ja F1. Linkin vast välityksellä siirrytään leikkaavan monikulmion rengaslistaan, jota kuljetaan eteenpäin, kunnes kohdataan s -tyyppinen alkio pisteelle E1. Tässä vaiheessa lopputulokseen on otettu mukaan pisteet C1, F1, G, E ja E1. Nyt siirrytään jälleen kohdemonikulmion listaan vast -linkin avulla ja kuljetaan sitä eteenpäin aina seuraavaan u -alkioon, eli pisteeseen A1. Tulos koostuu nyt pisteistä C1, F1, G, E, E1 ja A1. Jälleen vaihdetaan leikkaavan monikulmion listaan vast -linkillä (tällä kertaa toiseen renkaaseen kuin aiemmin) ja kuljetaan sitä eteenpäin pistettä C1 vastaavaan s -alkioon saakka. Tulos on C1, F1, G, E, E1, A1, B, C ja C1. Nyt palattaessa kohdemonikulmion listaan lopetetaan, sillä päädyimme alkupisteeseen, joten monikulmio, jonka kärkipisteet ovat C1, F1, G, E, E1, A1, B, ja C on kohdemonikulmion näkyvä osa. Läpikäydyistä lista-alkioista poistettiin s -tunnisteet, joten kohdemonikulmion listasta ei löydy enää s -tyyppisiä alkioita. Näkyvä osa koostuu siis yhdestä monikulmiosta. Jos puolestaan halutaan kohdemonikulmion näkymätön osa, menetelmä toimii seuraavasti: Aluksi haetaan kohdemonikulmion rengaslistasta ensimmäinen u - tyyppinen alkio. Tämä vastaa pistettä F1. Listaa jatketaan eteenpäin, kunnes kohdataan s -tyyppinen alkio E1, josta siirrymme vast -linkilla leikkaavan monikulmion listaan. Tähän mennessä koossa ovat pisteet F1 ja E1. Leikkaavan monikulmion rengaslistaa kuljetaan takaperin, kunnes kohdataan u -tyypin alkio F1. Tämä on sama kuin alkupiste, joten löysimme näkymättömän osamonikulmion F1, E1, E, G. Alkioita läpikäydessä poistimme kohdatuista leikkauspistealkioista u -tunnisteet. Toinen osamonikulmio A1, 1, 2, 3, C1, C, B löydettään hakemalla kohdemo-

74 68 LUKU 2. TASOGRAFIIKKA Kuva 2.41: Leikkaava monikulmio (vasen) ja kohdemonikulmio (oikea), molemmissa voi olla reikiä. nikulmion listasta jäljellä oleva u -tyypin alkio A1, ja soveltamalla menetelmää tästä alkiosta lähtien. Esimerkki II Vaikka aiemmin käsittelimme tapausta jossa vain leikkaavassa monikulmiossa sai olla reikiä, voidaan menetelmä yleistää helposti myös tapaukseen, jossa molemmat monikulmiot ovat reikäisiä. Tämä jätetään harjoitustehtäväksi. Menetelmän toimivuutta yleisessä tapauksessa esitellään kuvissa 2.41 ja Kuvassa 2.41 vasemmalla on näytetty leikkaava monikulmio, joka on suorakaide jossa on suorakaiteen muotoinen reikä. Oikenpuoleisessa kuvassa on kohdemonikulmio, jossa myös on kolmion muotoinen reikä. Molemmat monikulmiot päällekkäin asemoituna näkyvät vasemmanpuoleisessa kuvassa 2.42 ja monikulmioiden leikkaus, eli kohdemonikulmion näkyvä osa oikeanpuoleisessa kuvassa Huomaa, että lopputulos on epäyhtenäinen; se koostuu kolmesta osamonikulmiosta Monikulmion jakaminen konvekseiksi monikulmioiksi Monissa sovelluksissa on hyödyksi, jos tasomonikulmio voidaan esittää yhdisteenä konvekseista monikulmioista. Esimerkiksi jos halutaan käyttää Cyrusin ja Beckin / Liangin ja Barskyn janan ja monikulmion leikkausalgoritmia tai Sutherlandin ja Hodgmanin monikulmioiden leikkausalgoritmia on leikkaavan monikulmion oltava konveksi. Lisäksi kolmiulotteisen kuvanmuodostuksen yhteydessä

75 2.4. SEKALAISIA TASOGEOMETRIAN ONGELMIA 69 Kuva 2.42: Kuvan 2.41 monikulmiot asemoituna päällekkäin ja Weilerin ja Athertonin menetelmällä määrätty kohdemonikulmion näkyvä osa. huomaamme että myöhemmin luvussa esiteltävä liukuvan suoran monikulmioiden piirtomenetelmä toimii paremmin konvekseilla monikulmioilla, kun sen yhteydessä interpoloidaan kärkipisteisiin liittyviä suureita, kuten värejä ja normaalivektoreita. Oletetaan seuraavaksi, että monikulmio on esitetty luettelemalla sen kärkipisteet P 0,P 1,...,P n 1 vastapäivään kiertäen, jolloin voimme helposti laskea vuorossa olevan sivun i, jonka kärkipisteet ovat P i 1 ja P i sisänormaalin suuntaisen vektorin n i ristitulon avulla: n i = ñ i x ñ i y 0 (P i P i 1 ) x = (P i P i 1 ) y , (2.52) missä (P i P i 1 ) x ja (P i P i 1 ) y tarkoittavat vektorin P i P i 1 x- ja y-komponentteja. Ensimmäisessä vaiheessa siiretään monikulmiota tasossa siten, että vuorossa olevan janan alkupiste P i 1 siirtyy origoon, eli homogeenisiin kärkipistekoordinaatteihin sovelletaan siirtomatriisia T ( (P i 1 ) x, (P i 1 ) y ). Määritellään seuraavaksi tason kiertomatriisi, joka kiertää siirretyn reunajanan positiivisen x-akselin suuntaiseksi ja äsken määrätyn sisänormaalivektorin n i positiivisen y-akselin suuntaiseksi. Tätä varten skaalataan reunajanan ja sisänor-

76 70 LUKU 2. TASOGRAFIIKKA maalin suuntavektorit yksikkövektoreiksi: a = P i P i 1 P i P i 1 = ( a1 a 2 ) n, n = i n i = ( n1 n 2 ). (2.53) Näiden vektorien avulla muodostetaan homogeenisisssa koordinaateissa operoiva matriisi a 1 a 2 0 R i = n 1 n 2 0 (2.54) Muodostettu matriisi R i on ortogonaalinen, eli sen kaikki rivi- ja sarakevektorit ovat yksikkövektoreita ja rivivektorit ovat keskenään kohtisuorassa, samoin kuin sarakevektoritkin. Tämä on totta sen takia, että ensinnäkin vektorit a ja n ovat kohtisuorassa toisiinsa nähden (vektori n i oli kohtisuorassa reunajanan suuntavektoriin nähden) ja toiseksi ne skaalattiin yksikkövektoreiksi. Matriisi R i tekee tasossa kierron, mutta minkälaisen? Tutkitaan, kuinka R i kuvaa reunajanan i suuntaiset vektorit, jotka siis ovat muotoa α a, ja monikulmion sivun i sisänormaalin suuntaiset vektorit β n missä α,β R. a 1 a 2 0 a 1 R i α a = n 1 n 2 0 α a 2 = α a2 1 + a2 2 1 n 1 a 1 + n 2 a 2 = α 0, a 1 a 2 0 n 1 a 1 n 1 + a 2 n 2 0 R i β n = n 1 n 2 0 β n 2 = β n n2 2 = β (2.55) Eli matriisi R i kiertää reunajanan suuntaisen vektorin x-akselin suuntaiseksi vektoriksi ja sisänormaalin suuntaisen vektorin y-akselin suuntaiseksi vektoriksi. Tästä voimme muodostaa seuraavan algoritmin monikulmion pilkkomiseksi: Jokaiselle monikulmion kärkipisteelle P i, i = 0,...,n 1 1. Muodosta siirtomatriisi T i, joka siirtää kärkipisteen P i origoon, siirrä tällä kaikki kärkipisteet. Tämän vaiheen jälkeen piste P i on origossa 2. Muodosta kiertomatriisi R i+1, joka kiertää pisteen P i+1 positiiviselle x-akselille ja sivujanan P i - P i+1 sisänormaalivektorin positiivisen y-akselin suuntaiseksi. Kerro edellisen vaiheen tuloksena saadut kärkipisteet matriisilla R i+1

77 2.4. SEKALAISIA TASOGEOMETRIAN ONGELMIA 71 y y P7 P6 P7 i=0 P6 P2 P3 Piste Pi+2, y koordinaatti >=0 P2 P3 Jana Pi > Pi+1 P0 P1 P4 P5 P0 P1 P4 P5 x x Piste Pi siirretty origoon Kuva 2.43: Konvekseiksi palasiksi pilkottava monikulmio (vasen) ja ensimmäinen testi (oikea). 3. Tutki siirretyn ja kierretyn kärkipisteen R i+1 T i P i+2 y-koordinaattia. Jos se on positiivinen, kasvata i = i+1 ja jatka kohdasta 1. Jos koordinaatti on negatiivinen, pilko monikulmio reunajanan i avulla kahdeksi monikulmioksi suorittamalla kohta Monikulmio pilkotaan kahteen osaan tutkimalla peräkkäisiä pistettä P i+2 seuraavia kärkipisteitä, kunnes vastaan tulee kärkipiste, jonka y-koordinaatti on ei-negatiivinen. Tämä kärkipiste, P i+ j, on siis x-akselilla tai sen yläpuolella. Muodosta kaksi monikulmiota, joiden kärkipisteet ovat P i+1,p i+2,..., P i+ j ja P i,p i+1,p i+ j,p i+ j+1,...,p i 1. Sovella samaa algoritmia kumpaankin muodostettuun palaseen. Tutkitaan esimerkin avulla esitetyn menetelmän toimintaa. Kuvassa 2.43 on esitetty monikulmio, joka halutaan pilkkoa konvekseiksi osamonikulmioiksi. Se on esitetty luettelemalla kärkipisteet vastapäivään kiertäen. Ensimmäisessä vaiheessa havaitaan, ettei menetelmän askeleen 3 ehto edellytä monikulmion pilkkomista, katso kuva Toista sivujanaa käsiteltäessä havaitaan (kuva 2.44 (vasen)) vaiheessa 3, että monikulmio täytyy jakaa kahteen palaseen. Tämän seurauksena alkuperäinen monikulmio pilkkoutuu kahteen palaseen, katso kuva 2.44 (oikea). Uusien osamonikulmioiden kärkipisteiksi menetelmä valitsee pisteet P 2, P 3, P 4, P 5, P 6, P 7 ja P 1, P 2, P 7, P 0. Menetelmää sovelletaan rekursiivisesti saaduille uusille osamonikulmioille. Menetelmä ei kuitenkaan enää pilko monikulmiota P 1, P 2, P 7, P 0 pienemmiksi osamonikulmioiksi, sillä se on konveksi. Sovellettaessa menetelmää toiseen osamonikulmioon, syntyy siitä vielä kaksi konveksia palasta, katso kuva 2.45.

78 72 LUKU 2. TASOGRAFIIKKA y i=1 P0 P7 y P7 i=1, kohta 4 P6 Jana Pi > Pi+1 P1 P2 x P2 P3 Piste Pi siirretty origoon P4 P3 Piste Pi+2, y koordinaatti < 0 P0 P1 P4 P5 P5 P6 x Kuva 2.44: Toista sivujanaa testatessa havaitaan, että monikulmio täytyy paloitella (vasen). Tuloksena saatavat kaksi osamonikulmiota (oikea). Uusi monikulmio, i=0 P5 y P4 y P5 Uusi monikulmio i=0, kohta 4 P4 Jana Pi > Pi+1 P0 P1 P0 Piste Pi siirretty origoon P1 P2 P3 x P2 P3 Piste Pi+2, y koordinaatti < 0 x Kuva 2.45: Sovellettaessa menetelmää toiseen aiemmin saaduista osamonikulmioista havaitaan, että osamonikulmio täytyy vielä pilkkoa (vasen). Tuloksena syntyy kaksi palasta (oikea). Tässä osamonikulmion kärkipisteille on käytössä uusi numerointi, joka saadaan aiemman pilkkomisoperaation kärkipisteiden luettelemisjärjestyksestä.

79 2.5. RASTEROINTI: MALLISTA PIKSELEIKSI Rasterointi: mallista pikseleiksi Tässä kappaleessa esitellään perusmenetelmät pikseliesitysten tuottamiseen eräistä geometrisista objekteista. Pikseliesityksen tuottamista kutsutaan kirjallisuudessa yleensä rasteroinniksi. Ensimmäiseksi johdetaan niin kutsuttu midpoint line -menetelmä janojen rasterointiin ja samaa ideaa soveltaen kehitetään ympyränkaaren rasterointimenetelmä. Sen jälkeen tarkastellaan, kuinka edellisillä menetelmillä pikselijanoin ja -kaarin rajattuja alueita voidaan täyttää halutulla värillä. Lopuksi esitetään täytettyjen monikulmioiden tehokas rasterointitekniikka, liukuvan suoran menetelmä, jota jatkossa käytetään pääasiallisena monikulmioiden rasterointimenetelmänä. Liukuvan suoran menetelmään on myöhemmin helppo lisätä uusia ominaisuuksia. Tällaisia ominaisuuksia ovat muunmuassa näkyvien pintojen määrääminen z-puskuritekniikalla, monikulmioiden sävyttäminen, tekstuuribittikartan käyttö yms Janan rasterointi Tehtävänä on piirtää bittikarttaan (rasteriin) jana annetun kahden pisteen välille. Tämä ei ole kuitenkaan riittävän täsmällinen ongelman määrittely. Täsmällisen määrittelyn tulisi vastata ainakin seuraaviin kysymyksiin: Mitkä tason pisteet sallitaan piirrettävän janan päätepisteiksi? Mitä tarkoitetaan rasteriin piirtämisellä? Mitä tarkoitetaan rasterijanalla? Kuinka mitataan algoritmin toimintatarkkuus, eli kuinka suuren virheen menetelmä tekee verrattaessa lopputulosta oikeaan tasojanaan? Määritellään ongelma uudelleen seuraavasti: Olkoon annettu kaksi tason pistettä, P ja Q, joiden molempien koordinaatit ovat kokonaislukuja. Määrittele mitkä rasterin pikselit tulee sytyttää, jotta saamme sellaisen yhden pikselin paksuisen approksimaation tarkalle tasojanalle, päätepisteinään P ja Q, joka kulkee enintään puolen pikselin etäisyydellä janan tarkasta esityksestä. Selvästikin on kolme erikoistapausta, joiden rasterointi on triviaalia. Nämä ovat joko vaaka- tai pystysuorien tai diagonaalisten janojen tapaukset. Jos jana (päätepisteiden koordinaatit kokonaislukuja) on vaakasuora, lähdetään liikkeelle vasemmasta päätepisteestä, sytytetään vastaava pikseli, ja pikselin x-koordinaattia kasvattaen sytytetään seuraavat pikselit, kunnes tullaan toiseen päätepisteeseen. Pystysuorat janat hoituvat samalla tavalla, aloittaen alemmasta päätepisteestä ja kasvattaen y-koordinaattia, ja diagonaalijanat kasvattaen (tai vähentäen) sekä x- että y-koordinaattia.

80 74 LUKU 2. TASOGRAFIIKKA Perusalgoritmi Menetelmän johtamiseksi yleiselle tapaukselle lähdetään liikkeelle tilanteesta jossa piirrettävä jana ei ole täysin pystysuora. Olkoon pisteet P ja Q tällöin janan vasemman- ja oikeanpuoleiset päätepisteet. Tällaisessa ei-pystysuoran janan tapauksessa voimme käyttää janan määrittämiseen tuttua suoran yhtälöä y = ax + b, (2.56) missä a on suoran kulmakerroin ja b on suoran ja y-akselin leikkauspiste. Lähtien liikkeelle vasemman puoleisesta päätepisteestä P = (x 1,y 1 ) Z 2, lasketaan x i :n askeltaessa kokonaislukuaskelin x i = x 1,...,x 2 yleensä reaalinen pistettä x i vastaava y-koordinaatti ỹ i suoran yhtälöstä ỹ i = ax i + b. (2.57) Sytytettävän pikselin kokonaislukukoordinaatit ovat (x i,y i ), missä koordinaatti y i saadaan pyöristämällä ỹ i lähimmäksi kokonaisluvuksi lisäämällä siihen puolikas ja katkaisemalla desimaaliosa pois, eli y i = ỹ i Inkrementaaliversio Edellisen kappaleen menetelmässä on vielä monta heikkoutta. Ensinnäkin se perustuu reaalilukuihin, joten sen käytännön toteutuksessa joudutaan käyttämään kallista (nykyaikana?) liukulukuaritmetiikkaa. Toiseksi, menetelmässä tarvitaan kertolaskuoperaatiota, joka sekin on ehkä liian kallista. Kolmanneksi, jos janan kulmakerroin on itseisarvoltaan suurempi kuin yksi, jättää menetelmä katkoksia pikselijanaan. Pyritään ensiksi eliminoimaan kertolasku. Tämä voidaan tehdä helposti seuraavalla tavalla: Koska x-koordinaatti on aina kokonaisluku, ja sitä kasvatetaan aina yhdellä siirryttäessä seuraavan pikselin piirtoon, voidaan ỹ i+1 laskea kaavasta ỹ i+1 = ax i+1 + b = a(x i + 1) + b = ax i + b + a = ỹ i + a. (2.58) Pikselin lopullinen koordinaatti saadaan pyöristämällä kuten edellä, katso kuva Inkrementaaliversiolla on vielä useita puutteita. Kokonaisluvuiksi pyöristäminen vaatii turhaan laskutehoa ja muuttujien, joihin talletetaan kulmakerroin a ja reaalinen y-koordinaatti ỹ i, täytyy olla liukulukutyyppisiä. Lisäksi pystysuorat tai liian jyrkät janat vaativat omat erikoistilanteiden käsittelynsä. Kehitetäänkin seuraavaksi uusi lähestymistapa, niin kutsuttu midpoint line -menetelmä.

81 2.5. RASTEROINTI: MALLISTA PIKSELEIKSI 75 ~ (x, y ) i i (x, y ) i+1 i+1 ~ (x, y +a) i+1 i (x, y ) i i Kuva 2.46: Uuden y-koordinaatin laskeminen edellisestä Midpoint line -menetelmä Oletetaan aluksi, että piirrettävä jana on loivasti nouseva, eli janan kulmakerroin a on välillä a (0, 1). Muut kulmakerroinarvot voidaan käsitellä peilaamalla koordinaattiakselien suhteen. Olkoon nyt janan vasemman (ja alemman) päätepisteen koordinaatit (x 0,y 0 ) ja oikean (ja ylemmän) päätepisteen koordinaatit (x 1,y 1 ). Oletetaan, että olemme juuri aiemmin valinneet sytytettäväksi pikselin P, jonka koordinaatit ovat (x p,y p ) (ensimmäisenä sytytetään tietenkin pikseli (x 0,y 0 )). Nyt annetuin oletuksin on täsmälleen kaksi vaihtoehtoa seuraavaksi sytytettäväksi pikseliksi, suoraan oikealla oleva pikseli (pikseli E, E=east) tai yläoikealla oleva pikseli (pikseli NE, NE=north-east). Olkoon Q piirrettävän janan ja pikseleitä E ja NE yhdistävän janan leikkauspiste ja M janan keskipiste, katso kuva Kehitettävä menetelmä perustuu siihen, että annetuin oletuksin täytyy rasteroitavan janan seuraavan sytytettävän pikselin väistämättä olla toinen pikseleistä E ja NE. Se kumpi näistä valitaan seuraavaksi sytytettäväksi pikseliksi määräytyy siitä kumpi niistä on lähempänä leikkauspistettä Q, eli siitä on leikkauspiste Q keskipisteen M ylä- vai alapuolella. Kuvan 2.47 tapauksessa valittaisiin seuraavaksi siis pikseli NE. Jos M = Q valitaan aina järjestelmällisesti sama pikseli. Tämä takaa myös sen, että virhe minkä menetelmä aiheuttaa on pystysuunnassa aina korkeintaan puoli pikseliä. Nyt täytyy vain löytää tehokas tapa laskea kummalla puolen janaa pitkin kulkevaa tarkkaa suoraa keskipiste M sijaitsee. Tämä ratkaistaan esittämällä suoran yhtälö implisiittimuodossa kuten kappaleessa Kyseisen suoran yhtälö voidaan esittää muodossa

82 76 LUKU 2. TASOGRAFIIKKA x p x p +1 x p +2 pikseli NE Leikkauspiste Q Keskipiste M (x, y ) p p Edellinen pikseli pikseli E Vaihtoehdot vuorossa olevalle Vaihtoehdot seuraavalle Kuva 2.47: Midpoint line -menetelmä. y = δ y δ x x + b, missä δ y = y 1 y 0, δ x = x 1 x 0. (2.59) Vakio b on selvästikin janan ja y-akselin leikkauspiste ja se on yleensä reaaliluku. Tämä ei kuitenkaan haittaa sillä varsinaisessa rasterointimenetelmässä kyseinen vakio eliminoituu lausekkeista. Laventamalla edellinen termillä δ x ja järjestelemällä lausekkeet uudelleen, saamme yhtälön f (x,y) = δ y x δ x y + δ x b = (( δy δ x ), ( )) x 0 = 0, (2.60) y b sillä helposti nähdään (katso luku 2.4.2), että vektori (δ y, δ x ) T on janaa pitkin kulkevan suunnatun suoran (suunnan määrää vektori (δ x,δ y ) T ) normaalivektori, joka osoittaa kulkusuuntaan katsottaessa oikealle. Täten = 0, jos piste (x, y) on suoran piste, f (x,y) > 0, jos piste (x, y) on suoran alapuolella, (2.61) < 0, jos piste (x, y) on suoran yläpuolella. Valitessamme pikselien E ja NE välillä, teemme päätöksen edellä määritellyn funktion f arvon perusteella pisteessä M = (x p + 1,y p + 1/2). Tätä varten käytämme päätösmuuttujaa d apunamme. Huomaa, että olemme itse asiassa kiinnostuneita vain f (x p + 1,y p + 1/2):n etumerkistä; se riittää päätöksen tekoon. Määrittelemme siis päätösmuuttujan d = f (x p + 1,y p + 1/2), (2.62)

83 2.5. RASTEROINTI: MALLISTA PIKSELEIKSI 77 ja tutkimme sen etumerkkiä. Jos d > 0, valitaan seuraavaksi pikseliksi NE (tällöinhän keskipiste M jää suoran alapuolelle), ja jos d < 0, valitaan seuraavaksi pikseliksi E. Jos d = 0 valitaan aina järjestelmällisesti jompi kumpi. Kuinka nyt laskemme tehokkaasti uuden arvon päätösmuuttujalle d, kun siirrymme seuraavaan pikseliin? Tämä tehdään seuraavasti, sen mukaan valittiinko edellä pikseli E vai pikseli NE: Jos edellä valittiin pikseli E, täytyy seuraavaksi laskea uusi päätösmuuttujan arvo d new pisteessä (x p + 2,y p + 1/2), koska siirryimme yhden askeleen oikealle. Jatkossa merkitsemme edellisen askeleen päätösmuuttujan arvoa d old :lla. Nyt helposti nähdään, että d new = f (x p + 2,y p + 1/2) = δ y (x p + 2) δ x (y p + 1/2) + δ x b = δ y (x p + 1) δ x (y p + 1/2) + δ x b + δ y = d old + δ y, (2.63) eli uusi päätösmuuttujan arvo saadaan vanhasta yksinkertaisesti lisäämällä siihen korjausterminä δ y. Jos aiemmin puolestaan valittiin piirrettäväksi pikseli NE, täytyy seuraavaa valintaa varten tietää päätösmuuttujan arvo pisteessä (x p + 2,y p + 3/2), liikuimmehan yläoikealle. Nyt yhtä helposti, d new = f (x p + 2,y p + 3/2) = δ y (x p + 2) δ x (y p + 3/2) + δ x b = δ y (x p + 1) δ x (y p + 1/2) + δ x b + δ y δ x = d old + δ y δ x, (2.64) eli tässä tapauksessa vanhaa päätösmuuttujan arvoa korjataan termillä δ y δ x. Yhteenvetona kerrataan toistaiseksi esitetty menetelmä: Joka askeleella menetelmä valitsee toisen kahdesta pikselistä E ja NE. Valinta tehdään aiemmassa askeleessa lasketun päätösmuuttujan etumerkin avulla. Päätösmuuttujaa korjataan valinnan mukaisella korjaustermillä (jos valittiin pikseli E, korjaus on δ y, ja jos valittiin pikseli NE, korjaus on δ y δ x ). Ensimmäiseksi piirrettäväksi pikseliksi tiedetään varmuudella pikseli (x 0,y 0 ), joten voimme sen avulla suoraan määritellä alkuarvon päätösmuuttujalle: Ensimmäinen keskipiste M on piste (x 0 + 1,y 0 + 1/2), joten ensimmäinen päätösmuuttujan arvo d start on d start = f (x 0 + 1,y 0 + 1/2) = δ y (x 0 + 1) δ x (y 0 + 1/2) + δ x b = δ y x 0 δ x y 0 + δ x b + δ y δ x /2 = f (x 0,y 0 ) + δ y δ x /2 = δ y δ x /2, (2.65) koska (x 0,y 0 ) on suoran piste ja täten f (x 0,y 0 ) = 0. Päätösmuuttujan d start etumerkin mukaan valittaisiin siis toinen piirrettävä pikseli, korjattaisiin siitä valin-

84 78 LUKU 2. TASOGRAFIIKKA nan mukaan uusi päätösmuuttujan arvo ja siirryttäisiin seuraavaan pikseliin. Menetelmässä on vielä yksi ongelma: Ensimmäinen päätösmuuttuja d start ei ole kokonaisluku, ellei δ x ole parillinen. Tästä ongelmasta eroon pääsemiseksi määritellään suoran implisiittifunktio uudelleen asettamalla f (x,y) = 2(δ y x δ x y + δ x b). (2.66) Tämä muutos ei vaikuta funktion f etumerkkiin lainkaan, muutos ainoastaan kaksinkertaistaa päätösmuuttujan ja sen korjaustermien arvot. Päätösmuuttujan aloitusarvoksi tulee nyt d start = 2δ y δ x ja korjaustermiksi saadaan valittaessa pikseli E 2δ y ja valittaessa pikseli NE 2(δ y δ x ). Seuraava aliohjelma on c-kielinen toteutus edellä kehitetystä menetelmästä. Se käyttää pelkästään kokonaislukuaritmetiikkaa ja huolehtii samalla tarvittavista peilauksista koordinaattiakselien suhteen. /* x1, y1, piirrettävän janan alkupiste x2, y2, piirrettävän janan loppupiste Setpixel, osoitin funktioon, joka sytyttää pikselin */ int midpoint_line(int x1, int y1, int x2, int y2, int (*Setpixel)(int,int)) { int x=x1, y=y1; int deltax, deltay, s1, s2, tmp, ic=0; int i, v; deltax = abs(x2-x1); deltay = abs(y2-y1); if (deltax == 0 && deltay == 0) { Setpixel(x,y); return 0; } s1 = ( x2-x1 > 0? 1 : ( x2-x1 < 0? -1 : 0 ) ); s2 = ( y2-y1 > 0? 1 : ( y2-y1 < 0? -1 : 0 ) ); if (deltay > deltax) { tmp = deltay; deltay = deltax; deltax = tmp; ic = 1;

85 2.5. RASTEROINTI: MALLISTA PIKSELEIKSI 79 } } v = 2*deltay - deltax; Setpixel(x,y); for (i=0; i<deltax; i++) { if(v >= 0) { if (ic) { x = x + s1; } else { y = y + s2; } v = v - 2*deltax; } if (ic) { y = y + s2; } else { x = x + s1; } v = v + 2*deltay; Setpixel(x,y); } return 0; Kuvassa 2.48 on esitetty, mitkä pikselit menetelmä valitsee, kun pitää rasteroida jana päätepisteinään (3,6) ja (14,9). Kuvaan on myös piirretty tarkka jana Ympyrän kaaren rasterointimenetelmä Edellä jana rasterointiin midpoint line -menetelmällä. Midpoint line -menetelmä voidaan yleistää myös ympyrän kaarien rasterointiin, olettaen että ympyrän keskipiste sijaitsee jonkin pikselin keskipisteessä ja säde ilmoitetaan käyttäen etäisyytenä pikselien lukumäärää. Olkoon annettu keskipisteen pikselikoordinaatit (x 0,y 0 ) ja säde r (pikseleinä). Ympyrän yhtälö on tuttu alkeismatematiikasta: Piste (x, y) on ympyrän kehällä jos ja vain jos (x x 0 ) 2 + (y y 0 ) 2 = r 2. (2.67) Huomautus: Heti alkuun esitellään kaksi (ehkä ensimmäisenä mieleentulevaa) menetelmää, joista kumpikaan ei ole kovin suositeltava. Ympyrän yhtälöstä (2.67)

86 80 LUKU 2. TASOGRAFIIKKA Kuva 2.48: Jana rasteroituna midpoint line -menetelmällä. voidaan ratkaista esimerkiksi y x:n ja r:n avulla. Tästä saamme menetelmän, jossa x-koordinaatin annetaan kulkea pikseli pikseliltä yli välin [x 0 r,x 0 + r] ja kutakin x-pikselikoordinaattia vastaavat kaksi y-koordinaattia saamme pyöristämällä reaaliluvut ỹ 1,2 = y 0 ± r 2 (x x 0 ) 2 lähimmiksi kokonaisluvuiksi. Toinen (myös huono) menetelmä saadaan käyttämällä ympyrän kehän parametrisoitua esitystä (x(t),y(t)) = (x 0 + r cos(t),y 0 + r sin(t)), t [0,2π], jota sovellettaisiin siten, että annettaisiin kulmaparametrin askeltaa tasavälisin askelin yli välin [0, 2π] ja yllä olevan kaavan antamat askelpisteitä vastaavat koordinaatit pyöristettäisiin kokonaisluvuiksi. Kotitehtäväksi jätetään sen pohtiminen, mitkä ovat edellisten menetelmien epäkohdat ja miksi niiden käyttäminen ei ole suositeltavaa. Ympyrän kehällä vallitsee vahva symmetria: Jos piste (x 0 + a,y 0 + b) on ympyrän kehällä, ovat siellä väistämättä myös pisteet (x 0 ± a,y 0 ± b) ja (x 0 ± b,y 0 ± a), eli kehältä löytyy kahdeksan symmetriapistettä. Jotta tämä symmetria olisi voimassa myös kehää approksimoivien pikselien koordinaateille, pitää ympyrän keskipisteen koordinaattien olla kokonaislukuja.

87 2.5. RASTEROINTI: MALLISTA PIKSELEIKSI 81 Piste (x0,y0+r) Rasteroitava kehän osa (x0,y0) Kuva 2.49: Rasteroitava kehän osa. Symmetriasta on se hyöty, että riittää jos osaamme rasteroida vain kahdeksasosan ympyrän kehästä. Rasteroimmekin vain sen osan, joka piirtyy kiertämällä kehää myötäpäivään kulman π/4 verran aloittaen kehän pisteestä (x 0,y 0 + r). Huomaa, että tämä on tarkka pikselikoordinaatti ympyrän kehän pisteelle, sillä oletimme että x 0, y 0 ja r ovat kokonaislukuja, katso kuva Lisähavaintona huomaamme, että riittää kunhan osaamme rasteroida origokeskisen r-säteisen ympyränkaaren. Keskipisteen siirto haluttuun pikselikoordinaattiin voidaan tehdä sisällyttämällä kokonaislukusiirtovektorin (x 0,y 0 ) T määräämä siirto pikselin sytytysvaiheeseen. Eli, kun kohta esitettävä menetelmä antaa origokeskisen ympyrän kehäapproksimaation pikselikoordinaatteja (x, y), sytytetäänkin pikseli paikassa (x + x 0,y + y 0 ) ja paikan seitsemässä symmetriapisteessä. Itse menetelmä käyttää jälleen päätösmuuttujaa, jota korjataan sytytettävän pikselin valinnan määräämänä sopivin korjaustermein. Valitun kehäoktantin takia on menetelmässä valittava suoraan oikealla olevan pikselin E ja alaoikealla olevan pikselin SE välillä. Tässä seuraamme janan rasterointimenetelmää ja käytämme apunamme ympyrän kehän implisiittiyhtälöä h(x,y) = x 2 + y 2 r 2, (2.68) jolle on selvästikin voimassa = 0, jos piste (x, y) on ympyrän kehällä, h(x, y) > 0, jos piste (x,y) on ympyrän kehän ulkopuolella, < 0, jos piste (x,y) on ympyrän kehän sisäpuolella. (2.69)

88 82 LUKU 2. TASOGRAFIIKKA Oletetaan, että olemme edellisellä askeleella löytäneet kehän pikselin (x, y). Tällöin on päätettävä kumpi pikseleistä (x + 1,y) ja (x + 1,y 1) valitaan seuraavaksi. Päätös tehdään jälleen laskemalla implisiittifunktion h arvo vaihtoehtoisten pikselien puolivälissä pisteessä m = (x + 1, y 1/2) ja tutkimalla päätösmuuttujalausekkeen g(x,y) = h(x + 1,y 1/2) = (x + 1) 2 + (y 1/2) 2 r 2 (2.70) etumerkkiä. Jos lauseke on positiivinen, on keskipiste ympyrän ulkopuolelle, joten seuraavaksi pikseliksi valitaan (x + 1,y 1). Jos lauseke on negatiivinen, on keskipiste ympyrän sisällä ja pikseliksi valitaan (x + 1, y). Jos lauseke saa arvon nolla, valitaan jälleen järjestelmällisesti jompi kumpi. Lausekkeen (2.70) arvo menetelmän kehittämissä peräkkäisissä pisteissä voidaan jälleen laskea inkrementaalisti korjaamalla edellisen askeleen arvoa pikselivalinnan mukaisella korjaustermillä. Suoralla laskulla nähdään, että g(x + 1,y) g(x,y) = (x + 2) 2 (x + 1) 2 = 2x + 3, (2.71) joten siirryttäessä pikseliin E, tulee päätösmuuttujaa korjata termillä δ E = 2x + 3. Vastaavasti siirryttäessä pikseliin SE korjaus on δ SE = g(x + 1,y 1) g(x,y) = (x + 2) 2 (x + 1) 2 + (y 3/2) 2 (y 1/2) 2 = 2(x y) + 5. (2.72) Huomaa, että edelliset korjaustermit eivät ole vakioita, vaan ne ovat ensimmäisen asteen polynomeja, joten näyttäisi siltä, että joudumme yhä käyttämään kertolaskua. Tämä hoidetaan päivittämällä inkrementaalisesti korjaustermejäkin vakiokorjaustermeillä, joita tulee yhteensä neljä kappaletta: korjaustermiä δ E korjataan piirrettävän pikselin valinnan mukaan kahdella vaihtoehtoisella vakiokorjauksella, samoin kuin korjataan korjaustermiä δ SE. Nämä korjaukset saadaan samoin kuin aiemmin: Tutkitaan kuinka δ E :n ja δ SE :n arvot muuttuvat siirryttäessä joko pikseliin E tai pikseliin SE. Korjaustermin δ E muutokset valittaessa pikseli E tai SE ovat δ E (x + 1,y) δ E (x,y) = 2(x + 1) 2x = 2, jos valittiin E, δ E (x + 1,y 1) δ E (x,y) = 2(x + 1) 2x = 2, jos valittiin SE. (2.73) Vastaavat muutokset korjaustermille δ SE ovat δ SE (x + 1,y) δ SE (x,y) = 2(x + 1) 2x = 2, jos valittiin E, δ SE (x + 1,y 1) δ SE (x,y) = 2(x+1 y+1) 2(x y) = 4, jos valittiin SE. (2.74)

89 2.5. RASTEROINTI: MALLISTA PIKSELEIKSI 83 Menetelmä käynnistetään alustamalla ensimmäisen piirrettävän pikselin koordinaatiksi x = 0, y = r. Päätösmuuttujan d arvoksi asetetaan d = (x + 1) 2 + (y 1/2) 2 r 2 = 5/4 r, ja korjaustermeiksi δ E = 2x +3 = 3 ja δ SE = 2(x y)+5 = 5 2r. Tämä ei vielä ihan riitä kokonaislukuversion toteuttamiseksi sillä päätösmuuttuja on murtoluku. Tällä kertaa skaalaamme implisiittifunktion kertoimella neljä, samoin kuin korjaustermit ja niiden korjaukset. Tällöin pääsemme pelkästään kokonaisluvuin operoivaan algoritmiin. Sen c-kielinen toteutus on esitetty seuraavassa: /* Sytyttää kehän symmetriset pikselit ja siirtää keskipisteen paikkaan (c_x,c_y) */ int circlepoints(int c_x, int c_y, int x, int y, int (*Setpixel)(int,int)) { Setpixel(c_x+x,c_y+y); Setpixel(c_x+x,c_y-y); Setpixel(c_x-x,c_y+y); Setpixel(c_x-x,c_y-y); Setpixel(c_x+y,c_y+x); Setpixel(c_x+y,c_y-x); Setpixel(c_x-y,c_y+x); Setpixel(c_x-y,c_y-x); return 0; } /* c_x, c_y -keskipiste, radius -säde, Setpixel -osoitin pikselit sytyttävään aliohjelmaan */ int midpoint_circle(int c_x, int c_y, int radius, int (*Setpixel)(int,int))

90 84 LUKU 2. TASOGRAFIIKKA Kuva 2.50: Menetelmällä rasteroitu ympyränkehä. { } int x = 0, y = radius, d = 5-4*radius; int delta_se = 20-8*radius; int delta_e = 12; while (x < y) { circlepoints(c_x,c_y,x,y,setpixel); if (d < 0) { d = d + delta_e; delta_e = delta_e + 8; delta_se = delta_se + 8; } else { y--; d = d + delta_se; delta_e = delta_e + 8; delta_se = delta_se + 16; } x = x + 1; } return 0; Harjoitustehtäväksi jätetään perustella miksi while-silmukan lopetuskriteeri on oikea. Kuvassa 2.50 on esitetty edellisellä algoritmilla rasteroitu ympyränkehä. Tarkka kehä on myös piirretty mukaan kuvaan. Vastaavan kaltainen menetelmä voidaan konstruoida myös koordinaattiakse-

91 2.5. RASTEROINTI: MALLISTA PIKSELEIKSI 85 lien suuntaisten ellipsien rasterointiin. Tällöin kehältä löytyy vain neljä symmetriapistettä, ja menetelmän tulee osata vaihtaa x-askellus y-askellukseen. Ellipsille, jonka akselit ovat koordinaattiakselien suuntaisia, voidaan jälleen muodostaa implisiittifunktioesitys. Tällaisen ellipsin pinnan pisteissä (x,y) on voimassa f (x,y) = b 2 x 2 + a 2 y 2 a 2 b 2 = 0, (2.75) missä a ja b ovat x- ja y-suuntaisten puoliakselien pituudet. Tässäkin tapauksessa voidaan käyttää inkrementaalitekniikkaa korjaustermien päivittämiseen samaan tapaan kuin ympyrän tapauksessa. Menetelmän täytyy kuitenkin löytää se piste, jossa ellipsin kaari kääntyy niin jyrkäksi, että pinnan tangenttisuoran kulmakerroin ylittää itseisarvoltaan arvon yksi. Tämä piste löydetään implisiittifunktion gradienttivektorin avulla. Jos pinta esitetään implisiittimuodossa (2.75), antaa gradienttivektori ellipsipinnan ulkonormaalivektorin jokaiselle pinnan pisteelle (x, y). Kaavan (2.75) funktion f gradienttivektori pisteessä (x,y) on f (x,y) = ( f x (x,y) f y (x,y) ) = ( 2b 2 ) x 2a 2. (2.76) y Menetelmän tulee askeltaa x-suuntaan niin kauan kun gradienttivektori osoittaa enemmän ylös kuin oikealle, eli kun 2a 2 y > 2b 2 x. Täten menetelmä vaihtaa y-askellukseen kun lausekkeen a 2 y b 2 x etumerkki vaihtuu negatiiviseksi. Tätäkin lauseketta voidaan päivittää korjaustermein. Huomautus: Vastaavia rasterointimenetelmiä on kehitetty myös muille kartioleikkauksille Alueiden täyttäminen Edellisten kappaleiden menetelmillä saamme reunamurtoviivoin ja ympyränkaarin rajattua rasteritasosta alueita. Jos haluamme täyttää tason osa-alueen jollakin värillä, voidaan soveltaa tämän kappaleen tekniikoita. Nämä menetelmät vaativat, että niille annetaan aloituspikseli, josta lähtien täyttö käynnistetään. Esiteltävät menetelmät soveltuvat parhaiten erilaisiin maalausohjelmiin, joissa käyttäjä interaktiivisesti piirtelee rasteriin ympyröitä ja janoja, ja esimerkiksi hiirellä osoitellen määrää täytettävän osa-alueen jonkin pikselin. Seuraavan kappaleen menetelmä on paljon tehokkaampi, mutta se rajoittuu monikulmio-objekteihin. Käsitellään seuraavaksi kahta lähestymistapaa. Ensimmäinen menetelmä korvaa kaikki annetun vakiovärisen pikselireunan rajaamat rasterin pikselialueet halutulla värillä (englanniksi boundary fill) lähtien liikkeelle käyttäjän määräämästä

92 86 LUKU 2. TASOGRAFIIKKA Pikseli (x,y) Pikseli (x,y) Kuva 2.51: Pikselin (x,y) neli- ja kahdeksannaapuripikselit. siemenpikselistä. Toinen puolestaan korvaa tietyn värin toisella (englanniksi flood fill), aloittaen siemenpikselistä. Näille menetelmille on oleellista mitkä annetun pikselin viereiset pikselit luokitellaan sen naapureiksi, eli millä tavalla rasterin objektien yhtenäisyys määritellään. Kaksi yleisintä tapaa ovat nelinaapuristo- ja kahdeksannaapuristo-yhtenäisyydet. Ensimmäisessä oletetaan annetun pikselin naapuripikseleiksi ne neljä pikseliä, joihin päästään liikkumalla pääilmansuuntiin. Siemenpikselin nelinaapuristoksi määritellään niiden rasterin pikseleiden joukko, jotka voidaan saavuttaa liikkumalla pikselistä toiseen vain näihin neljään suuntaan. Kahdeksannaapuristoon kuuluvat edellisen nelinaapuriston pikseleiden lisäksi ne, joihin kulkiessa täytyy valita suunnaksi jokin väli-ilmansuunnista, katso kuva Boundary fill -tyyppinen menetelmä on helpoin toteuttaa rekursiivisesti. Ohessa se nelinaapuristoversio on annettu pseudo-c-koodina void boundaryfill4(int x, int y, int fill, int boundary) { int current; } current = getpixel(x,y); if (current!= boundary && current!= fill) { setpixel(x,y,fill); boundaryfill4(x+1, y, fill, boundary); boundaryfill4(x-1, y, fill, boundary); boundaryfill4(x, y+1, fill, boundary); boundaryfill4(x, y-1, fill, boundary); } Edellisessä algoritmissa aliohjelma getpixel palauttaa annetun pikselin värin, ja aliohjelma setpixel puolestaan värittää annetun pikselin annetulla värillä. Me-

93 2.5. RASTEROINTI: MALLISTA PIKSELEIKSI 87 netelmä toimii yksinkertaisesti siten, että aluksi tutkitaan onko vuorossa oleva pikseli jo väritetty halutulla värillä fill vai onko se reunapikseli värinään boundary. Kummassakin tapauksessa poistutaan välittömästi. Muutoin asetetaan vuorossa olevan pikselin väriksi fill ja kutsutaan samaa aliohjelmaa rekursiivisesti kaikille nelinaapuriston pikseleille. Ensimmäisessä kutsussa välitetään aliohjelmalle siemenpikselin koordinaatit. Kahdeksannaapuristoversio toimii täysin samoin. Ainoastaan rekursiokutsuja tulee neljä lisää väli-ilmansuuntiin. Flood fill -menetelmä korvaa ennalta määrätyn vanhan värin uudella. Sekin on helppo toteuttaa rekursiivisesti: void floodfill4(int x, int y, int fill, int oldcolor) { if (getpixel(x,y) == oldcolor) { setpixel(x,y,fill); floodfill4(x+1, y, fill, oldcolor); floodfill4(x-1, y, fill, oldcolor); floodfill4(x, y+1, fill, oldcolor); floodfill4(x, y-1, fill, oldcolor); } } Aliohjelmasta poistutaan välittömästi ellei vuorossa oleva pikseli ole väritetty korvattavalla värillä, muutoin korvataan väri uudella ja kutsutaan aliohjelmaa rekursiivisesti nelinaapureilla. Edelliset pseudo-koodatut aliohjelmat eivät ole vielä kelvollisia sellaisenaan. Niihin pitää lisätä ainakin tarkistus siitä, että pysytään rasteritaulukon alueella. Lisäksi rekursiivisesti toteutettuna ne vievät paljon pinomuistia. Tätä voi hieman lievittää käyttämällä globaaleja muuttujia, tai ohjelmoimalla rekursion itse pinon avulla. Kirjallisuudesta löytyy myös useita menetelmiä, joissa muistinkulutukseen on kiinnitetty paremmin huomiota Liukuvan suoran menetelmä Edellä mainittuja alueiden täyttömenetelmiä käytetään yleensä vain interaktiivisissa maalaussovelluksissa, joissa käyttäjä itse osallistuu lopputuloksen piirtoon matalatasoisin menetelmin. Jos näkymä koostetaan geometrisen mallin avulla monikulmioista, muunnetaan piirrettävää näkymää säätelemällä mallin parametreja, esimerkiksi nivelten kiertokulmia, kappaleen osien mittoja, materiaaliominaisuuksia ja niin edelleen. Itse kuvan piirto tapahtuu sen jälkeen automaattisesti kuvaamalla objektit maailmankoordinaatistoon läpikäymällä mallin puuesitys, leik-

94 88 LUKU 2. TASOGRAFIIKKA ymax p0 p1 p2 p3 y Kuva 2.52: Pyyhkäisysuoran ja monikulmion leikkauspisteet, ja sytytettävät pikselijanat. ymin kaamalla objektit kuvaikkunan kanssa, muuntamalla leikattujen objektien kärkipisteet pikselikoordinaateiksi, ja lopulta rasteroimalla objektit. Ehkäpä suosituin menetelmä monikulmioiden rasterointiin on niin kutsuttu liukuvan suoran menetelmä (englanniksi scanline fill algorithm). Sen perusidea on seuraava: Ensin tutkitaan kuinka vaakasuora (x-akselin suuntainen) pikselipyyhkäisysuora leikkaa rasteroitavan monikulmion reunajanoja. Pyyhkäisysuoran ja monikulmion reunajanojen leikkauspisteet järjestetään kasvavan x-koordinaatin mukaiseen järjestykseen ja sytytetään peräkkäisten pisteparien väliset pikselit. Perusalgoritmi on siis pseudokoodina seuraava: For y = y min,y max Määritä pyyhkäisysuoran y ja monikulmion sivujen leikkauspisteet Järjestä leikkauspisteet kasvavan x-koordinaatin mukaan Sytytä peräkkäisten leikkauspisteparien väliset pikselit Kuvan 2.52 esimerkissä pyyhkäisysuora leikkaa monikulmiota neljässä pisteessä p 0, p 1, p 2 ja p 3, jotka siis on järjestetty kasvavan x-koordinaatin mukaiseen järjestykseen. Pyyhkäisysuoraa y vastaten sytytetään pikselit väleillä p 0, p 1 ja p 2, p 3. Menetelmää täytyy kuitenkin vielä modifioida, jotta se toimisi kaikissa erikoistapauksissa. Ensinnäkin jos kaksi monikulmiota on vierekkäin, täytyy määritellä kummalle monikulmiolle reunapikseli kuuluu. Tämä voidaan tehdä seuraavasti: Jos peräkkäinen leikkauspistepari on (x i,y),(x j,y), sytytetään pikselit välillä ( x i,y), ( x j,y). Vaikka monikulmion kärkipisteet onkin jo muunnettu pikselikoordinaatteihin, eivät reunajanojen ja pyyhkäisysuoran leikkauspisteiden x-koordinaatit välttämättä ole kokonaislukuja. Niinpä alkupisteen x-koordinaatti

95 ! " " # #!!!!! " " " " # # # # 2.5. RASTEROINTI: MALLISTA PIKSELEIKSI 89 (x,y) y x on kokonaisluku Kuva 2.53: Pyyhkäisysuoran ja monikulmion leikkauspisteet, ja sytytettävät pikselijanat. pyöristetäänkin ylöspäin seuraavaan suurempaan kokonaislukuun ja loppupisteen x-koordinaatti puolestaan pyöristetään alaspäin. Tämä ei kuitenkaan vielä ole täysin valmis ratkaisu. Se ei kerro kuinka tulee toimia, jos leikkauspisteen x-koordinaatti sattuukin olemaan kokonaisluku. Tällaisessa tapauksessa toimitaan siten, että jos alkupisteen x-koordinaatti on kokonaisluku, sytytetään alkupistettä vastaava pikseli ja jos loppupisteen x-koordinaatti on kokonaisluku ei pikseliä sytytetä. Jos näin ei toimittaisi, tulisi kuvan 2.53 tapauksessa vierekkäisten monikulmioiden yhteinen reunapikseli (x, y) piirrettyä kahdesti. Nyt menetelmä määrittää sen olevan oikeanpuoleisen monikulmion pikseli. Tämä aiheuttaa tietenkin sen efektin, että objekti ikään kuin siirtyy puoli pikseliä vasemmalle. Tästä ei kuitenkaan ole käytännössä haittaa, sillä siirto on systemaattista ja tehdään kaikille piirrettäville monikulmioille, joten lopputuloksesta sitä ei käytännössä huomaa. Lisäongelmia aiheuttavat tapaukset, joissa leikkauspiste on täsmälleen reunajanan päätepiste. Nämä ovat hyvin yleisiä, sillä päätepisteet on annettu pikselikoordinaateissa. Kuvan 2.54 tapauksessa pyyhkäisysuora leikkaa monikulmiota kolmessa pisteessä p 0, p 1 ja p 2. Jos edellistä menetelmää sovellettaisiin suoraan, tulisi ongelmaksi se, että leikkauspisteitä on pariton määrä, joten menetelmä osaisi piirtää vain pikselijanan p 0, p 1. Ratkaisuna on ottaa leikkauspiste p 1 mukaan kahdesti, jolloin leikkauspisteet järjestettynä olisivat p 0, p 1, p 1 ja p 2, ja pareittainen pikselijanojen piirto tuottaisi halutun lopputuloksen. Tämä onnistuu siten,

96 90 LUKU 2. TASOGRAFIIKKA ymax e1 e2 p0 p1 p2 y ymin Kuva 2.54: Pyyhkäisysuora leikkaa monikulmiota reunajanan päätepisteessä, tapaus 1. ymax e1 p0 p1 p2 p3 e2 y Kuva 2.55: Pyyhkäisysuora leikkaa monikulmiota reunajanan päätepisteessä, tapaus 2. ymin että määritellään pyyhkäisysuoran leikkauspisteet erikseen jokaisen monikulmion reunajanan kanssa. Tällöin kuvan 2.54 saamme pisteen p 1 sekä suoran ja janan e1 että suoran ja janan e2 leikkauspisteenä. Nämä molemmat huomioidaan tässä tapauksessa aitoina leikkauspisteinä. Tämäkään sääntö ei kuitenkaan ole yleispätevä. Jos sitä sovelletaan kuvan 2.55 tapaukseen, huomioidaan leikkauspiste p 1 kahteen kertaan ja menetelmä piirtää virheellisesti pisteiden p 1 ja p 2 välisen janan. Yleispätevä sääntö on seuraava: Jos pyyhkäisysuora leikkaa reunajanaa reunajanan päätepisteessä, huomioidaan leikkauspiste siinä tapauksessa, että kyseinen päätepiste on y-suunnassa alempana kuin janan toinen päätepiste. Tämän säännön mukaan piste p 1 huomioidaan kah-

97 2.5. RASTEROINTI: MALLISTA PIKSELEIKSI 91 ymax ymax e1 e2 e1 p0 p1 p2 y p0 p1 p2 p3 e2 y Leikkauspiste p1 huomioidaan kummallekin janalle e1 ja e2 Leikkauspiste p1 huomioidaan vain janalle e1 ymin ymin Kuva 2.56: Pyyhkäisysuora leikkaa monikulmiota reunajanan päätepisteessä, sääntö x=3 x= x=3 x=3 x=3 x=3 x=3 x=7 x=6 x=5 x=4 x=3 1 Kuva 2.57: Leikkauspistelistat. desti kuvan 2.56 vasemmanpuoleiselle monikulmiolle, koska se on alempi päätepiste kummallekin janalle e1 ja e2. Oikeanpuoleiselle monikulmiolle piste p 1 huomioidaan vain kerran janalle e1 koska se on vain sille alempi päätepiste. Kaikki edelliset erikoistapaukset voidaan käsitellä seuraavaksi esitettävän algoritmin avulla. Sen toiminnan havainnollistamiseksi käsitellään esimerkkinä tapausta, jossa halutaan rasteroida kolmio, jonka kärkipisteet ovat (3, 2), (3, 8) ja (9,8). Esitettävä menetelmä ei ole tehokkain mahdollinen, mutta se on selkeähkö toteuttaa. Piirtoa varten muodostetaan vaiheessa 1 kuvan 2.57 mukaiset leikkauspistelistat. Vaihe 1 toimii seuraavasti: Vaihe 1: Jokaiselle monikulmion reunajanalle, jonka päätepisteet ovat (x s,y s ) ja (x e,y e ):

98 92 LUKU 2. TASOGRAFIIKKA 1. Jos vuorossa oleva jana on vaakasuora, unohda se. 2. Jos y s > y e, vaihda päätepisteet keskenään. 3. Suorita X := Xs m := (Xe-Xs)/(Ye-Ys) for Y = Ys to Ye-1 do Add_to_list(Y,Round(X)) // Vie X:n listaan Y kasva- // van x-järjestyksen mää- // räämään paikkaan X:=X+m end Käytännössä edellä olevassa pikselin x-koordinaatin laskennassa käytetään kokonaislukuversiota ylläolevasta mentelmästä. Sen johtaminen jätetään harjoitustehtäväksi. Kun kaikki monikulmion reunajanat on käsitelty (viety listoihin tai vaakasuorina hylätty), ovat listat valmiit. Varsinainen rasterointi tehdään toisena vaiheena. Sitä varten käydään listojen alkuun osoittama osoitintaulukko läpi kasvavassa y-järjestyksessä ja haetaan taulukosta ensimmäinen epätyhjä lista. Osoittakoon siihen taulukon alkio y. Sen jälkeen toteutetaan seuraava silmukka: 1. Niin kauan kuin osoitintaulukon indeksistä y alkaa lista: Käy läpi alkiopareittain P 2i+1, P 2(i+1), i = 0,...,n 1 vuorossa oleva lista (listassa on aina parillinen määrä alkioita). Sytytä pikselit (P 2i+1.x,y)...(P 2(i+1).x 1,y). Kasvata y-indeksiä: y:=y+1 Huomautettakoon, että edellinen menetelmä todellakin huolehtii aiemmin havaituista erikoistapauksista. Kukin reunajana käydään läpi aina viimeistä edelliseen y-koordinaattiin asti, mutta läpikäynti alkaa aina ensimmäisestä koordinaatista. Tämä huolehtii kuvassa 2.56 esitetyllä tavalla janan päätepisteissä tapahtuvista leikkauksista. Lisäksi toisen vaiheen pikselien sytytys huolehtii vierekkäisten monikulmioiden rasteroinnin kuten kuvassa Vaiheen 1 reunapikseleiden x-koordinaattien laskenta ei muodosta yhtenäistä pikselijanaa kuten midpoint line -menetelmä. Tämä ei olekaan välttämätöntä sillä piirtoa varten tarvitaan kullekin

99 2.5. RASTEROINTI: MALLISTA PIKSELEIKSI 93 Kuva 2.58: Laatikon rasterointi ja sisäpikselien määrittely. reunajanalle täsmälleen yksi pikseli jokaista vaakasuoraa pyyhkäisysuoraa kohden. Koska menetelmä jättää reunajanojen ylimmän pikselin käsittelemättä, huolehtii menetelmä samalla oikein tapauksen, jossa piirretään päällekkäisiä monikulmioita. Tällöin monikulmion yläreuna jätetään piirtämättä. Nämä pikselit piirretään myöhemmin rasteroitaessa y-suunnassa yläpuolella olevaa monikulmiota. Tästä aiheutuu lisäksi se efekti, että monikulmiot ikään kuin siirtyvät alavasemmalle puoli pikseliä kumpaankin suuntaan. Toisaalta piirretyn monikulmion pintaala pikseleinä on lähempänä oikeaa. Kuvassa 2.58 on rasteroitu suorakulmio, jonka sivujen pituudet ovat neljä ja kuusi pikseliä. Vasemmanpuoleisessa tapauksessa ei olla huolehdittu oikein reunapikselien käsittelystä, joten laatikko on täytetty käyttäen 35 pikseliä. Oikeanpuoleisessa tapauksessa on käytetty esitettyä liukuvan suoran menetelmää, jolloin tulos on pinta-alaltaan oikein eli 24 pikseliä. Lisäesimerkkejä menetelmän toiminnasta on esitetty kuvissa 2.59 ja Tehokkaampi versio konvekseille monikulmioille Jos rasteroitava monikulmio on konveksi, voidaan edellistä menetelmää tehostaa huomattavasti. Konveksien monikulmioiden tapauksessa jokaisen pyyhkäisysuoran ja monikulmion leikkaus koostuu korkeintaan yhdestä pikselijanasta. Oletetaan seuraavassa, että konveksi monikulmio on esitetty luettelemalla sen kärkipisteet p 0,..., p n 1 vastapäivään kiertäen kuten kuvassa Menetelmä käynnistetään lähtien liikkeelle kärkipisteestä, jonka y-koordinaatti on pienin (jos useita, eräästä niistä). Kuvan 2.61 tapauksessa otetaan ensimmäiseksi kärkipisteeksi p 1. Tällöin tiedämme että janat jotka saadaan yhdistämällä valittu alkupiste edellisen (p l ) ja seuraavan (p r ) kärkipisteen kanssa muodostavat ensimmäisinä vasemman ja oikean reunajanan. Niitä vastaavat pyyhkäisysuoran leikkauspisteiden x-koordinaatit x l ja x r saadaan samoin kuin edellisessä menetelmässä. Vuorossa olevaa leikkaussuoraa vastaten sytytetään pikselit väliltä x l,x r 1. Sen jälkeen kasvate-

100 94 LUKU 2. TASOGRAFIIKKA Kuva 2.59: Reunajanoja vastaavat listaan viedyt alkiot ja tuloksena saatu täytetty monikulmio. Reunoista ei aina muodostu yhtenäistä pikselijanaa. Kuva 2.60: Vastaavat ei-konveksille monikulmiolle.

101 2.5. RASTEROINTI: MALLISTA PIKSELEIKSI 95 p3 p2 p0 p1 Kuva 2.61: Esimerkki konveksista monikulmiosta. taan y:tä yhdellä. Jos edellä käsittelimme jo jonkin reunajanan toiseksi ylimmän pikselin, korvataan kyseinen reunajana uudella. Seuraavan päätepisteen indeksit saadaan kaavoista p l := p l + n 1 mod n, p r := p r + 1 mod n. (2.77) Jos vastaan tulee vaakasuora reunajana, se ohitetaan suoraan.

102 96 LUKU 2. TASOGRAFIIKKA

103 Luku 3 Kolmas ulottuvuus Tässä luvussa käsittelemme kuvanmuodostusta, kun näkymä koostetaan kolmiulotteisista objekteista. On selvää, että kolmas ulottuvuus monimutkaistaa tilannetta jonkin verran tasografiikkaan nähden, mutta loppujen lopuksi ongelma kuitenkin palautetaan kaksiulotteisten objektien piirtämiseksi. Tämä on toki luonnollista, sillä ajattelemmehan kuvan muodostuvan jollekin sopivasti asemoidulle kaksiulotteiselle tasolle eli kuvatasolle, jonne kolmiulotteiset objektit projisoidaan. Toimimme periaatteessa kuten tasografiikankin tapauksessa, eli koostamme ensin näkymän objektit yhteen koordinaattijärjestelmään jota edelleen kutsumme maailmankoordinaatistoksi. Käytämme jälleen apuna jo aiemmin hyväksi havaittua hierarkista mallittamista. Nyt primitiiviobjektit ovat yleensä kolmiulotteisia perusrakennuspalikoita niihin liittyvine materiaaliparametreineen. Hierarkinen malli esitetään jälleen puuna ja puun haaroihin liitetään geometrisia muunnoksia, jotka asemoivat kyseisen latvan alikokonaisuuden miellyttävästi parametrisoituna ylemmän tason monimutkaisemmaksi rakenteeksi. Samaan maailmankoordinaatistoon sijoitamme myös synteettisen kameran. Synteettinen kamera on käsite, jonka tarkoitus on helpottaa kuvanottotilanteen hahmottamista käyttäjälle. Se pyritään parametrisoimaan luontevalla ja intuitiivisella tavalla, jotta sen käyttö loppusovelluksissa olisi mahdollisimman helppoa. Kuva, joka näyttölaitteella esitetään on kolmiulotteisen näkymän kameraparametrien määräämä projektio kaksiulotteiselle tasolle. Tällä tasolla samalla määrätään suorakulmion muotoinen kuvaikkuna. Ainoastaan kuvaikkunan sisälle projisoituva näkymä piirretään näyttölaitteelle, joten joudumme tavalla tai toisella määrittämään objektien projektioiden ja kuvaikkunan leikkausjoukon. Käsittelemme sekä (vinoa) yhdensuuntaisprojektiota että perspektiiviprojektiota. Projektioiden laskeminen ja projisoitujen objektien leikkaaminen kuvaik- 97

104 98 LUKU 3. KOLMAS ULOTTUVUUS kunalla helpottuu oleellisesti, kunhan näkymän objekteihin ensin sovelletaan niin kutsuttua normalisointimuunnosta, joka määräytyy kameraparametrien ja projektiotyypin mukaan. Normalisointimuunnoksella näkymä kuvataan kanoniseen asemaan uuteen koordinaatistoon. Muunnos määrätään siten, että kuvaan näkyväksi projisoituva osa näkymästä kuvautuu muodoltaan yksinkertaisen tilavuuden, kanonisen suorakulmaisen kuvasärmiön tai kuvapyramidin sisälle. Tämä helpottaa objektien leikkaamista. Varsinainen kuvan piirto tapahtuu projisoimalla kuvasärmiön sisältö yhdensuuntaisprojektiolla (käytännössä unohtamalla kärkipisteiden yksi koordinaatti) yhdelle pääkoordinaattitasolle. Perspektiiviprojektion tapauksessa sovelletaan leikattujen monikulmioiden kärkipisteisiin kuitenkin ensiksi niin kutsuttua perspektiivimuunnosta, joka homogeenisia koordinaatteja käytettäessä muodostaa kuvapisteille sellaiset homogeeniset koordinaatit, että perspektiiviefekti aiheutuu, kun palataan takaisin karteesiseen koordinaatistoon. Perspektiivimuunnos määrätään siten, että se kuvaa kanonisen kuvapyramidin kanoniseksi kuvasärmiöksi. Kautta tämän luvun hyödynnetään jälleen systemaattisesti homogeenisia koordinaatteja ja niissä esitettäviä geometrisia muunnosmatriiseja. 3.1 Perusmuunnokset kolmessa ulottuvuudessa Homogeeniset koordinaatit Kolmiulotteisten geometriamuunnosten määrittelemiseksi esittelemme, kuten teimme tasografiikassa, homogeeniset koordinaatit. Samaistamme avaruuden R 3 avaruuden R 4 affiiniksi aliavaruudeksi A 4 = {(wx,wy,wz,w) R 4 w 0, w on vakio}. (3.1) Aluksi esiteltävät muunnokset ovat jälleen affiineja, eli ne kuvaavat affiinin aliavaruuden A 4 itselleen. Yleisesti homogeenisia koordinaatteja käytetään kuin aiemmin. Ensiksi R 3 :n alkio (x,y,z) T nostetaan R 4 :ään asettamalla sen vastinalkioksi (wx,wy,wz,w) T, missä w 0. Sen jälkeen sovelletaan homogeenisissa koordinaateissa määriteltyjä muunnoksia ja lopputulos, joka yleisessä tapauksessa on muotoa (x,y,z,w ) T, palautetaan R 3 :een jakamalla kolme ensimmäistä komponenttia neljännellä. Näin saadaan (x /w,y /w,z /w ) T R 3. Yleensä alkuvaiheessa nostettaessa R 3 avaruuden R 4 affiiniin aliavaruuteen A 4 valitaan w = 1. Esiteltävissä muunnoksissa, perspektiivimuunnosta lukuunottamatta, ei

105 3.1. PERUSMUUNNOKSET KOLMESSA ULOTTUVUUDESSA 99 Kuva 3.1: Objekti perusasemassaan. vektorin neljännen komponentin arvo muutu, joten lopun jakolasku on tarpeen ainoastaan perspektiiviprojektiota käytettäessä. Perspektiivimuunnos, joka esitetään myöhemmin, on ainoa tarvitsemamme ei-affiini muunnos, eli se ei kuvaa affiinia aliavaruutta A 4 itselleen. Tasogeometriassa objektin sijainnin määrää kaksi parametria, eli objektin pisteiden x- ja y-koordinaatit. Vastaavasti objektin suunnistuksen eli orientaation määrää yksi parametri. Objektihan voi pyöriä tasossa ainoastaan yhdellä tavalla. Kolmiulotteisessa tapauksessa sijainnin määrää luonnollisesti pisteiden kolme koordinaattia. Objektin orientaation määrääminen on kuitenkin huomattavasti vaativampaa. Osoittautuu, että objektin suunnistuksen täydellinen määrääminen vaatii kolme parametria. Tarkastellaan ensin muunnoksia, jotka ovat suoraviivaisia yleistyksiä tasogeometriasta. Sen jälkeen yritämme käsitellä melko perinpohjaisesti kolmiulotteisen avaruuden kierto-operaatioita.

106 100 LUKU 3. KOLMAS ULOTTUVUUS Kuva 3.2: Objektin siirto Siirto-, skaalaus-/peilaus-, ja vääntömatriisit Objekti voidaan siirtää (suhteessa origoon) kertomalla objektin pisteiden homogeeniset koordinaatit vasemmalta siirtomatriisilla t x T (t x,t y,t z ) = t y t z, T (t x,t y,t z ) 1 = T ( t x, t y, t z ). (3.2) Kuvassa 3.1 on esitetty objekti, joka on sijoitettu perusasemaansa. Kuva voisi esittää vaikkapa tyyliteltyä i-kirjainta omassa mallituskoordinaatistossaan. Kuvassa 3.2 i-kirjain on uudelleen asemoitu toiseen koordinaatistoon soveltamalla siihen siirtomatriisia (3.2) positiivisin siirtoparametrein t x, t y ja t z. Objektin skaalaus/peilaus voidaan tehdä muunnosmatriisilla s x S(s x,s y,s z ) = 0 s y s z 0, S(s x,s y,s z ) 1 = S(1/s x,1/s y,1/s z ), (3.3)

107 3.1. PERUSMUUNNOKSET KOLMESSA ULOTTUVUUDESSA 101 Kuva 3.3: Objekti ensin skaalattuna ja sitten siirrettynä (vasen), ja ensin siirrettynä ja sitten skaalattuna (oikea). missä skaalauskertoimet toimivat kuten tasomuunnoksissa. Erityisesti on huomioitava se, että sen käänteismatriisia ei ole määritetty, jos jokin skaalauskerroin on nolla. On selvää, että peräkkäiset siirrot voidaan tehdä mielivaltaisessa järjestyksessä, eli siirtomatriisit kommutoivat. Vastaavasti peräkkäiset skaalaukset kommutoivat keskenään. Siirto- ja skaalausmatriisit eivät kuitenkaan kommutoi keskenään, eli yleensä T (t x,t y,t z )S(s x,s y,s z ) S(s x,s y,s z )T (t x,t y,t z ). (3.4) Tätä on havainnollistettu kuvissa 3.3, joissa vasemmassa on objektia ensin skaalattu ja sitten siirretty ja oikeassa kuvassa samat muunnokset on tehty päinvastaisessa järjestyksessä. Kummassakin esimerkissä siirto ja skaalausmatriisien parametrit ovat t x = 2, t y = 1, t z = 1, s x = 1, s y = 3/2 ja s z = 2. Kolmiulotteisessa geometriassa on useita erilaisia vääntöoperaatioita. (Harjoitustehtävä: Kuinka monta?). Esittelemme niistä vain yhden. Se on xy-tason suuntainen vääntö, ja se saadaan aikaan muunnoksella (huomaa sen samankaltaisuus 2d-tapauksen siirtomatriisin kanssa) 1 0 v x 0 V xy (v x,v y ) = 0 1 v y , V xy(v x,v y ) 1 = V xy ( v x, v y ). (3.5)

108 102 LUKU 3. KOLMAS ULOTTUVUUS Osoittautuu, että tarvitsemme myöhemmin matriisia V xy, kun kuvan muodostusvaiheessa haluamme käyttää vinoa yhdensuuntaisprojektiota. 3.2 Kierrot avaruudessa R 3 Edelliset muunnokset olivat melko suoraviivaisia yleistyksiä vastaavista tasogeometrian muunnoksista. Kierto-operaatio avaruudessa R 3 on kuitenkin huomattavasti monimutkaisempi kuin tasossa. Tasossahan oli määritelty vain yksi kiertomatriisi, eli kappaleen asennon määräämiseksi riittää vain yksi parametri. Kolmiulotteisessa tapauksessa osoittautuu, että objektin saattamiseksi haluamaamme orientaatioon tarvitsemme kolme parametria, esimerkiksi kiertokulmat pääkoordinaattiakselien ympäri Eulerin kulmat Historiallisesti suosituin kappaleen asennon parametrisointitapa on niin kutsutut Eulerin kulmat, joiden avulla yleinen kierto-operaatio esitetään peräkkäisinä kiertoina keskenään kohtisuorien pääkoordinaattiakselien ympäri. Näitä kutsutaan x-, y- ja z-kierroiksi. Niitä vastaavat homogeeniset muunnosmatriisit ovat seuraavat: yz-tason kierron vastapäivään (kun kulmaparametri on positiivinen) x-akselin ympäri positiivisen x-akselin suunnasta origoa kohden katsottaessa tekee matriisi R x (θ) = 0 cosθ sinθ 0 0 sinθ cosθ 0. (3.6) Matriisi R x (θ) toimintaa on esitetty kuvassa 3.4, jossa kuvan 3.1 objektiin on sovellettu kiertomatriisia R x (1). Matriisi cosθ 0 sinθ 0 R y (θ) = sinθ 0 cosθ 0 (3.7) puolestaan kiertää xz-tasoa vastapäivään (kun kulmaparametri on positiivinen) y- akselin ympäri katsottaessa kohti origoa positiivisen y-akselin suunnasta. Kuvassa

109 3.2. KIERROT AVARUUDESSA R Kuva 3.4: Objektin kierto vastapäivään x-akselin ympäri matriisilla R x (θ), kiertokulma θ = on samaa objektia kierretty matriisin R y (1) avulla. Kierron z-akselin ympäri tekee matriisi cosθ sinθ 0 0 R z (θ) = sinθ cosθ , (3.8) ja efekti on jälleen se, että katsottaessa positiivisen z-akselin suunnasta kohti origoa, kiertyy xy taso vastapäivään kun kulmaparametri θ on positiivinen, katso kuva 3.6. Helposti nähdään, että edellisten matriisien käänteismatriisit saadaan vaihtamalla kiertokulman etumerkki vastakkaiseksi ja että esitetyt matriisit ovat ortogonaalisia. Animaatiosovelluksissa matriisien (3.6), (3.7) ja (3.8) tekemiä kiertoja kutsutaan x-, y- ja z- rullauksiksi (englanniksi x-roll, y-roll ja z-roll). On tärkeää muistaa, että edellä esitetyt kiertomatriisit eivät kommutoi. Kappaleen suunnistus, eli orientaatio, ilmaistaan Eulerin kulmien avulla soveltamalla edellisiä kolmea kiertoa peräkkäin. Edelliset kolme matriisia voidaan kertoa peräkkäin kuudessa eri järjestyksessä. Valitsemme kiertojärjestykseksi x-y-

110 104 LUKU 3. KOLMAS ULOTTUVUUS Kuva 3.5: Objektin kierto vastapäivään y-akselin ympäri matriisilla R y (θ), kiertokulma θ = 1. Kuva 3.6: Objektin kierto vastapäivään z-akselin ympäri matriisilla R z (θ), kiertokulma θ = 2.

111 3.2. KIERROT AVARUUDESSA R z, joten suunnistuksen antaa yleinen kiertomatriisi R(θ x,θ y,θ z ) = R z (θ z )R y (θ y )R x (θ x ). (3.9) Edellinen on aukikirjoitettuna c y c z s x s y c z c x s z c x s y c z + s x s z 0 R(θ x,θ y,θ z ) = c y s z c x c z + s x s y s z c x s y s z s x c z 0 s y s x c y c x c y 0, (3.10) missä ja c x = cosθ x, c y = cosθ y, c z = cosθ z (3.11) s x = sinθ x, s y = sinθ y, s z = sinθ z. (3.12) Eulerin kulmien käyttäminen kappaleen suunnistuksen parametrisointiin on kuitenkin hankalaa. Ensinnäkin käytännössä on vaikeaa löytää sopivat matriisin (3.10) kiertokulmat, joilla kappale kiertyy täsmälleen haluttuun asentoon. Toinen pulma liittyy kiertomatriisien interpolointiin. Tällaista tarvitaan, kun halutaan muodostaa animaatiokuvasarjoja, joissa on määritelty tietyt perusasennot ja tavoitteena on automaattisesti määritellä asentojen muuttuminen perusasennosta toiseen. Tällaiset ongelmat ovat peräisin siitä, että Eulerin kulmat ovat liian rikas asennon parametrisointi ja ne eivät huomio eri kiertojen vaikutusta toisiinsa. Huomautus: Joissakin lähdeteoksissa edellä Eulerin kulmiksi nimeämäämme asentoparametrisointia kutsutaan fixed angle tai fixed axis -parametrisoinniksi viitaten siihen, että kierrot esitetään kiinteän, globaalin koordinaatiston akselien ympäri. Tällöin Eulerin kulmaparametrisoinniksi kutsutaan esitystä, jossa objektin kierrot tehdään sen lokaalin koordinaatiston akselien ympäri. Nämä kaksi esitystapaa ovat kuitenkin käytännössä hyvin samankaltaisia. Tämän toteamiseksi oletetaan kappaleen asento ilmoitetuksi kiertokulmakolmikkona (α, β, γ) vastaavan kiertoakselijärjestyksen ollessa x-y-z objektin lokaalin koordinaatiston suhteen. Tämä tarkoittaa sitä, että objektia ensin kierretään sen lokaalin x-akselin ympäri kulman α verran ja sen perään edellisen kierron uuteen asentoon kiertämän y-akselin ympäri kulman β verran. Edellisen kahden kierron yhteisvaikutuksena lokaali z-akseli on tietenkin kiertynyt uuteen asemaan, ja viimeinen kierto kulmalla γ tehdään tämän kiertyneen akselin ympäri.

112 106 LUKU 3. KOLMAS ULOTTUVUUS Esitetään tämä käyttäen nyt kiertoja globaalin koordinaatiston akselin ympäri, olettaen, että alkutilanteessa objekti on asemoitu siten, että sen lokaali koordinaatisto yhtyy globaaliin koordinaatistoon. Ensiksi objektia kierretään siis lokaalin (samalla globaalin) x-akselin ympäri kierrolla R x (α). Seuraavaksi objektia kierretään lokaalin y-akselin ympäri. Tämä voidaan esittää ensin peruuttamalla ensimmäinen x-kierto, jolloin koordinaatistot jälleen yhtyvät, tekemällä seuraavaksi haluttu y-kierto (nyt globaalin y-akselin ympäri) ja soveltamalla tulokseen alkuperäistä x-kiertoa. Yhteismuunnos on R x (α)r y (β)r x ( α)r x (α) = R x (α)r y (β). (3.13) Kolmas kierto lokaalin kahdesti kierretyn z-akselin ympäri voidaan samaan tapaan esittää kiertona globaalin z-akselin ympäri perumalla ensin kaksi ensimmäistä kiertoa, kiertämällä globaalin z-akselin ympäri ja palauttamalla tilanne ennalleen kahdella ensimmäisellä kierrolla, saamme esityksen R x (α)r y (β)r z (γ)r x ( α)r y ( β)r y (β)r x (α) = R x (α)r y (β)r z (γ). (3.14) Tämä tarkoittaa sitä, että asennon parametrisointi järjestyksessä tehtyinä kiertoina lokaalien akselien ympäri on yhtäpitävää tässä dokumentissa Eulerin kulmiksi nimetyn parametrisoinnin kanssa, kunhan kierrot globaalien akselien ympäri tehdään samoin kiertokulmin, mutta käänteisessä järjestyksessä. Tämänkaltaisten asentoparametrisointien eräs ongelma on niin kutsuttu gimbal lock -ilmiö Gimbal lock -ilmiö Gimbal on englannin kielinen sana, joka tarkoittaa mekanismia, joka sallii siihen kiinnitetyn kappaleen kääntyä vapaasti mihin tahansa asentoon. Tällaiset mekanismit koostuvat yleensä kolmesta sisäkkäisestä toisiinsa sopivasti laakeroidusta rengaskehikosta, ja niitä käytetään hyrräkompasseissa ja gyroskoopeissa. Tietyillä tavoin asemoituna mekanismista kuitenkin katoaa yksi vapausaste. Tätä tilannetta kutsutaan gimbal lock -ilmiöksi. Vastaava vapausasteen katoaminen saattaa tapahtua Eulerin kulmia käytettäessä. Käyttämämme kiertojärjestyshän oli x-y-z-järjestys. Olkoon esimerkkiobjektina kuvassa 3.7 esitetty tyylitelty i-kirjain, jonka peruspiste on siirretty z-akselille pisteeseen (0,0,1). Sovelletaan siihen peräkkäin kiertoja. Olkoon ensimmäisen eli x-kierron kiertokulma θ x, kuvan 3.8 esimerkissä θ x = 1. Antakoon sitten käyttäjä (tietämättömyyttään) y-kierron kiertokulmaksi θ y = π/2, jolloin kahden ensimmäisen kierron yhteisvaikutuksena olem-

113 3.2. KIERROT AVARUUDESSA R Kuva 3.7: Gimbal lock: Objekti alkuasennossaan. Kuva 3.8: Gimbal lock: Tilanne kun on suoritettu x-kierto kulmalla θ x = 1.

114 108 LUKU 3. KOLMAS ULOTTUVUUS Kuva 3.9: Gimbal lock: Tilanne kun on suoritettu y-kierto kulmalla θ y = π 2. Kuva 3.10: Gimbal lock: Viimeinen z-kierto kulmalla θ z = θ x ainoastaan kumoaa alkuperäisen x-kierron.

115 3.2. KIERROT AVARUUDESSA R me kuvan 3.9 tilanteessa. Nyt osoittautuu, että viimeinen z-kierto vaikuttaa lopputulokseen täsmälleen päinvastoin kuin ensimmäinen x-kierto, erityisesti valitsemalla θ z = θ x viimeinen kierto kumoaa ensimmäisen kierron vaikutuksen, katso kuva Yleisemmin nähdään, että valitessamme y-kierron kulman kuten yllä, minkä tahansa viimeisen vaiheen z-kierron vaikutus saavutetaan jo ensimmäisellä x-kierrolla. Tämä nähdään suoraan myös tarkastelemalla edellisin kiertokulmin parametrisoitua matriisia (3.10). Nythän c y = 0 ja s y = 1, joten 0 s x c z c x s z c x c z + s x s z 0 R(θ x,π/2,θ z ) = 0 c x c z + s x s z c x s z s x c z sin(θ x θ z ) cos(θ x θ z ) 0 = 0 cos(θ x θ z ) sin(θ x θ z ) = R y (π/2)r x (θ x θ z ). (3.15) Edellä havaittu vapausasteen katoaminen johtuu Eulerin kulmaparametrisoinnin siitä puutteesta, että x-, y- ja z-kierrot eivät ole toisistaan riippumattomia. Tämä taas saattaa aiheuttaa edellä havaitun ilmiön missä kaksi kulmaparametria kuvaavatkin itse asiassa samaa suuntavapausastetta. Tämä tarkoittaa myös sitä, että sama kierto-operaatio voidaan esittää usealla eri tavalla Eulerin kulmien avulla. Äskeisessä esimerkissähän näytimme, että esimerkiksi R(θ x,π/2,θ z ) = R(θ x θ z,π/2,0), (3.16) eli suunnistuksen parametrisointi Eulerin kulmien avulla aiheuttaa käyttäjälle mitä ilmeisimmin hankaluuksia Orientaatiosta toiseen siirtyminen Olkoon Eulerin kulmien avulla määritetty kaksi kappaleen orientaatiota. Näitä kuvatkoon kiertomatriisit R 1 = R(θ 1 x,θ 1 y,θ 1 z ) ja R 2 = R(θ 2 x,θ 2 y,θ 2 z ), jotka on muodostettu saman peruskoordinaatiston suhteen (esimerkiksi primitiiviobjektin mallituskoordinaatiston suhteen). Koska kiertomatriisit ovat ortogonaalisia, saamme muodostettua niiden käänteismatriisit transponoimalla ne. Tämän voi myös nähdä

116 110 LUKU 3. KOLMAS ULOTTUVUUS suoralla laskulla, esimerkiksi R 1 1 saadaan seuraavasti R 1 1 = (R z (θ 1 z )R y (θ 1 y )R x (θ 1 x )) 1 = R x (θ 1 x ) 1 R y (θ 1 y ) 1 R z (θ 1 z ) 1 = R x ( θ 1 x )R y ( θ 1 y )R z ( θ 1 z ) = R x (θ 1 x ) T R y (θ 1 y ) T R z (θ 1 z ) T = (R z (θ 1 z )R y (θ 1 y )R x (θ 1 x )) T = R T 1. (3.17) Nyt ensimmäisestä orientaatiosta toiseen siirrytään kertomalla objektin pisteet matriisilla R 2 R T 1. Päinvastaisen operaation tekee matriisi R 1R T 2. Eli näissä muunnoksissa ensin kuvataan lähtöorientaatio peruskoordinaatistoon perusorientaatioksi ja sen jälkeen saatetaan kappale perusorientaatiosta uuteen orientaatioon, eli ikään kuin kuljetetaan kappale peruskoordinaatiston kautta uuteen asentoon. Käytännössä yleensä kannattaa kertoa matriisit ensiksi keskenään uudeksi matriisiksi, R 12 = R 2 R T 1 tai R 21 = R 1 R T 2, ja kertoa objektin kärkipisteet tuloksena saadulla matriisilla. Kumpikin matriiseista R 12 ja R 21 ovat kiertomatriiseja. Tämä tulos tunnetaan Eulerin lauseena, joka sanoo, että kaksi peräkkäistä kierto-operaatiota voidaan esittää yhtenä kiertona, joka kiertää kappaleen suoraan alkuasennosta loppuasentoon Yleinen kiertomatriisi Pyritään seuraavaksi määräämään kappaleen orientaatio kiertona annetun yksikkövektorin n = (n 1,n 2,n 3 ) T ympäri annetun kulman θ verran. Kierto parametrisoidaan, analogisesti aiempien kiertomatriisien kanssa, siten, että katsottaessa kohti origoa vektorin n suunnasta, kiertyy vektoria n vastaan kohtisuora taso vastapäivään kiertoakselinaan n, jos θ > 0. Haluamamme kierto ja käytettävät merkinnät on esitetty kuvassa Paria (θ, n) nimitetään kulmasiirtymäksi (englanniksi angular displacement). Pyritään seuraavaksi johtamaan kiertomatriisi R(θ, n) (tällä kertaa siis parametrisoituna kiertokulmalla ja -akselilla), joka tekee vaaditun avaruuden kierron. Tätä varten tutkimme, kuinka mielivaltainen vektori x kuvautuu kyseisessä kierrossa vektoriksi R(θ, n) x. Kierto voidaan määrätä esittämällä vektori x summana kahdesta vektorista x = x + x, missä x on vektorin x projektio vektorin n suuntaiselle suoralle, x = ( n, x) n, (3.18) ja x on vektoria n vastaan kohtisuorassa: x = x ( n, x) n. (3.19)

117 3.2. KIERROT AVARUUDESSA R vektori n vektori y vektori x vektori R(θ, n) x vektori R(θ, n) x vektori x vektori x Kuva 3.11: Vektori x kiertyy akselinaan yksikkövektori n kulman θ verran vektoriksi R(θ, n) x: Käytettävät merkinnät.

118 112 LUKU 3. KOLMAS ULOTTUVUUS vektori y θ vektori x vektori R(θ, n) x Kuva 3.12: Vektori R(θ, n) x voidaan lausua muodossa R(θ, n) x = (cosθ) x + (sinθ) y.

119 3.2. KIERROT AVARUUDESSA R Selvästikin R(θ, n) x = R(θ, n)( x + x ) = x + R(θ, n) x, (3.20) koska toivottu kiertomatriisi kiertää avaruutta vektorin n ympäri ja x on yhdensuuntainen vektorin n kanssa. Jotta voisimme konstruoida kiertomatriisin, esittelemme vektorin y, joka on kohtisuorassa sekä vektoria n, että vektoria x vastaan. Tämä saadaan ristitulona y = n x. (3.21) Huomaa, että samalla on voimassa y = n x, sillä n x = n x + n x = 0 + n x = n x, (3.22) koska yhdensuuntaisten (ja samalla lineaarisesti riippuvien vektoreiden) n ja x ristitulo on nollavektori. Lisäksi on voimassa y = x, koska n oletettiin yksikkövektoriksi. Täten kaikki kolme vektoria x, y ja kiertynyt vektoria n vastaan kohtisuora komponentti R(θ, n) x ovat saman x -säteisen ympyrän kehällä ja R(θ, n) x voidaan lausua kombinaationa R(θ, n) x = (cosθ) x + (sinθ) y, (3.23) katso kuva Tästä saamme lausekkeen kiertyneelle vektorille: R(θ, n) x =R(θ, n) x + R(θ, n) x =R(θ, n) x + (cosθ) x + (sinθ) y =( n, x) n + cosθ( x ( n, x) n) + (sinθ) n x =(cosθ) x + (1 cosθ)( n, x) n + (sinθ) n x x 1 cosθ + (n 1 x 1 + n 2 x 2 + n 3 x 3 )n 1 (1 cosθ) + (n 2 x 3 n 3 x 2 )sinθ = x 2 cosθ + (n 1 x 1 + n 2 x 2 + n 3 x 3 )n 2 (1 cosθ) + (n 3 x 1 n 1 x 3 )sinθ, x 3 cosθ + (n 1 x 1 + n 2 x 2 + n 3 x 3 )n 3 (1 cosθ) + (n 1 x 2 n 2 x 1 )sinθ (3.24) josta saamme esiin matriisin R(θ, n) = cosθ + n 2 1 (1 cosθ) n 1n 2 (1 cosθ) n 3 sinθ n 1 n 3 (1 cosθ) + n 2 sinθ n 1 n 2 (1 cosθ) + n 3 sinθ cosθ + n 2 2 (1 cosθ) n 2n 3 (1 cosθ) n 1 sinθ. n 1 n 3 (1 cosθ) n 2 sinθ n 2 n 3 (1 cosθ) + n 1 sinθ cosθ + n 2 3 (1 cosθ) (3.25)

120 114 LUKU 3. KOLMAS ULOTTUVUUS Vastaava homogeenisissa koordinaateissa operoiva kiertomatriisi R h (θ, n) saadaan laajentamalla matriisi R(θ, n) 4 4-matriisiksi asettamalla viimeisiksi rivija sarakevektoreiksi e T 4 ja e 4: R h (θ, n) = ( ) R(θ, n) T, missä 0 T 3 = (0 0 0) T R 3. (3.26) 3 1 Nyt on helppoa nähdä, että saamme matriisista (3.26) erikoistapauksina Eulerin kulmia vastaavat kiertomatriisit. Matriisi (3.6) saadaan valitsemalla yllä olevassa n = (1 0 0) T. Matriisit (3.7) ja (3.8) puolestaan saadaan valinnoilla n = (0 1 0) T ja n = (0 0 1) T. Huomautettakoon lopuksi, että on voimassa R h (θ, n) = R h ( θ, n), (3.27) eli kierto akselin n ympäri vastapäivään (myötäpäivään) on sama asia kuin kierto akselin n ympäri myötäpäivään (vastapäivään). 3.3 Kiertojen laskuoppi ja interpolointi, kvaterniot Kiertomatriisien interpolointi on tärkeää muodostettaessa animaatiokuvasarjoja, joissa esiintyy kappaleita, jotka voivat kierähdellä eri asentoihin. Niin kutsutussa avainkuva-animaatiossa animaattori määrittelee vain tietyt avainasennot, joiden kautta kappaleen tulee pyörähdellessään kulkea. Kappaleen suunnistuksen avainasennoissa määräävät niihin liittyvät kiertomatriisit. Tavoitteena on määritellä jouhevat väliasennot eri avainasentojen välisille ajanhetkille. Olkoon annettuna objekti kahdessa avainasennossaan ajanhetkinä t 0 ja t 1 ja kuvatkoon animoitavan kappaleen kumpaakin avainasentoa oma annettu kiertomatriisinsa, alkuhetkeä matriisi R(t 0 ) ja loppuhetkeä R(t 1 ). On siis löydettävä luontevat kiertomatriisit R(t) ajanhetkillä t 0 <= t <= t 1, eli on kyettävä interpoloimaan annettuja kiertomatriiseja. Huomautus: Selvästikin väärä tapa interpoloida kiertoja R(t 0 ) ja R(t 1 ) on kiertomatriisien lineaarinen interpolointi alkioittain, jolloin kiertomatriisi R(t) laskettaisiin kaavalla R(t) = (t 1 t)r(t 0 ) + (t t 0 )R(t 1 ) t 1 t 0. (3.28) Tästä esimerkkinä olkoon vaikka tilanne, jossa R(t 0 ) = R z (π/2) ja R(t 1 ) = R z ( π/2). Laskettaessa kaavan (3.28) avulla interpolantti ajanhetkellä t = (t 0 +t 1 )/2, saam-

121 3.3. KIERTOJEN LASKUOPPI JA INTERPOLOINTI, KVATERNIOT 115 me R((t 0 +t 1 )/2) = 1 2 (R z(π/2) + R z ( π/2)) = , (3.29) mikä ei missään tapauksessa esitä kiertoa avaruudessa R 3, koska esimerkiksi sen kaikki sarakevektorit eivät ole yksikkövektoreita. Tässäkin interpolointitehtävässä Eulerin kulmien avulla parametrisoidut kappaleen asennot tuottavat ongelmia, lähinnä gimbal lock -ilmiön takia. Toimivampi tekniikka on interpoloida kulmasiirtymiä, jolloin ilmiötä ei esiinny Kulmasiirtymien interpolointi Esittäköön kulmasiirtymät (θ 1, n 1 ) ja (θ 2, n 2 ) objektin annettuja alku- ja loppuorientaatiota. Interpoloidaan kulmasiirtymiä siten, että kiertoakseli ja kiertokulma interpoloidaan erikseen. Kiertokulma hetkellä 0 t 1 saadaan yksinkertaisimmin lineaarisena interpolaationa kulmista θ 1 ja θ 2 : θ t = (1 t)θ 1 +tθ 2. (3.30) Kiertoakseli n t vastaavalla ajanhetkellä saadaan kiertämällä akselia n 1 sopiva määrä kohti akselia n 2. Tämä kierto tehdään sellaisen akselin r ympäri, joka on kohtisuorassa sekä akselia n 1 että akselia n 2 vastaan. Ristitulovektori n 1 n 2 on tietenkin haluamamme kiertoakselin suuntainen vektori. Se ei kuitenkaan ole välttämättä yksikkövektori, joten kiertoakseli olkoon yksikkövektoriksi skaalattu ristitulovektori r = ( n 1 n 2 )/ n 1 n 2. (3.31) Kiertokulman määräämiseksi lasketaan ensin vektorien n 1 ja n 2 välinen kulma Interpoloitu kulmasiirtymä hetkellä 0 t 1 on siis ψ = acos( n 1, n 2 ). (3.32) ((1 t)θ 1 +tθ 2,R(tψ, r) n 1 ), (3.33) ja orientaatiota vastaava homogeenisissa koordinaateissa operoiva kiertomatriisi saadaan muodostettua kaavoin (3.25) ja (3.26), katso kuva 3.13.

122 116 LUKU 3. KOLMAS ULOTTUVUUS θ 2 (1 t)θ 1 +tθ 2 n 2 R(tψ, r) n 1 tψ ψ n 1 θ 1 n n 2 r = ( n 1 n 2 )/ n 1 n 2 Kuva 3.13: Kulmasiirtymien (θ 1, n 1 ) ja (θ 2, n 2 ) interpolointi Huomautus: Kaava (3.33) toimii oikein myös sellaisessa tapauksessa missä alkuperäisten interpoloitavien kulmasiirtymien kiertoakselit ovat samat eli n 1 = n 2. Tällöin niiden välinen kulma on ψ = 0 ja kiertoakseliksi r saadaan r = 0. Kaavan (3.25) mukaan on R(0, 0) = I, joten interpoloidun kulmasiirtymän lauseke (3.33) supistuu muotoon ((1 t)θ 1 +tθ 2, n 1 ). Kulmasiirtymäparametrisointia ei voi helposti soveltaa useiden kiertojen yhteisvaikutuksen määräämiseen (t.s. on hankalaa löytää se yksi kulmasiirtymä, joka vastaa useiden peräkkäisten kulmasiirtymien yhdistämistä. Tällainen kulmasiirtymä on kuitenkin Eulerin lauseen mukaan olemassa). Kaikki kulmasiirtymäparametrisoinnin sisältämä informaatio voidaan kuitenkin esittää toisessa muodossa, jossa kaikki edellä mainitut operaatiot on helppo toteuttaa. Tämä esitys on niin kutsuttu kvaternioesitys.

123 3.3. KIERTOJEN LASKUOPPI JA INTERPOLOINTI, KVATERNIOT Kvaterniot Kvaterniot (engl. quaternion) ovat kompleksilukujen yleistyksiä, ja ne esitteli Sir William Hamilton 1840-luvulla. Tavalliset kompleksiluvut ovat, kuten on hyvin tunnettua, muotoa z = a + bi, a,b R, missä i on imaginaariyksikkö, jolle on tuttu laskusääntö i 2 = 1. Kvaterniot ovat puolestaan muotoa q = a + bi + c j + dk, a,b,c,d R (3.34) eli kvaterniot määritellään kolmen imaginaariyksikön i, j ja k avulla. Näille imaginaariyksikoille on seuraavat (melko sekavan näköiset) laskusäännöt: i 2 = j 2 = k 2 = 1, i j = k, ji = k, jk = i,k j = i, ki = j,ik = j. (3.35) Huomautus:Muistisääntönä voi ajatella imaginaariyksiköt järjestetyksi silmukaksi i j k i. Nyt kahden peräkkäisen imaginaariyksikön tulo on silmukassa seuraavana vastaan tuleva yksikkö. Jos silmukkaa joudutaan kiertämään takaperin, pitää vastaantuleva imaginaariyksikkö vaihtaa negatiiviseksi. Usein matemaattisessa kirjallisuudessa merkitään euklidisen avaruuden R 3 tavallisia kantavektoreita symboleilla i, j ja k. Samaistamalle imaginaariyksiköt i, j ja k näiksi kantavektoreiksi ja samaistamalla imaginaariyksiköiden tulo vastaavien kantavektoreiden ristituloksi, saamme analogiset laskusäännöt eri imaginaariyksiköiden tuloille. Yleensä kvaternioille käytetään lyhennysmerkintää q = (s, v) = s + v 1 i + v 2 j + v 3 k, (3.36) ja skalaaria s R ja vektoria v = (v 1,v 2,v 3 ) T R 3 kutsutaan kvaternion skalaarija vektoriosaksi. Huomioiden aiemmin esitetyt imaginaariyksikköjen laskusäännöt, on helppoa johtaa lauseke kahden kvaternion kertolaskulle: Olkoon q 1 = (s 1, v 1 ) ja q 2 = (s 2, v 2 ) annettuja, q 1 q 2 = (s 1 s 2 ( v 1, v 2 ),s 1 v 2 + s 2 v 1 + v 1 v 2 ) = (s 3, v 3 ) = q 3, (3.37)

124 118 LUKU 3. KOLMAS ULOTTUVUUS eli kahden kvaternion tulo on kvaternio. Tämän todentaminen jätetään kotitehtäväksi (Vihje: Tee kertolasku aivan kuin kertoisit polynomeja keskenään. Tällä kertaa muuttujina on tuttujen x:n y:n ja z:n sijasta kvaternion kolme imaginaariyksikkoa; sovella siis lopputulokseen niiden laskusääntöjä ja kokoa termit.) Lisäksi kaavasta (3.37) saamme lausekkeen reaaliluvulla α kerrotulle kvaterniolle q 2 = (s 2, v 2 ): Kun sijoitetaan q 1 = (α, 0), niin saadaan α q 2 = (α, 0)(s 2, v 2 ) = (αs 2,α v 2 ). (3.38) Huomaa, että kvaternioiden kertolasku ei kommutoi, eli yleensä q 1 q 2 q 2 q 1. Tämä johtuu niiden tulokaavassa (3.37) esiintyvästä ristitulosta, sehän vaihtaa etumerkkiä jos kerrottavien vektoreiden järjestys vaihtuu. Kvaterniotulolle on kuitenkin voimassa (q 1 q 2 )q 3 = q 1 (q 2 q 3 ). (3.39) Kuten kompleksiluvulle on kvaterniolle olemassa liittokvaternio, eli konjugaatti. Tämä määritellään ja merkitään analogisesti kompleksilukujen kanssa: q = (s, v), q = (s, v). (3.40) Kvaternion q pituuden neliö saadaan kertomalla se liittokvaterniollaan (kompleksiluvun pituuden neliö saatiin kertomalla luku liittoluvullaan): q 2 = q q = (s 2 +( v, v),s v s v v v) = (s 2 + v 2, 0) = s 2 + v 2 R, (3.41) ja yksikkökvaternioksi sanotaan sellaista kvaterniota q, jolle q = 1. Lisäksi kvaterniotulolle ja konjugoinnille on voimassa (q 1 q 2 ) = q 2 q 1. (3.42) Nyt pääsemme kvaternioiden ja R 3 :n kiertojen yhteyteen. Olkoon annettu niin kutsuttu puhdas kvaternio (engl. pure quaternion) p, jonka skalaariosa on 0, p = (0, x), ja yksikkökvaternio q = (s, v). Tällöin Määritellään seuraavaksi kvaternio q q = 1 q 1 = q. (3.43) R q (p) = qpq 1 = qp q, (3.44)

125 3.3. KIERTOJEN LASKUOPPI JA INTERPOLOINTI, KVATERNIOT 119 ja lasketaan sen lauseke auki käyttäen kertolaskun määritelmää, saadaan R q (p) =(qp) q = ( ( v, x),s x + v x)(s, v) =( s( v, x) + s( x, v) + ( v x, v), ( v, x) v + s 2 x + s v x s x v ( v x) v) =(0,s 2 x + 2s v x + ( v, x) v ( v x) v) =(0,s 2 x + 2s v x + 2( v, x) v ( v, v) x) =(0,(s 2 ( v, v)) x + 2( v, x) v + 2s v x). (3.45) Edellä käytimme apunamme identiteettiä ( x, z) y ( y, z) x = ( x y) z. Tämä sievenee edelleen, kun havaitaan että mikä tahansa yksikkökvaternio q voidaan esittää muodossa q = (cosθ,(sinθ) n), (3.46) joillekin θ R ja n R 3 jolle pätee n = 1. Tällöin selvästi q 2 = cos 2 θ + (sinθ) n 2 = cos 2 θ + sin 2 θ n 2 = 1. (3.47) Käyttäen esitystä (3.46), kaava (3.45) muokkautuu muotoon R q (p) = (0,(cos 2 θ sin 2 θ( n, n)) x + 2sin 2 θ( n, x) n + 2cosθ sinθ n x) = (0,cos2θ x + (1 cos2θ)( n, x) n + sin2θ n x). (3.48) Kun nyt vertaamme yllä saatua lauseketta puhtaan kvaternion R q (p) vektoriosalle kaavaan (3.24), huomaamme että ne ovat samoja lukuunottamatta kiertokulmaa θ. Minkälaisen johtopäätöksen voimme tästä tehdä? Sellaisen, että vektorin x R 3 kierto kulmasiirtymän (θ, n) määräämänä on sama asia kuin kvaterniotulo qp q, missä yksikkökvaternio q muodostetaan kulmasiirtymästä kaavalla ja puhtaaksi kvaternioksi p valitaan q = (cosθ/2,(sinθ/2) n) (3.49) p = (0, x). (3.50) Kulmasiirtymällä (θ, n) kierretty vektori x saadaan nyt puhtaan kvaternion qp q vektoriosana.

126 120 LUKU 3. KOLMAS ULOTTUVUUS Näin ollen, voimme samaistaa yleisen kulmasiirtymän (θ, n) yksikkökvaternioksi q = cosθ/2 + (sinθ/2)n 1 i + (sinθ/2)n 2 j + (sinθ/2)n 3 k, (3.51) ja soveltaa sitä annettuun vektoriin kvaterniotulon avulla, kuten edellä esitettiin. Tässä on Eulerin kulmaparametrisoinnin tavoin kolme vapausastetta, koska vektori n oletettiin yksikkövektoriksi, joten sen komponentteja rajoittaa ehto n n n2 3 = 1. Tämä vaikuttaa kuitenkin huomattavan monimutkaiselta tavalta kiertää vektoreita annetulla kulmasiirtymällä. Kvaternioesityksellä on kuitenkin etunsa. Jos otamme kaksi yksikkökvaterniota q 1 ja q 2, on niiden tulo q 1 q 2 myös yksikkökvaternio. Tämä nähdään suoraviivaisella laskulla: Olkoon q 1 = (s 1, v 1 ) ja q 2 = (s 2, v 2 ) ja q = q 1 q 2, joten Tällöin q = (s, v), missä s = s 1 s 2 ( v 1, v 2 ), v = s 1 v 2 + s 2 v 1 + v 1 v 2. (3.52) q 1 q 2 2 = q 2 = s 2 + v 2 =s 2 1s 2 2 2s 1 s 2 ( v 1, v 2 ) + ( v 1, v 2 ) 2 + (s 1 v 2 + s 2 v 1 + v 1 v 2,s 1 v 2 + s 2 v 1 + v 1 v 2 ) =s 2 1s 2 2 2s 1 s 2 ( v 1, v 2 ) + ( v 1, v 2 ) 2 + s 2 1 v s 1 s 2 ( v 1, v 2 ) + s 1 ( v 2, v 1 v 2 ) + s 1 s 2 ( v 1, v 2 ) + s 2 2 v s 2 ( v 1, v 1 v 2 ) + s 1 ( v 2, v 1 v 2 ) + s 2 ( v 1, v 1 v 2 ) + v 1 v 2 2 =s 2 1s s 2 1 v s 2 2 v ( v 1, v 2 ) 2 + v 1 v 2 2 =(s v 1 2 )(s v 2 2 ) = q 1 2 q 2 2. (3.53) Edellä viimeisessä vaiheessa käytettiin tulosta ( x, y) 2 + x y 2 = x 2 y 2. Saimme siis näytettyä, että q 1 q 2 = q 1 q 2, joten yksikkökvaternioiden tulo on myös yksikkökvaternio. Tärkeintä on se seikka, että tuloksena saatavaa yksikkökvaterniota vastaava kierto-operaatio on täsmälleen se kierto, joka vastaa kerrottavia kvaternioita vastaavien kiertojen tekemistä peräkkäin. Eli kvaternioiden kertolaskuun on sisäänrakennettuna Eulerin lause peräkkäisten kiertojen esittämisestä yhtenä kiertona. Olkoon nyt q 1 = (cosθ 1 /2,(sinθ 1 /2) n 1 ), q 2 = (cosθ 2 /2,(sinθ 2 /2) n 2 ) (3.54)

127 3.3. KIERTOJEN LASKUOPPI JA INTERPOLOINTI, KVATERNIOT 121 kulmasiirtymiin (θ 1, n 1 ) ja (θ 2, n 2 ) liittyvät kvaterniot ja olkoon p = (0, x) puhdas kvaternio, jonka vektoriosaksi olemme asettaneet kierrettävän vektorin. Tällöinhan puhtan kvaternion p 1 = q 1 p q 1 (3.55) vektoriosa on se vektori, joka saadaan kertomalla vektori x vasemmalta kulmasiirtymää (θ 1, n 1 ) vastaavalla kiertomatriisilla R(θ 1, n 1 ). Kierretään tuloksena saatua vektoria uudelleen, tällä kertaa kulmasiirtymän (θ 2, n 2 ) määräämänä. Tämä voidaan tehdä uudella kvaterniotulolla Mutta nythän p 2 = q 2 p 1 q 2. (3.56) p 2 = q 2 p 1 q 2 = q 2 q 1 p q 1 q 2 = qp q, (3.57) missä kvaternio q on kvaternioiden q 2 ja q 1 tulo, eli q = q 2 q 1. Kvaternio q siis efektiivisesti kiertää vektoria ensin ensimmäisellä kulmasiirtymällä ja sen jälkeen toisella kulmasiirtymällä. Tulokvaternio q liittyy kuitenkin vain yhteen kulmasiirtymään; tämä on se Eulerin lauseen mukainen kierto/kulmasiirtymä, joka kiertää vektorin alkuasennosta loppuasentoon. Sovelletaan tätä tulosta seuraavassa esimerkissä. Selvästi yksikkökvaternio (cos(π/2),sin(π/2)(1,0,0) T ) = (0,(1,0,0) T ). (3.58) vastaa x-kiertoa kulmalla π. Vastaavasti yksikkökvaterniot (0,(0,1,0) T ) ja (0,(0,0,1) T ) esittävät y-ja z-kiertoja kulmalla π. Jos ensin suoritetaan y-kierto kulmalla π ja sen jälkeen z-kierto kulmalla π, vastaa tätä yhteisoperaatiota yksikkökvaternio (0,(0,0,1) T )(0,(0,1,0) T ) = (0,(0,0,1) T (0,1,0) T ) = (0,( 1,0,0) T ) = (cos( π/2),sin( π/2)(1,0,0) T ), (3.59) joka esittää x-kiertoa kulman π verran. Toisena esimerkkinä suoritetaan ensin x-kierto kulmalla π/2 ja sen perään y- kierto myös kulmalla π/2. Näitä kiertoja vastaa yksikkökvaterniot (cos(π/4),sin(π/4)(1,0,0) T ) = ( 1 2, 1 2 (1,0,0) T ) ja (cos(π/4),sin(π/4)(0,1,0) T ) = ( 1 2, 1 2 (0,1,0) T ).

128 122 LUKU 3. KOLMAS ULOTTUVUUS Kerrotaan ne keskenään, saadaan ( )( ) 1 2, (0,1,0) T 2, 1 2 (1,0,0) T ( 1 = 2, 1 2 (1,0,0)T (0,1,0)T + 1 ) 2 (0,0, 1)T ( ( = 2, 1 3,, 1 ) ) ( T = cos π ,sin π ( 1 3 3, 1 3, 1 ) ) T. 3 (3.60) Näin ollen tuloksena saamme kierron kulmalla 2π/3 sen suoran ympäri, joka on vektorin (1/ 3,1/ 3, 1/ 3) T kanssa yhdensuuntainen Yksikkökvaterniota vastaavan kiertomatriisin muodostaminen Kuten jo aiemmin havaitsimme, vastaa kvaterniotulo (cos(θ/2), sin(θ/2) n)(0, x)(cos(θ/2), sin(θ/2) n) homogeenisen koordinaattivektorin (x 1,x 2,x 3,1) T kertomista vasemmalta matriisilla R h (θ, n), joka on aukikirjoitettuna kaavoissa (3.25) ja (3.26). Jatkossa interpoloimme kiertomatriiseja interpoloimalla niitä vastaavia yksikkökvaternioita R 4 :n yksikköpallon isoympyröitä pitkin, joten ohjelmoinnin kannalta on hyödyllistä, jos kiertomatriisin alkiot voidaan esittää suoraan kvaternion komponenttien avulla. Otetaan käyttöön lyhennysmerkintä: (s,(v 1,v 2,v 3 ) T ) = (cos(θ/2),(sin(θ/2)n 1,sin(θ/2)n 2,sin(θ/2)n 3 ) T ). Nyt kiertomatriisi (3.26) voidaan esittää muodossa 1 2(v v2 3 ) 2(v 1v 2 sv 3 ) 2(v 1 v 3 + sv 2 ) 0 R h (θ, n) = 2(v 1 v 2 + sv 3 ) 1 2(v v2 3 ) 2(v 2v 3 sv 1 ) 0 2(v 1 v 3 sv 2 ) 2(v 2 v 3 + sv 1 ) 1 2(v v2 2 ) 0. (3.61) Matriisit (3.61) ja (3.26) ovat todellakin samat. Esimerkiksi tutkitaan toista diagonaalialkiota: 1 2(v v 2 3) = 1 2(n n 2 3)sin 2 (θ/2) = 1 2(1 n 2 2)(1/2 1/2cos(θ)) = 1 (1 n 2 2)(1 cos(θ)) = cosθ + n 2 2(1 cosθ), (3.62)

129 3.3. KIERTOJEN LASKUOPPI JA INTERPOLOINTI, KVATERNIOT 123 ja kolmannen rivin ensimmäistä alkiota: 2(v 1 v 3 sv 2 ) = 2(n 1 n 3 sin 2 (θ/2) n 2 cos(θ/2)sin(θ/2)) = 2(n 1 n 3 (1/2 1/2cos(θ)) n 2 /2sin(θ)) = n 1 n 3 (1 cos(θ)) n 2 sin(θ). (3.63) Kiertomatriisia vastaavan yksikkökvaternion muodostaminen Olkoon annettu mielivaltainen homogeenisissa koordinaateissa operoiva kiertomatriisi m 11 m 12 m 13 0 M = m 21 m 22 m 23 0 m 31 m 32 m 33 0, (3.64) ja haluamme määritellä sitä vastaavan yksikkökvaternion (s, v). Ensimmäinen tehtävämme on laskea matriisin M jälki, eli sen diagonaalialkioiden summa t = 1 + m 11 + m 22 + m 33. Kaavan (3.61) perusteella tiedämme, että täytyy olla t = (v v 2 3) + 1 2(v v 2 3) + 1 2(v v 2 2) = 4 4(v v v 2 3). (3.65) Koska M on kiertomatriisi, olemme hakemassa yksikkökvaterniota, joten täytyy olla voimassa s 2 + v v v 2 3 = 1, (3.66) mikä johtaa yhtälöön t = 4 4(v v v 2 3) = 4 4(1 s 2 ) = 4s 2. (3.67) Tästä saamme ratkaistua kvaternion skalaariosan: s = 1 2 t. (3.68) Kvaternion vektoriosa löydetään matriisin M symmetria-alkioiden avulla. Alkio v 1 voidaan lausua alkioiden m 23 ja m 32 avulla. Nyt selvästi (katso (3.61)) m 32 m 23 = 2(v 2 v 3 + sv 1 ) 2(v 2 v 3 sv 1 ) = 4sv 1, (3.69)

130 124 LUKU 3. KOLMAS ULOTTUVUUS joten Vastaavasti saamme v 1 = m 32 m 23. (3.70) 4s v 2 = m 13 m 31 4s, ja v 3 = m 21 m 12. (3.71) 4s Edellinen tekniikka ei toimi sellaisissa tapauksissa, joissa matriisin jälki on t = 0 (kuten on esimerkiksi matriisilla R x (π)). Tällöinhän eivät kaavat (3.70) ja (3.71) ole määriteltyjä. Tällöin kvaternion vektoriosan komponentit täytyy ratkaista muiden matriisialkioiden avulla muistaen samalla hyödyntää sitä, että haettava kvaternio on yksikkökvaternio. Oheinen aliohjelma huolehtii näistä erikoistapauksista Yksikkökvaternioiden interpolointi Kun nyt olemme saaneet esiteltyä kiertojen ja yksikkökvaternioiden välisen yhteyden, tutkimme seuraavaksi, kuinka yksikkökvaternioita interpoloidaan. Tavoitteenamme on soveltaa tätä tekniikkaa interpoloimaan kappaleen kahta eri asentoa kuvaavaa kiertomatriisia, jotta saamme muodostettua animaatiokuvasarjoja, joissa kappale pyörähtää miellyttävästi asennosta toiseen. Koska kiertomatriisit voidaan samaistaa yksikkökvaternioiksi, kuvaa avaruuden R 4 yksikköpallon pinta kaikkia mahdollisia avaruuden R 3 kiertomatriiseja. Täten on toivottavaa, että interpolointitekniikka antaa tuloksinaan yksikkökvaternioita, eli että kvaternioita interpoloivat käyrät kulkevat pitkin yksikköpallon pintaa. Siten tavallinen lineaarinen interpolointi ei kelpaa. Yksinkertaisin mahdollinen edellisen ehdon täyttävä interpolointitekniikka on kulkea tasapituisin askelin pallon pinnan pisteiden väli pitkin niitä yhdistävää isoympyrän kehää. Esittelemme tekniikan kaksiulotteisessa tapauksessa. Sama menetelmä toimii aivan samoin myös neliulotteisen pallon pinnalla. Olkoon annettu kaksi avaruuden R 2 yksikkövektoria a ja b. Olkoon niiden välinen kulma ψ, ja olkoon annettu kolmas yksikkövektori p siten että p:n ja a:n välinen kulma on θ, katso kuva Tavoitteena on lausua vektori p lineaarikombinaationa vektoreista a ja b muodossa p = α a + β b. (3.72) Mitkä ovat tässä tapauksessa reaalikertoimet α ja β? Ne voidaan ratkaista yhtälöistä p = 1, ( a, b) = cosψ, ( a, p) = cosθ. (3.73)

131 3.3. KIERTOJEN LASKUOPPI JA INTERPOLOINTI, KVATERNIOT 125 a p θ ψ b Kuva 3.14: Interpolointi isoympyrän kehällä, merkinnät. Lausutaan ensin kerroin α kertoimen β avulla: ( a, p) = α( a, a) + β( a, b) = α + β cosψ = cosθ α = cosθ β cosψ. (3.74) Koska täytyy olla p = 1, saamme p 2 = (α a + β b,α a + β b) = α 2 + 2αβ( a, b) + β 2 = α 2 + 2αβ cosψ + β 2 = 1. (3.75) Sijoittamalla tähän aiemmin laskemamme kertoimen α lausekkeen, saamme yhtälön josta voimme ratkaista kertoimen β: joten saamme ratkaisuksi β 2 (1 cos 2 ψ) + cos 2 θ = 1 β 2 = sin2 θ sin 2 ψ, (3.76) β = sinθ sinψ, cosθ sinψ sinθ cosψ sin(ψ θ) α = = sinψ sinψ, (3.77) ja vektori p on siis muotoa sin(ψ θ) sinθ p = a + sinψ sinψ b. (3.78) Tulkitaan seuraavaksi kvaterniot q 1 = (s 1, v 1 ) ja q 2 = (s 2, v 2 ) avaruuden R 4 vektoreiksi. Tällöin niiden välinen kulma saadaan R 4 :n sisätulon avulla: (q 1,q 2 ) =

132 126 LUKU 3. KOLMAS ULOTTUVUUS s 1 s 2 + ( v 1, v 2 ) = cosψ. Kvaternioita q 1 ja q 2 interpoloidaan kulmavälillä [0,ψ] yleistämällä edellä esitetty tekniikka neliulotteiseen avaruuteen ja korvaamalla kulma θ kulmalla uψ, missä u [0,1]. Saamme siis interpoloidun kvaternion q u kaavalla sin((1 u)ψ) q u = q 1 + sin(uψ) sinψ sinψ q 2 (3.79) Oheisen ohjelmalistauksen aliohjelma sphlint toteuttaa edellä esitetyn interpoloinnin huolehtien samalla erikoistapaukset, joissa interpoloitavat kvaterniot ovat hyvin lähellä toisiaan (nimittäjän sinilausekkeet menevät hyvin pieniksi) tai ne ovat samalla neliulotteisen yksikköpallon lävistäjällä pallon vastakkaisilla puolilla tai hyvin lähellä tällaista asemaa. On nimittäin vielä eräs seikka joka pitää muistaa huomioida. Jokaista kiertoa vastaakin täsmälleen kaksi yksikkökvaterniota q ja q. Tämä on melko loogista sillä tulkittaessa yksikkökvaterniota q kiertona havaitaan, että q = ( cosθ/2, (sinθ/2) n) = (cos(π θ/2),sin(π θ/2)( n)). (3.80) Tämähän tarkoittaa kiertoa kulman 2π θ verran akselina vektori n. Tämä on ekvivalentti operaatio sen kierron kanssa, jossa kierretään akselin n ympäri kulmalla θ. Esimerkkinä voi ajatella vaikkapa tilannetta, jossa yz-tasoa kierretään x-akselin ympäri vastapäivään katsottaessa positiivisen x-akselin suunnasta. Yhtä hyvin voisimme ajatella kiertävämme yz-tasoa myötäpäivään, kun katsomme negatiivisen x-akselin suunnasta. Selvästi havaitsemme myös, että on voimassa R q (p) = R q (p), (3.81) katso kaava (3.44). Toimiva keino on pyrkiä kulkemaan pitkin isoympyrän kaarta alkaen kvaterniosta q 1 kohti lähempää vaihtoehdoista q 2 ja q 2, jotka siis molemmat esittävät samaa kierto-operaatiota. Olkoon annettuna interpoloitavia kiertoja vastaavat kvaterniot q 1 ja q 2. Mitataan aluksi avaruuden R 4 sisätulon avulla etäisyydet q 1 q 2 2 = (q 1 q 2,q 1 q 2 ), q 1 ( q 2 ) 2 = (q 1 + q 2,q 1 + q 2 ), ja toimitaan seuraavasti: Jos q 1 q 2 2 q 1 ( q 2 ) 2, interpoloidaan kvaternioita q 1 ja q 2, muutoin interpoloidaan paria q 1, q 2. Esimerkkinä edellä esitetystä interpolointekniikasta tarkastellaan kuvaa Siinä on verrattu kvaterniointerpolointia ja Eulerin kulmien interpolointiin. Kierrettäviksi objekteiksi on valittu origokeskiset pallot, joiden pinnan ja positiivisen

133 3.3. KIERTOJEN LASKUOPPI JA INTERPOLOINTI, KVATERNIOT 127 z-akselin leikkauspisteeseen on sijoitettu tikkukirjaimin esitetyt numerot 3 ja 4. Lähtö- ja pääteasennot ovat molemmille samat. Eulerin kulmien avulla esitettynä alkuasentoja vastaa kiertomatriisi R(0, 0, 0). Pääteasennot antaa puolestaan matriisi R( 6/10,3/2,π/2). Pallon, johon on kiinnitetty numero 3, asennon määräävää kiertomatriisi saadaan interpoloimalla lineaarisesti Eulerin kulmia ja muodostamalla niitä vastaava matriisi: Parametrin t kulkiessa yli valin [0, 1], on kiertomatriisi R( 6t/10, 3t/2, πt/2). (3.82) Pallon, johon on kiinnitetty numero 4, asento määrätään laskemalla lähtö- ja pääteasentomatriiseja vastaavat yksikkökvaterniot, valitsemalla lyhin reitti ja interpoloimalla kvaterniot kaavalla (3.79). Kuten lopputuloksesta havaitaan, saattavat kvaterniotekniikan antamat väliasennot pallon selvästi jouhevammin lähtöasennosta pääteasentoon Ohjelmalistauksia /* quatlib.h */ #ifndef QUATLIB_H #define QUATLIB_H extern void quattomat(double *, double *); extern void mattoquat(double *, double *); extern void sphlint(double *, double *, double, double *); #endif /* quatlib.c */ #include "quatlib.h" #include <math.h> #define EPSILON 1e-15 #define DATA(A,i,j) (A)[((i)*4+(j))] void quattomat(double *q, double *mat) { double s, xs, ys, zs, wx, wy, wz, xx, xy, xz, yy, yz, zz; s=2.0/(q[0]*q[0] + q[1]*q[1] + q[2]*q[2] + q[3]*q[3]); xs = q[0]*s; ys = q[1]*s; zs = q[2]*s; wx = q[3]*xs; wy = q[3]*ys; wz = q[3]*zs;

134 128 LUKU 3. KOLMAS ULOTTUVUUS Kuva 3.15: Kierron kvaterniointerpoloinnin ja Eulerin kulmien interpoloinnin vertailu

135 3.3. KIERTOJEN LASKUOPPI JA INTERPOLOINTI, KVATERNIOT 129 xx = q[0]*xs; xy = q[0]*ys; xz = q[0]*zs; yy = q[1]*ys; yz = q[1]*zs; zz = q[2]*zs; DATA(mat,0,0) = 1.0-(yy+zz); DATA(mat,0,1) = xy+wz; DATA(mat,0,2) = xz-wy; DATA(mat,1,0) = xy-wz; DATA(mat,1,1) = 1.0-(xx+zz); DATA(mat,1,2) = yz+wx; } DATA(mat,2,0) = xz+wy; DATA(mat,2,1) = yz-wx; DATA(mat,2,2) = 1.0-(xx+yy); DATA(mat,0,3) = 0.0; DATA(mat,1,3) = 0.0; DATA(mat,2,3) = 0.0; DATA(mat,3,0) = 0.0; DATA(mat,3,1) = 0.0; DATA(mat,3,2) = 0.0; DATA(mat,3,3) = 1.0; void mattoquat(double *mat, double *q) { double tr, s; int i, j, k, nxt[3]={1,2,0}; tr = DATA(mat,0,0)+DATA(mat,1,1)+DATA(mat,2,2); if (tr > 0.0) { s=sqrt(tr+1.0); q[3] = 0.5*s; s = 0.5/s; q[0] = (DATA(mat,1,2)-DATA(mat,2,1))*s; q[1] = (DATA(mat,2,0)-DATA(mat,0,2))*s; q[2] = (DATA(mat,0,1)-DATA(mat,1,0))*s; } else { i=0; if (DATA(mat,1,1) > DATA(mat,0,0)) i = 1; if (DATA(mat,2,2) > DATA(mat,i,i)) i = 2; j = nxt[i]; k = nxt[j];

136 130 LUKU 3. KOLMAS ULOTTUVUUS } } s = sqrt(data(mat,i,i)-(data(mat,j,j)+data(mat,k,k))+1.0); q[i] = s*0.5; s = 0.5/s; q[3]=(data(mat,j,k)-data(mat,k,j))*s; q[j]=(data(mat,i,j)+data(mat,j,i))*s; q[k]=(data(mat,i,k)+data(mat,k,i))*s; void sphlint(double *p, double *q, double t, double *qt) { double psi, cospsi, sinpsi, sclp, sclq; int i; cospsi = p[0]*q[0]+p[1]*q[1]+p[2]*q[2]+p[3]*q[3]; if (1.0+cospsi > EPSILON) { if (1.0-cospsi > EPSILON) { psi = acos(cospsi); sinpsi = sin(psi); sclp = sin((1.0-t)*psi)/sinpsi; sclq = sin(t*psi)/sinpsi; } else { sclp = 1.0-t; sclq = t; } for (i=0;i<4;i++) qt[i] = sclp*p[i]+sclq*q[i]; } else { qt[0] = -q[0]; qt[1] = -q[1]; qt[2] = -q[2]; qt[3] = -q[3]; sclp = 1.0-t; sclq = t; for (i=0;i<3;i++) qt[i] = sclp*p[i]+sclq*q[i]; } } Esimerkki kiertojen soveltamisesta Tarkastellaan lopuksi yhtä esimerkkiä, jossa kiertomatriisien hallinta on tärkeää. Pyrimme mallittamaan yksinkertaisen nivelakselin. Nivelakseli koostuu kolmesta

137 3.3. KIERTOJEN LASKUOPPI JA INTERPOLOINTI, KVATERNIOT 131 Kuva 3.16: Akseliprimitiivi. osasta. Ensimmäinen on akseli, jota kierretään jonkin ulkoisen voiman vaikutuksesta annetulla nopeudella. Tämä akseli on kytketty toiseen akseliin ristinivelen avulla. Tehtävänä on määritellä nivelristikon ja toisen akselin asennot, kun ensimmäisen akselin kiertokulma ja akselien välinen nivelkulma on annettu. Olkoon nyt annettu akselien välinen nivelkulma θ > π/2. Voimme olettaa, että nivelen keskipiste on R 3 :n origo, ja että toisen akselin keskilinja on positiivinen x-akseli. Toisen akselin keskilinjan oletetaan sijaitsevan xz-tasossa, siten että sen keskilinjan suuntavektorin ja x-akselin välinen kulma eli nivelkulma on θ. Tästä kanonisesta asemasta akseli on helppo asemoida loppusovellusta varten. Koostamme objektin jälleen perusprimitiivikappaleista. Tällä kertaa oletamme, että käytettävissämme on akseliprimitiivi, joka on positiivisen x-akselin suuntainen, ja sen nivelpää on siten asemoitu, että ristinivelen sakaran akselilinja on z- akselin suuntainen, katso kuva Käsittelemme vain tarvittavien kiertomatriisien muodostamista, joten oletamme, että akseliprimitiivi on valmiiksi mitoitettu oikean kokoiseksi. Tämä vaatii vain sopivia siirto- ja skaalausoperaatioita. Tämä akseliprimitiivi kelpaa siis sellaisenaan toiseksi akseliksi, kunhan vain pystymme kehittämään sopivan kiertomatriisin, joka kiertää sen x-akselin ympäri oikeaan asentoon ensimmäisen akselin kiertokulman ja nivelkulman määräämänä Kuvan 3.16 objektista muodostamme ensimmäisen akselin, jota ulkoisesti pa-

138 132 LUKU 3. KOLMAS ULOTTUVUUS Kuva 3.17: Ensimmäisen akselin asemointi kiertomatriisilla R h (ψ, x)r y ( θ). kotetaan kiertymään annetun kulman ψ verran. Tämä muodostetaan (hieman keinotekoisesti) soveltamalla ensin primitiiviobjektiin y-kiertomatriisia R y ( θ) ja sen jälkeen kiertoa R h (ψ, x), missä x on oikeaan nivelkulmaan kierretyn ensimmäisen akselin keskilinja: 1 x = R y ( θ) 0 0. (3.83) 0 Primitiiviobjektin keskilinja oli x-akselin suuntainen, joten x on oikeaan nivelkulmaan käännetyn ensimmäisen akselin keskilinjan suuntainen. Tällöin kierto kulmasiirtymällä (ψ, x) kiertää ensimmäistä akselia keskilinjansa ympäri. Vaihtoehtoisesti olisimme ensin voineet kiertää primitiiviobjektia x-kierrolla R x (ψ), ja sen jälkeen kääntää akseli oikeaan nivelkulmaan y-kiertomatriisilla R y ( θ). Ensimmäinen akseli paikalleen asemoituna on esitetty kuvassa Se vastaa tilannetta, jossa kiertokulmat ovat θ = 2 ja ψ = 2.5. Ristinivel muodostetaan primitiiviobjektista, joka koostuu kahdesta sopivan pituisesta ja paksuisesta sylinteristä, jotka ovat perusasennossaan x- ja y-akselien suuntaisia, katso kuva Tämän asemointi oikealle paikalleen on hieman han-

139 3.3. KIERTOJEN LASKUOPPI JA INTERPOLOINTI, KVATERNIOT 133 Kuva 3.18: Ristinivel-primitiiviobjekti perusasennossaan xy-tasossa. kalampaa. Selvästikin ristinivelen toisen sakaran tulisi oikessa asemassaan olla paikoilleen asemoidun ensimmäisen akselin nivelpään akselilinjan suuntainen. Akseliprimitiivissä tämä linja on z-akselin suuntainen, eli esimerkiksi suuntavektorin (0, 0, 1, 0) suuntainen, joten toisen sakaran suunnan määrää esimerkiksi vektori u = R h (ψ, x)r y ( θ) (3.84) Jäljelle jäävä sakara voi vielä pyöriä tasossa, jota vastaan yllä johdettu vektori u on kohtisuora. Tämän tason yhtälö on ( u,(x,y,z,1) T ) = 0. (3.85) Toista sakaraa rajoittaa kuitenkin se ehto, että sen tulee olla myös yz-tason vektori. Tämä johtuu siitä, että toinen akseli kiertyy x-akselin ympäri, joten siihen kiinnitetyn ristinivelen toisen sakaran täytyy kiertyä tasossa, joka on x-akselia vastaan kohtisuora. yz-taso on kohtisuorassa kaikkia x-akselin suuntaisia vektoreita vastaan, joten saamme sille esimerkiksi yhtälön (( 1,0,0,0) T,(x,y,z,1) T ) = 0. (3.86)

140 134 LUKU 3. KOLMAS ULOTTUVUUS Tarvitsemme siis vektorin v, joka on kohtisuorassa kumpaakin vektoria u ja ( 1,0,0,0) T vastaan. Tämän yksikkösuuntavektorin kolme ensimmäistä komponenttia (neljäs on aina nolla) saadaan siis ristitulona. u 1 1 u 2 0 v 1 u v =. (3.87) v 3 u 1 1 u 2 0 u 3 0 Edellä skaalaus yksikkövektoriksi on tarpeen, koska yksikkövektorit u ja ( 1,0,0,0) T eivät yleensä ole kohtisuorassa. Lisäksi vektori v on nollavektori, jos edellä mainitut vektorit ovat lineaarisesti riippuvia. Tämä tilanne on mahdollinen esimerkiksi silloin kuin akselien välinen kulma θ on kohtisuora. Nivelmekanismi ei tällöin (kuten tekniikan alan ihmiset hyvin tietävät) voi toimia. Jotta voisimme määritellä ristinivelen kiertomatriisin, tarvitsemme vielä kolmannen vektorin n, joka täydentää vektoriparin v, u ortonormaaliksi oikeakätiseksi kolmikoksi. Tämä saadaan, jälleen kerran, ristitulon avulla: Laskemme: n = v u, (3.88) jolloin yksikkövektorikolmikko v, u ja n on oikeakätinen. Tästä saamme kiertomatriisin, joka kiertää nivelristikon oikeaan asentoon. Sakaroiden tulisi kierrossa kiertyä vektoreiksi v ja u. Koska ne primitiiviristikon perusasennossa ovat x- ja y-akselien suuntaisia, voimme esimerkiksi kiertää x-akselin suuntaisen sakaran v-akselin suuntaiseksi ja y-akselin suuntaisen sakaran u-akselin suuntaiseksi. z-akselin suunta primitiivikoordinaatistossa kiertyy tällöin n-akselin suuntaan. Haluamamme matriisi on v 1 u 1 n 1 0 R( v, u, n) = v 2 u 2 n 2 0 v 3 u 3 n 3 0, (3.89) ja tälle matriisille on voimassa R( v, u, n) 1 = R( v, u, n) T. Tämä on kolmas esille tullut tapa parametrisoida kierto-operaatio Eulerin kulmien ja kulmasiirtymien lisäksi. Tässä on kuten aiemmissakin esitystavoissa kolme vapausastetta. Jos haluamme muodostaa jonkin oikeakätisen ortonormaalin vektorikolmikon, voimme valita ensimmäiseksi vektoriksi minkä tahansa R 3 :n yksikkövektorin v. Tämä

141 3.3. KIERTOJEN LASKUOPPI JA INTERPOLOINTI, KVATERNIOT 135 Kuva 3.19: Ristinivel kierrettynä perusasennostaan kaavan (3.89) kiertomatriisilla R( v, u, n). voidaan parametrisoida kahdella vapausasteella, esimerkiksi pallokoordinaattien leveys- ja pituuskulmien avulla. Toisen yksikkövektorin on väistämättä kuuluttava tasolle, joka on kohtisuorassa ensimmäistä vektoria vastaan. Tämä voidaan parametrisoida enää yhdellä vapausasteella, esimerkiksi kiertokulmana ensimmäisen vektorin ympäri. Nämä kaksi ensimmäistä vektoria määräävät jo täydellisesti koko kolmikon, koska oletimme sen ortonormaaliksi ja oikeakätiseksi. Tämä on täysin analoginen kappaleessa esitetyn tason kiertomatriisin muodostamistavan kanssa (kaava (2.54)). Kuvassa 3.19 on esitetty asento, johon ristinivel kiertyy perusasennostaan kaavan (3.89) kiertomatriisilla R( v, u, n). Jos sitä vertaa kuvaan 3.17, huomaa helposti, että toinen nivelsakara todellakin on kiertynyt akselin nivellinjan suuntaiseksi. Jäljellä on enää toisen akselin x-kiertymän määrääminen siten, että sen nivellinja asemoituu ristinivelen vapaan sakaran suuntaiseksi. Haluttu matriisi muodostetaan jälleen konstruoimalla oikeakätinen ortonormaali vektorikolmikko. Koska kuvan 3.16 akseliprimitiivin keskilinja on valmiiksi x-akselin suuntainen, on muunnosmatriisin ensimmäisen sarakevektorin oltava R 4 :n yksikkökantavektori e 1. Perusasennossaan akseliprimitiivin ristinivelen sakaran akselilinja on z-akselin suuntainen. Lopputuloksessa tämän linjan tulee olla vektorin v suuntainen. Vekto-

142 136 LUKU 3. KOLMAS ULOTTUVUUS Kuva 3.20: Vapaa akseli kierretynä oikeaan asentoonsa kaavan (3.91) kiertomatriisilla R( e 1, w, v). ri v:hän on ristinivelen toistaiseksi vapaana olevan sakaran suuntavektori. Muunnosmatriisin kolmanneksi sarakevektoriksi valitaan siis yksikkösuuntavektori v. Toinen sarakevektori saadaan jälleen ristitulon avulla. Jos laskemme vektorin w kaavalla w 1 v 1 1 w 2 = v 2 0, (3.90) w 3 v 3 0 muodostavat vektorit e 1, w ja v ortonormaalin oikeakätisen kolmikon ja haluttu muunnosmatriisi on täten 1 w 1 v 1 0 R( e 1, w, v) = 0 w 2 v w 3 v 3 0. (3.91) Kuvassa 3.20 on toinen akseli kiertyneenä uuteen asemaan edellisen matriisin määräämänä. Nivelakselikokonaisuus voidaan nyt esittää puumuodossa, kuten aiemmin tehtiin kaksiulotteisessa taso-objektin mallissa. Yksinkertaisimmillaan muodostetaan

143 3.3. KIERTOJEN LASKUOPPI JA INTERPOLOINTI, KVATERNIOT 137 Kuva 3.21: Lopputulos, kun kiertokulmat ovat θ = 2 ja ψ = 2.5. juurisolmu, joka kuvaa koko mallitettua akselia asennossa, jossa molempien akselien keskilinjat ovat xz-tasossa, nivelen keskipiste on origossa, akselien keskilinjojen välinen kulma on θ ja ensimmäinen akseli on kiertynyt kulman ψ verran. Tällä juurisolmulla on kolme lapsisolmua, jotka ovat samalla lehtisolmuja. Kahteen lehtisolmuun liitetään primitiiviobjektiksi akseliprimitiivi ja näihin puun haaroihin liitetään muunnosmatriisit R h (ψ, x)r y ( θ) ja R( e 1, w, v). Kolmanteen lehtisolmuun asetetaan primitiiviobjektiksi ristinivelprimitiivi, jota puolestaan kuvataan kierrolla R( v, u, n). Lopputulos on esitetty kuvassa 3.21 asennossa, jonka määräävät kiertokulmat θ = 2 ja ψ = 2.5. Tässä mallitetulla nivelakselilla on sellainen mielenkiintoinen ominaisuus, että toisen eli vapaan akselin kiertonopeus ei ole vakio, vaikka ensimmäistä akselia kierrettäisiinkin vakionopeudella. Näin käy aina, elleivat molemmat akselit ole samassa linjassa. Nopeusvaihtelu on sitä suurempi mitä lähempänä suoraa kulmaa nivelkulma θ on. Jos nivelkulma on suora kulma, ei mekanismi toimi lainkaan. Tämähän ilmeni myös sen matemaattisesta mallista, sillä emmehän siinä tapauksessa kyenneet määräämään ristinivelen asemoivaa kiertomatriisia. Tätä ilmiötä on esitelty kuvissa 3.22 ja 3.23, joihin on piirretty tunnistenumerot 1 ja 2 kuvaamaan ristinivelen sakaroiden päiden kiertoratoja, kun ensimmäistä akselia kierretään vakioaskelin. Koska nivelkulma θ = 2 on varsin lähellä suoraa kulmaa, vaih-

144 138 LUKU 3. KOLMAS ULOTTUVUUS Kuva 3.22: Nivelristikon sakaroiden päiden kiertoradat kun ensimmäistä akselia pyöritetään vakiokulma-askelin. telee vapaan akselin kiertonopeus varsin paljon. Tämä havaitaan selkeästi kuvassa Yhteenveto kiertojen esittämisestä Olemme käsitelleet seuraavat tavat parametrisoida kappaleen asento kiertomatriisin avulla: 1. Kolme peräkkäistä kiertoa (lokaalien tai globaalien) koordinaattiakselien ympäri. Vapausasteet: kolme kiertokulmaa. 2. Kulmasiirtymäesitys. Vapausasteet: R 3 :n yksikkövektori (kaksi vapausastetta), jonka ympäri kierretään annetun kiertokulman verran (yksi vapausaste). Yhteensä kolme vapausastetta. 3. Edellisten esittäminen yksikkökvaternioiden avulla. Yhteensä kolme vapausastetta (yksikkökvaternio voidaan samaistaa R 4 :n yksikkövektoriksi, jonka määräämiseen tarvitaan kolme vapausastetta)

145 3.4. PROJEKTIOKUVAN MUODOSTAMINEN KOLMIULOTTEISESTA NÄKYMÄSTÄ139 Kuva 3.23: Toisen akselin nopeus ei ole vakio vaikka ensimmäistä akselia pyöritetään vakionopeudella. 4. Oikeakätinen ortonormaali vektorikolmikko. Kolme vapausastetta (ensimmäinen vektori valitaan yksikkövektoriksi (kaksi vapausastetta), toisen yksikkövektorin tulee olla kohtisuorassa tätä vastaan (valintaan jää yksi vapausaste, esim. kiertokulma ensimmäisen vektorin ympäri) ja kolmannen tulee täydentää e.m. pari oikeakätiseksi ortonormaaliksi kolmikoksi (ei vapausasteita)). 3.4 Projektiokuvan muodostaminen kolmiulotteisesta näkymästä Tarkastellaan seuraavaksi kuinka maailmankoordinaatistoon sijoitetun näkymän objekteista luodaan tasokuva. Koska maailmankoordinaatisto on kolmiulotteinen ja tasokuva on vain kaksiulotteinen, täytyy osata muodostaa projektiokuvaus avaruudelta R 3 jollekin sen kaksiulotteiselle hypertasolle, jota kutsutaan jatkossa kuvatasoksi. Käsittelemme jatkossa kahta erilaista projektiotapaa. Nämä ovat perspektiiviprojektio ja yhdensuuntaisprojektio. Molemmat projektiot kuvaavat näky-

MS-A0003/A0005 Matriisilaskenta Malliratkaisut 4 / vko 47

MS-A0003/A0005 Matriisilaskenta Malliratkaisut 4 / vko 47 MS-A3/A5 Matriisilaskenta Malliratkaisut 4 / vko 47 Tehtävä 1 (L): Oletetaan, että AB = AC, kun B ja C ovat m n-matriiseja. a) Näytä, että jos A on kääntyvä, niin B = C. b) Seuraako yhtälöstä AB = AC yhtälö

Lisätiedot

3.2 Matriisien laskutoimitukset. 3.2 Matriisien laskutoimitukset. 3.2 Matriisien laskutoimitukset. 3.2 Matriisien laskutoimitukset

3.2 Matriisien laskutoimitukset. 3.2 Matriisien laskutoimitukset. 3.2 Matriisien laskutoimitukset. 3.2 Matriisien laskutoimitukset 32 Idea: Lineaarikuvausten laskutoimitusten avulla määritellään vastaavat matriisien laskutoimitukset Vakiolla kertominen ja summa Olkoon t R ja A, B R n m Silloin ta, A + B R n m ja määritellään ta ta

Lisätiedot

Insinöörimatematiikka D

Insinöörimatematiikka D Insinöörimatematiikka D M. Hirvensalo mikhirve@utu.fi V. Junnila viljun@utu.fi A. Lepistö alepisto@utu.fi Matematiikan ja tilastotieteen laitos Turun yliopisto 2016 M. Hirvensalo V. Junnila A. Lepistö

Lisätiedot

Insinöörimatematiikka D

Insinöörimatematiikka D Insinöörimatematiikka D Mika Hirvensalo mikhirve@utu.fi Matematiikan ja tilastotieteen laitos Turun yliopisto 2014 Mika Hirvensalo mikhirve@utu.fi Luentokalvot 3 1 of 16 Kertausta Lineaarinen riippuvuus

Lisätiedot

Insinöörimatematiikka D

Insinöörimatematiikka D Insinöörimatematiikka D M. Hirvensalo mikhirve@utu.fi V. Junnila viljun@utu.fi Matematiikan ja tilastotieteen laitos Turun yliopisto 2015 M. Hirvensalo mikhirve@utu.fi V. Junnila viljun@utu.fi Luentokalvot

Lisätiedot

3.1 Lineaarikuvaukset. MS-A0004/A0006 Matriisilaskenta. 3.1 Lineaarikuvaukset. 3.1 Lineaarikuvaukset

3.1 Lineaarikuvaukset. MS-A0004/A0006 Matriisilaskenta. 3.1 Lineaarikuvaukset. 3.1 Lineaarikuvaukset 31 MS-A0004/A0006 Matriisilaskenta 3 Nuutti Hyvönen, c Riikka Kangaslampi Matematiikan ja systeemianalyysin laitos Aalto-yliopisto 2292015 Lineaariset yhtälöt ovat vektoreille luonnollisia yhtälöitä, joita

Lisätiedot

Osoita, että kaikki paraabelit ovat yhdenmuotoisia etsimällä skaalauskuvaus, joka vie paraabelin y = ax 2 paraabelille y = bx 2. VASTAUS: , b = 2 2

Osoita, että kaikki paraabelit ovat yhdenmuotoisia etsimällä skaalauskuvaus, joka vie paraabelin y = ax 2 paraabelille y = bx 2. VASTAUS: , b = 2 2 8. Geometriset kuvaukset 8.1. Euklidiset kuvaukset 344. Esitä muodossa x = Ax + b se avaruuden E 3 peilauskuvaus, jonka symmetriatasona on x 1 3x + x 3 = 6. A = 1 3 6 6 3, b = 1 1 18. 3 6 6 345. Tason

Lisätiedot

Vektorien pistetulo on aina reaaliluku. Esimerkiksi vektorien v = (3, 2, 0) ja w = (1, 2, 3) pistetulo on

Vektorien pistetulo on aina reaaliluku. Esimerkiksi vektorien v = (3, 2, 0) ja w = (1, 2, 3) pistetulo on 13 Pistetulo Avaruuksissa R 2 ja R 3 on totuttu puhumaan vektorien pituuksista ja vektoreiden välisistä kulmista. Kuten tavallista, näiden käsitteiden yleistäminen korkeampiulotteisiin avaruuksiin ei onnistu

Lisätiedot

Vektorialgebra 1/5 Sisältö ESITIEDOT: vektori

Vektorialgebra 1/5 Sisältö ESITIEDOT: vektori Vektorialgebra 1/5 Sisältö Skalaaritulo Vektoreiden yhteenlaskun ja skalaarilla kertomisen lisäksi vektoreiden välille voidaan määritellä myös kertolasku. Itse asiassa näitä on kaksi erilaista. Seurauksena

Lisätiedot

Matriisit, kertausta. Laskutoimitukset. Matriisikaavoja. Aiheet. Määritelmiä ja merkintöjä. Laskutoimitukset. Matriisikaavoja. Matriisin transpoosi

Matriisit, kertausta. Laskutoimitukset. Matriisikaavoja. Aiheet. Määritelmiä ja merkintöjä. Laskutoimitukset. Matriisikaavoja. Matriisin transpoosi Matriisit, kertausta Merkintöjä 1 Matriisi on suorakulmainen lukukaavio. Matriiseja ovat esimerkiksi: ( 2 0.4 8 0 2 1 ) ( 0, 4 ), ( ) ( 1 4 2, a 11 a 12 a 21 a 22 ) Kaavio kirjoitetaan kaarisulkujen väliin

Lisätiedot

Lineaarialgebra ja matriisilaskenta I

Lineaarialgebra ja matriisilaskenta I Lineaarialgebra ja matriisilaskenta I 30.5.2013 HY / Avoin yliopisto Jokke Häsä, 1/19 Käytännön asioita Kurssi on suunnilleen puolessa välissä. Kannattaa tarkistaa tavoitetaulukosta, mitä on oppinut ja

Lisätiedot

Konformigeometriaa. 5. maaliskuuta 2006

Konformigeometriaa. 5. maaliskuuta 2006 Konformigeometriaa 5. maaliskuuta 006 1 Sisältö 1 Konformigeometria 1.1 Viivan esitys stereograasena projektiona............ 1. Euklidisen avaruuden konformaalinen malli........... 4 Konformikuvaukset

Lisätiedot

Neliömatriisi A on ortogonaalinen (eli ortogonaalimatriisi), jos sen alkiot ovat reaalisia ja

Neliömatriisi A on ortogonaalinen (eli ortogonaalimatriisi), jos sen alkiot ovat reaalisia ja 7 NELIÖMATRIISIN DIAGONALISOINTI. Ortogonaaliset matriisit Neliömatriisi A on ortogonaalinen (eli ortogonaalimatriisi), jos sen alkiot ovat reaalisia ja A - = A T () Muistutus: Kokoa n olevien vektorien

Lisätiedot

3.2 Matriisien laskutoimitukset. 3.2 Matriisien laskutoimitukset. 3.2 Matriisien laskutoimitukset. 3.2 Matriisien laskutoimitukset. Olkoot A 2 := AA =

3.2 Matriisien laskutoimitukset. 3.2 Matriisien laskutoimitukset. 3.2 Matriisien laskutoimitukset. 3.2 Matriisien laskutoimitukset. Olkoot A 2 := AA = 3 3 Olkoot 9 8 B 7 6 ja A 5 4 [ 3 4 Nyt A + B, AB ja BB eivät ole mielekkäitä (vastaavilla lineaarikuvauksilla menisivät dimensiot solmuun tällaisista yhdistelmistä) Kuitenkin voidaan laskea BA ja 9( )

Lisätiedot

Matikkapaja keskiviikkoisin klo Lineaarialgebra (muut ko) p. 1/81

Matikkapaja keskiviikkoisin klo Lineaarialgebra (muut ko) p. 1/81 Matikkapaja keskiviikkoisin klo 14-16 Lineaarialgebra (muut ko) p. 1/81 Lineaarialgebra (muut ko) p. 2/81 Operaatiot Vektoreille u = (u 1,u 2 ) ja v = (v 1,v 2 ) Yhteenlasku: u+v = (u 1 +v 1,u 2 +v 2 )

Lisätiedot

Lineaarialgebra ja differentiaaliyhtälöt Laskuharjoitus 1 / vko 44

Lineaarialgebra ja differentiaaliyhtälöt Laskuharjoitus 1 / vko 44 Lineaarialgebra ja differentiaaliyhtälöt Laskuharjoitus 1 / vko 44 Tehtävät 1-3 lasketaan alkuviikon harjoituksissa, verkkotehtävien dl on lauantaina aamuyöllä. Tehtävät 4 ja 5 lasketaan loppuviikon harjoituksissa.

Lisätiedot

Matriisilaskenta, LH4, 2004, ratkaisut 1. Hae seuraavien R 4 :n aliavaruuksien dimensiot, jotka sisältävät vain

Matriisilaskenta, LH4, 2004, ratkaisut 1. Hae seuraavien R 4 :n aliavaruuksien dimensiot, jotka sisältävät vain Matriisilaskenta LH4 24 ratkaisut 1 Hae seuraavien R 4 :n aliavaruuksien dimensiot jotka sisältävät vain a) Kaikki muotoa (a b c d) olevat vektorit joilla d a + b b) Kaikki muotoa (a b c d) olevat vektorit

Lisätiedot

Ortogonaalinen ja ortonormaali kanta

Ortogonaalinen ja ortonormaali kanta Ortogonaalinen ja ortonormaali kanta Määritelmä Kantaa ( w 1,..., w k ) kutsutaan ortogonaaliseksi, jos sen vektorit ovat kohtisuorassa toisiaan vastaan eli w i w j = 0 kaikilla i, j {1, 2,..., k}, missä

Lisätiedot

Lineaarikuvausten. Lineaarikuvaus. Lineaarikuvauksia. Ydin. Matriisin ydin. aiheita. Aiheet. Lineaarikuvaus. Lineaarikuvauksen matriisi

Lineaarikuvausten. Lineaarikuvaus. Lineaarikuvauksia. Ydin. Matriisin ydin. aiheita. Aiheet. Lineaarikuvaus. Lineaarikuvauksen matriisi Lineaarikuvaukset aiheita ten ten 1 Matematiikassa sana lineaarinen liitetään kahden lineaariavaruuden väliseen kuvaukseen. ten Määritelmä Olkoon (L, +, ) ja (M, ˆ+, ˆ ) reaalisia lineaariavaruuksia, ja

Lisätiedot

Matriisit, L20. Laskutoimitukset. Matriisikaavoja. Aiheet. Määritelmiä ja merkintöjä. Laskutoimitukset. Matriisikaavoja. Matriisin transpoosi

Matriisit, L20. Laskutoimitukset. Matriisikaavoja. Aiheet. Määritelmiä ja merkintöjä. Laskutoimitukset. Matriisikaavoja. Matriisin transpoosi Matriisit, L20 Merkintöjä 1 Matriisi on suorakulmainen lukukaavio. Matriiseja ovat esimerkiksi: ( 2 0.4 8 0 2 1 ) ( 0, 4 ), ( ) ( 1 4 2, a 11 a 12 a 21 a 22 ) Merkintöjä 1 Matriisi on suorakulmainen lukukaavio.

Lisätiedot

Lineaarikombinaatio, lineaarinen riippuvuus/riippumattomuus

Lineaarikombinaatio, lineaarinen riippuvuus/riippumattomuus Lineaarikombinaatio, lineaarinen riippuvuus/riippumattomuus 1 / 51 Lineaarikombinaatio Johdattelua seuraavaan asiaan (ei tarkkoja määritelmiä): Millaisen kuvan muodostaa joukko {λv λ R, v R 3 }? Millaisen

Lisätiedot

Luento 3: 3D katselu. Sisältö

Luento 3: 3D katselu. Sisältö Tietokonegrafiikan perusteet T-.43 3 op Luento 3: 3D katselu Lauri Savioja Janne Kontkanen /27 3D katselu / Sisältö Kertaus: koordinaattimuunnokset ja homogeeniset koordinaatit Näkymänmuodostus Kameran

Lisätiedot

Lineaarialgebra ja matriisilaskenta I

Lineaarialgebra ja matriisilaskenta I Lineaarialgebra ja matriisilaskenta I 13.6.2013 HY / Avoin yliopisto Jokke Häsä, 1/12 Käytännön asioita Kesäkuun tentti: ke 19.6. klo 17-20, päärakennuksen sali 1. Anna palautetta kurssisivulle ilmestyvällä

Lisätiedot

Matikkapaja keskiviikkoisin klo Lineaarialgebra (muut ko) p. 1/210

Matikkapaja keskiviikkoisin klo Lineaarialgebra (muut ko) p. 1/210 Matikkapaja keskiviikkoisin klo 14-16 Lineaarialgebra (muut ko) p. 1/210 Lineaarialgebra (muut ko) p. 2/210 Operaatiot Vektoreille u = (u 1,u 2 ) ja v = (v 1,v 2 ) Yhteenlasku: u+v = (u 1 +v 1,u 2 +v 2

Lisätiedot

Ratkaisuehdotukset LH 7 / vko 47

Ratkaisuehdotukset LH 7 / vko 47 MS-C34 Lineaarialgebra, II/7 Ratkaisuehdotukset LH 7 / vko 47 Tehtävä : Olkoot M R symmetrinen ja positiividefiniitti matriisi (i) Näytä, että m > ja m > (ii) Etsi Eliminaatiomatriisi E R siten, että [

Lisätiedot

802320A LINEAARIALGEBRA OSA III

802320A LINEAARIALGEBRA OSA III 802320A LINEAARIALGEBRA OSA III Tapani Matala-aho MATEMATIIKKA/LUTK/OULUN YLIOPISTO SYKSY 2016 LINEAARIALGEBRA 1 / 56 Määritelmä Määritelmä 1 Olkoot V ja W lineaariavaruuksia kunnan K yli. Kuvaus L : V

Lisätiedot

802320A LINEAARIALGEBRA OSA II

802320A LINEAARIALGEBRA OSA II 802320A LINEAARIALGEBRA OSA II Tapani Matala-aho MATEMATIIKKA/LUTK/OULUN YLIOPISTO SYKSY 2016 LINEAARIALGEBRA 1 / 64 Sisätuloavaruus Määritelmä 1 Olkoon V reaalinen vektoriavaruus. Kuvaus on reaalinen

Lisätiedot

1.1 Vektorit. MS-A0004/A0006 Matriisilaskenta. 1.1 Vektorit. 1.1 Vektorit. Reaalinen n-ulotteinen avaruus on joukko. x 1. R n.

1.1 Vektorit. MS-A0004/A0006 Matriisilaskenta. 1.1 Vektorit. 1.1 Vektorit. Reaalinen n-ulotteinen avaruus on joukko. x 1. R n. ja kompleksiluvut ja kompleksiluvut 1.1 MS-A0004/A0006 Matriisilaskenta 1. ja kompleksiluvut Nuutti Hyvönen, c Riikka Kangaslampi Matematiikan ja systeemianalyysin laitos Aalto-yliopisto 8.9.015 Reaalinen

Lisätiedot

2.5. Matriisin avaruudet ja tunnusluvut

2.5. Matriisin avaruudet ja tunnusluvut 2.5. Matriisin avaruudet ja tunnusluvut m n-matriisi A Lineaarikuvaus A : V Z, missä V ja Z ovat sopivasti valittuja, dim V = n, dim Z = m (yleensä V = R n tai C n ja Z = R m tai C m ) Kuva-avaruus ja

Lisätiedot

9 Matriisit. 9.1 Matriisien laskutoimituksia

9 Matriisit. 9.1 Matriisien laskutoimituksia 9 Matriisit Aiemmissa luvuissa matriiseja on käsitelty siinä määrin kuin on ollut tarpeellista yhtälönratkaisun kannalta. Matriiseja käytetään kuitenkin myös muihin tarkoituksiin, ja siksi on hyödyllistä

Lisätiedot

Lineaariavaruudet. Span. Sisätulo. Normi. Matriisinormit. Matriisinormit. aiheita. Aiheet. Reaalinen lineaariavaruus. Span. Sisätulo.

Lineaariavaruudet. Span. Sisätulo. Normi. Matriisinormit. Matriisinormit. aiheita. Aiheet. Reaalinen lineaariavaruus. Span. Sisätulo. Lineaariavaruudet aiheita 1 määritelmä Nelikko (L, R, +, ) on reaalinen (eli reaalinen vektoriavaruus), jos yhteenlasku L L L, ( u, v) a + b ja reaaliluvulla kertominen R L L, (λ, u) λ u toteuttavat seuraavat

Lisätiedot

Insinöörimatematiikka D

Insinöörimatematiikka D Insinöörimatematiikka D M. Hirvensalo mikhirve@utu.fi V. Junnila viljun@utu.fi Matematiikan ja tilastotieteen laitos Turun yliopisto 2015 M. Hirvensalo mikhirve@utu.fi V. Junnila viljun@utu.fi Luentokalvot

Lisätiedot

Määritelmä 1. Olkoot V ja W lineaariavaruuksia kunnan K yli. Kuvaus L : V. Termejä: Lineaarikuvaus, Lineaarinen kuvaus.

Määritelmä 1. Olkoot V ja W lineaariavaruuksia kunnan K yli. Kuvaus L : V. Termejä: Lineaarikuvaus, Lineaarinen kuvaus. 1 Lineaarikuvaus 1.1 Määritelmä Määritelmä 1. Olkoot V ja W lineaariavaruuksia kunnan K yli. Kuvaus L : V W on lineaarinen, jos (a) L(v + w) = L(v) + L(w); (b) L(λv) = λl(v) aina, kun v, w V ja λ K. Termejä:

Lisätiedot

Determinantti 1 / 30

Determinantti 1 / 30 1 / 30 on reaaliluku, joka on määritelty neliömatriiseille Determinantin avulla voidaan esimerkiksi selvittää, onko matriisi kääntyvä a voidaan käyttää käänteismatriisin määräämisessä ja siten lineaarisen

Lisätiedot

6 MATRIISIN DIAGONALISOINTI

6 MATRIISIN DIAGONALISOINTI 6 MATRIISIN DIAGONALISOINTI Ortogonaaliset matriisit Neliömatriisi A on ortogonaalinen (eli ortogonaalimatriisi), jos sen alkiot ovat reaalisia ja A - = A T Muistutus: vektorien a ja b pistetulo (skalaaritulo,

Lisätiedot

Kuvaus. Määritelmä. LM2, Kesä /160

Kuvaus. Määritelmä. LM2, Kesä /160 Kuvaus Määritelmä Oletetaan, että X ja Y ovat joukkoja. Kuvaus eli funktio joukosta X joukkoon Y on sääntö, joka liittää jokaiseen joukon X alkioon täsmälleen yhden alkion, joka kuuluu joukkoon Y. Merkintä

Lisätiedot

Matriisit, L20. Laskutoimitukset. Matriisikaavoja. Aiheet. Määritelmiä ja merkintöjä. Laskutoimitukset. Matriisikaavoja. Matriisin transpoosi

Matriisit, L20. Laskutoimitukset. Matriisikaavoja. Aiheet. Määritelmiä ja merkintöjä. Laskutoimitukset. Matriisikaavoja. Matriisin transpoosi Matriisit, L20 Merkintöjä 1 Matriisi on suorakulmainen lukukaavio. Matriiseja ovat esimerkiksi: ( 2 0.4 8 0 2 1 ( 0, 4, ( ( 1 4 2, a 11 a 12 a 21 a 22 Kaavio kirjoitetaan kaarisulkujen väliin (amer. kirjoissa

Lisätiedot

Johdatus tekoälyn taustalla olevaan matematiikkaan

Johdatus tekoälyn taustalla olevaan matematiikkaan Johdatus tekoälyn taustalla olevaan matematiikkaan Informaatioteknologian tiedekunta Jyväskylän yliopisto 5. luento.2.27 Lineaarialgebraa - Miksi? Neuroverkon parametreihin liittyvät kaavat annetaan monesti

Lisätiedot

Talousmatematiikan perusteet: Luento 10. Matriisien peruskäsitteet Yksinkertaiset laskutoimitukset Matriisitulo Determinantti

Talousmatematiikan perusteet: Luento 10. Matriisien peruskäsitteet Yksinkertaiset laskutoimitukset Matriisitulo Determinantti Talousmatematiikan perusteet: Luento 1 Matriisien peruskäsitteet Yksinkertaiset laskutoimitukset Matriisitulo Determinantti Viime luennolta Esim. Yritys tekee elintarviketeollisuuden käyttämää puolivalmistetta,

Lisätiedot

MS-C1340 Lineaarialgebra ja

MS-C1340 Lineaarialgebra ja MS-C1340 Lineaarialgebra ja differentiaaliyhtälöt Vektoriavaruudet Riikka Kangaslampi kevät 2017 Matematiikan ja systeemianalyysin laitos Aalto-yliopisto Idea Lineaarisen systeemin ratkaiseminen Olkoon

Lisätiedot

Lineaarialgebra (muut ko)

Lineaarialgebra (muut ko) Lineaarialgebra (muut ko) p. 1/103 Lineaarialgebra (muut ko) Tero Laihonen Lineaarialgebra (muut ko) p. 2/103 Operaatiot Vektoreille u = (u 1,u 2 ) ja v = (v 1,v 2 ) Yhteenlasku: u+v = (u 1 +v 1,u 2 +v

Lisätiedot

Matriisialgebra harjoitukset, syksy 2016

Matriisialgebra harjoitukset, syksy 2016 MATRIISIALGEBRA, s, Ratkaisuja/ MHamina & M Peltola 7 Onko kuvaus F : R R, F(x 1,x = (x 1 +x,5x 1, x 1 +6x lineaarinen kuvaus? Jos on, niin määrää sen matriisi luonnollisen kannan suhteen Jos ei ole, niin

Lisätiedot

1.1 Vektorit. MS-A0007 Matriisilaskenta. 1.1 Vektorit. 1.1 Vektorit. Reaalinen n-ulotteinen avaruus on joukko. x 1. R n. 1. Vektorit ja kompleksiluvut

1.1 Vektorit. MS-A0007 Matriisilaskenta. 1.1 Vektorit. 1.1 Vektorit. Reaalinen n-ulotteinen avaruus on joukko. x 1. R n. 1. Vektorit ja kompleksiluvut ja kompleksiluvut ja kompleksiluvut 1.1 MS-A0007 Matriisilaskenta 1. ja kompleksiluvut Nuutti Hyvönen, c Riikka Kangaslampi Matematiikan ja systeemianalyysin laitos Aalto-yliopisto 26.10.2015 Reaalinen

Lisätiedot

Kertausta: avaruuden R n vektoreiden pistetulo

Kertausta: avaruuden R n vektoreiden pistetulo Kertausta: avaruuden R n vektoreiden pistetulo Määritelmä Vektoreiden v R n ja w R n pistetulo on v w = v 1 w 1 + v 2 w 2 + + v n w n. Huom. Pistetulo v w on reaaliluku! LM2, Kesä 2012 227/310 Kertausta:

Lisätiedot

Insinöörimatematiikka D

Insinöörimatematiikka D Insinöörimatematiikka D M. Hirvensalo mikhirve@utu.fi V. Junnila viljun@utu.fi Matematiikan ja tilastotieteen laitos Turun yliopisto 2015 M. Hirvensalo mikhirve@utu.fi V. Junnila viljun@utu.fi Luentokalvot

Lisätiedot

9. Lineaaristen differentiaaliyhtälöiden ratkaisuavaruuksista

9. Lineaaristen differentiaaliyhtälöiden ratkaisuavaruuksista 29 9 Lineaaristen differentiaaliyhtälöiden ratkaisuavaruuksista Tarkastelemme kertalukua n olevia lineaarisia differentiaaliyhtälöitä y ( x) + a ( x) y ( x) + + a ( x) y( x) + a ( x) y= b( x) ( n) ( n

Lisätiedot

Lineaarialgebra ja matriisilaskenta I. LM1, Kesä /218

Lineaarialgebra ja matriisilaskenta I. LM1, Kesä /218 Lineaarialgebra ja matriisilaskenta I LM1, Kesä 2012 1/218 Avaruuden R 2 vektorit Määritelmä (eli sopimus) Avaruus R 2 on kaikkien reaalilukuparien joukko; toisin sanottuna R 2 = { (a, b) a R ja b R }.

Lisätiedot

1 Ominaisarvot ja ominaisvektorit

1 Ominaisarvot ja ominaisvektorit 1 Ominaisarvot ja ominaisvektorit Olkoon A = [a jk ] n n matriisi. Tarkastellaan vektoriyhtälöä Ax = λx, (1) 1 missä λ on luku. Sellaista λ:n arvoa, jolla yhtälöllä on ratkaisu x 0, kutsutaan matriisin

Lisätiedot

Lineaarialgebra ja matriisilaskenta I

Lineaarialgebra ja matriisilaskenta I Lineaarialgebra ja matriisilaskenta I 29.5.2013 HY / Avoin yliopisto Jokke Häsä, 1/26 Kertausta: Kanta Määritelmä Oletetaan, että w 1, w 2,..., w k W. Vektorijono ( w 1, w 2,..., w k ) on aliavaruuden

Lisätiedot

Talousmatematiikan perusteet: Luento 9. Matriisien peruskäsitteet Yksinkertaiset laskutoimitukset Transponointi Matriisitulo

Talousmatematiikan perusteet: Luento 9. Matriisien peruskäsitteet Yksinkertaiset laskutoimitukset Transponointi Matriisitulo Talousmatematiikan perusteet: Luento 9 Matriisien peruskäsitteet Yksinkertaiset laskutoimitukset Transponointi Matriisitulo Viime luennolta Esim. Yritys tekee elintarviketeollisuuden käyttämää puolivalmistetta,

Lisätiedot

Insinöörimatematiikka D, laskuharjoituksien esimerkkiratkaisut

Insinöörimatematiikka D, laskuharjoituksien esimerkkiratkaisut Insinöörimatematiikka D, 29.3.2016 4. laskuharjoituksien esimerkkiratkaisut 1. Olkoon u (4,0,4,2) ja v ( 1,1,3,5) vektoreita vektoriavaruudessa R 4. Annetun sisätulon (x,y) indusoima normi on x (x,x) ja

Lisätiedot

1 Kannat ja kannanvaihto

1 Kannat ja kannanvaihto 1 Kannat ja kannanvaihto 1.1 Koordinaattivektori Oletetaan, että V on K-vektoriavaruus, jolla on kanta S = (v 1, v 2,..., v n ). Avaruuden V vektori v voidaan kirjoittaa kannan vektorien lineaarikombinaationa:

Lisätiedot

Avaruuden R n aliavaruus

Avaruuden R n aliavaruus Avaruuden R n aliavaruus 1 / 41 Aliavaruus Esimerkki 1 Kuva: Suora on suljettu yhteenlaskun ja skalaarilla kertomisen suhteen. 2 / 41 Esimerkki 2 Kuva: Suora ei ole suljettu yhteenlaskun ja skalaarilla

Lisätiedot

1.1. Määritelmiä ja nimityksiä

1.1. Määritelmiä ja nimityksiä 1.1. Määritelmiä ja nimityksiä Luku joko reaali- tai kompleksiluku. R = {reaaliluvut}, C = {kompleksiluvut} R n = {(x 1, x 2,..., x n ) x 1, x 2,..., x n R} C n = {(x 1, x 2,..., x n ) x 1, x 2,..., x

Lisätiedot

1 Sisätulo- ja normiavaruudet

1 Sisätulo- ja normiavaruudet 1 Sisätulo- ja normiavaruudet 1.1 Sisätuloavaruus Määritelmä 1. Olkoon V reaalinen vektoriavaruus. Kuvaus : V V R on reaalinen sisätulo eli pistetulo, jos (a) v w = w v (symmetrisyys); (b) v + u w = v

Lisätiedot

Kannan vektorit siis virittävät aliavaruuden, ja lisäksi kanta on vapaa. Lauseesta 7.6 saadaan seuraava hyvin käyttökelpoinen tulos:

Kannan vektorit siis virittävät aliavaruuden, ja lisäksi kanta on vapaa. Lauseesta 7.6 saadaan seuraava hyvin käyttökelpoinen tulos: 8 Kanta Tässä luvussa tarkastellaan aliavaruuden virittäjävektoreita, jotka muodostavat lineaarisesti riippumattoman jonon. Merkintöjen helpottamiseksi oletetaan luvussa koko ajan, että W on vektoreiden

Lisätiedot

x = y x i = y i i = 1, 2; x + y = (x 1 + y 1, x 2 + y 2 ); x y = (x 1 y 1, x 2 + y 2 );

x = y x i = y i i = 1, 2; x + y = (x 1 + y 1, x 2 + y 2 ); x y = (x 1 y 1, x 2 + y 2 ); LINEAARIALGEBRA Harjoituksia, Syksy 2016 1. Olkoon n Z +. Osoita, että (R n, +, ) on lineaariavaruus, kun vektoreiden x = (x 1,..., x n ), y = (y 1,..., y n ) identtisyys, yhteenlasku ja reaaliluvulla

Lisätiedot

Päättelyn voisi aloittaa myös edellisen loppupuolelta ja näyttää kuten alkupuolella, että välttämättä dim W < R 1 R 1

Päättelyn voisi aloittaa myös edellisen loppupuolelta ja näyttää kuten alkupuolella, että välttämättä dim W < R 1 R 1 Lineaarialgebran kertaustehtävien b ratkaisuista. Määritä jokin kanta sille reaalikertoimisten polynomien lineaariavaruuden P aliavaruudelle, jonka virittää polynomijoukko {x, x+, x x }. Ratkaisu. Olkoon

Lisätiedot

HY / Avoin yliopisto Lineaarialgebra ja matriisilaskenta II, kesä 2015 Harjoitus 1 Ratkaisut palautettava viimeistään maanantaina klo

HY / Avoin yliopisto Lineaarialgebra ja matriisilaskenta II, kesä 2015 Harjoitus 1 Ratkaisut palautettava viimeistään maanantaina klo HY / Avoin yliopisto Lineaarialgebra ja matriisilaskenta II, kesä 2015 Harjoitus 1 Ratkaisut palautettava viimeistään maanantaina 10.8.2015 klo 16.15. Tehtäväsarja I Tutustu lukuun 15, jossa vektoriavaruuden

Lisätiedot

MS-A0003/A0005 Matriisilaskenta Laskuharjoitus 2 / vko 45

MS-A0003/A0005 Matriisilaskenta Laskuharjoitus 2 / vko 45 MS-A0003/A0005 Matriisilaskenta Laskuharjoitus / vko 5 Tehtävä 1 (L): Hahmottele kompleksitasoon ne pisteet, jotka toteuttavat a) z 3 =, b) z + 3 i < 3, c) 1/z >. Yleisesti: ehto z = R, z C muodostaa kompleksitasoon

Lisätiedot

9. Vektorit. 9.1 Skalaarit ja vektorit. 9.2 Vektorit tasossa

9. Vektorit. 9.1 Skalaarit ja vektorit. 9.2 Vektorit tasossa 9. Vektorit 9.1 Skalaarit ja vektorit Skalaari on koon tai määrän mitta. Tyypillinen esimerkki skalaarista on massa. Lukumäärä on toinen hyvä esimerkki skalaarista. Vektorilla on taas suuruus ja suunta.

Lisätiedot

x = y x i = y i i = 1, 2; x + y = (x 1 + y 1, x 2 + y 2 ); x y = (x 1 y 1, x 2 + y 2 );

x = y x i = y i i = 1, 2; x + y = (x 1 + y 1, x 2 + y 2 ); x y = (x 1 y 1, x 2 + y 2 ); LINEAARIALGEBRA Ratkaisuluonnoksia, Syksy 2016 1. Olkoon n Z +. Osoita, että (R n, +, ) on lineaariavaruus, kun vektoreiden x = (x 1,..., x n ), y = (y 1,..., y n ) identtisyys, yhteenlasku ja reaaliluvulla

Lisätiedot

3.1 Lineaarikuvaukset. MS-A0007 Matriisilaskenta. 3.1 Lineaarikuvaukset. 3.1 Lineaarikuvaukset

3.1 Lineaarikuvaukset. MS-A0007 Matriisilaskenta. 3.1 Lineaarikuvaukset. 3.1 Lineaarikuvaukset 3 MS-A7 Matriisilaskenta 3 Nuutti Hyvönen, c Riikka Kangaslampi Matematiikan ja systeemianalyysin laitos Aalto-yliopisto 925 Lineaariset yhtälöt ovat vektoreille luonnollisia yhtälöitä, joita ratkotaan

Lisätiedot

Talousmatematiikan perusteet: Luento 10. Lineaarikuvaus Matriisin aste Determinantti Käänteismatriisi

Talousmatematiikan perusteet: Luento 10. Lineaarikuvaus Matriisin aste Determinantti Käänteismatriisi Talousmatematiikan perusteet: Luento 10 Lineaarikuvaus Matriisin aste Determinantti Käänteismatriisi Lineaarikuvaus Esim. Yritys tekee elintarviketeollisuuden käyttämää puolivalmistetta, jossa käytetään

Lisätiedot

1 Lineaariavaruus eli Vektoriavaruus

1 Lineaariavaruus eli Vektoriavaruus 1 Lineaariavaruus eli Vektoriavaruus 1.1 Määritelmä ja esimerkkejä Olkoon K kunta, jonka nolla-alkio on 0 ja ykkösalkio on 1 sekä V epätyhjä joukko. Oletetaan, että joukossa V on määritelty laskutoimitus

Lisätiedot

9.2 Lineaarikuvaus Olkoon A kuvaus (funktio) vektoriavaruudesta V vektoriavaruuteen U: jos nyt

9.2 Lineaarikuvaus Olkoon A kuvaus (funktio) vektoriavaruudesta V vektoriavaruuteen U: jos nyt 9 Lineaarikuvaukset, matriisit 9 Vektoriavaruudet Aiemmin olemmme puhuneet tason (R 2 ja kotiavaruuden (R 3 vektoreista Nämä (kuten mös pelkkä R ovat esimerkkejä reaalisista vektoriavaruuksista Yleisesti

Lisätiedot

Lineaarialgebra ja matriisilaskenta II. LM2, Kesä /141

Lineaarialgebra ja matriisilaskenta II. LM2, Kesä /141 Lineaarialgebra ja matriisilaskenta II LM2, Kesä 2012 1/141 Kertausta: avaruuden R n vektorit Määritelmä Oletetaan, että n {1, 2, 3,...}. Avaruuden R n alkiot ovat jonoja, joissa on n kappaletta reaalilukuja.

Lisätiedot

Osoita, että täsmälleen yksi vektoriavaruuden ehto ei ole voimassa.

Osoita, että täsmälleen yksi vektoriavaruuden ehto ei ole voimassa. LINEAARIALGEBRA Harjoituksia 2016 1. Olkoon V = R 2 varustettuna tavallisella yhteenlaskulla. Määritellään reaaliluvulla kertominen seuraavasti: λ (x 1, x 2 ) = (λx 1, 0) (x 1, x 2 ) R 2 ja λ R. Osoita,

Lisätiedot

Lineaarikuvauksen R n R m matriisi

Lineaarikuvauksen R n R m matriisi Lineaarikuvauksen R n R m matriisi Lauseessa 21 osoitettiin, että jokaista m n -matriisia A vastaa lineaarikuvaus L A : R n R m, jolla L A ( v) = A v kaikilla v R n. Osoitetaan seuraavaksi käänteinen tulos:

Lisätiedot

Sisätuloavaruudet. 4. lokakuuta 2006

Sisätuloavaruudet. 4. lokakuuta 2006 Sisätuloavaruudet 4. lokakuuta 2006 Tässä esityksessä vektoriavaruudet V ja W ovat kompleksisia ja äärellisulotteisia. Käydään ensin lyhyesti läpi määritelmiä ja perustuloksia. Merkitään L(V, W ) :llä

Lisätiedot

Talousmatematiikan perusteet: Luento 11. Lineaarikuvaus Matriisin aste Käänteismatriisi

Talousmatematiikan perusteet: Luento 11. Lineaarikuvaus Matriisin aste Käänteismatriisi Talousmatematiikan perusteet: Luento 11 Lineaarikuvaus Matriisin aste Käänteismatriisi Viime luennolla Käsittelimme matriisien peruskäsitteitä ja laskutoimituksia Vakiolla kertominen, yhteenlasku ja vähennyslasku

Lisätiedot

802320A LINEAARIALGEBRA OSA I

802320A LINEAARIALGEBRA OSA I 802320A LINEAARIALGEBRA OSA I Tapani Matala-aho MATEMATIIKKA/LUTK/OULUN YLIOPISTO SYKSY 2016 LINEAARIALGEBRA 1 / 72 Määritelmä ja esimerkkejä Olkoon K kunta, jonka nolla-alkio on 0 ja ykkösalkio on 1 sekä

Lisätiedot

Talousmatematiikan perusteet: Luento 9

Talousmatematiikan perusteet: Luento 9 Talousmatematiikan perusteet: Luento 9 Vektorien peruslaskutoimitukset Lineaarinen riippumattomuus Vektorien sisätulo ja pituus Vektorien välinen kulma Motivointi Tähän asti olemme tarkastelleet yhden

Lisätiedot

Kanta ja Kannan-vaihto

Kanta ja Kannan-vaihto ja Kannan-vaihto 1 Olkoon L vektoriavaruus. Äärellinen joukko L:n vektoreita V = { v 1, v 2,..., v n } on kanta, jos (1) Jokainen L:n vektori voidaan lausua v-vektoreiden lineaarikombinaationa. (Ts. Span(V

Lisätiedot

Luento 7: 3D katselu. Sisältö

Luento 7: 3D katselu. Sisältö Tietokonegrafiikka / perusteet Tik-.3/3 4 ov / 2 ov Luento 7: 3D katselu Lauri Savioja /4 3D katselu / Sisältö Koorinaattimuunnokset Kameran ja maailmankoorinaatiston yhteys Perspektiivi 3D katselu / 2

Lisätiedot

MS-C1340 Lineaarialgebra ja differentiaaliyhtälöt

MS-C1340 Lineaarialgebra ja differentiaaliyhtälöt MS-C1340 Lineaarialgebra ja differentiaaliyhtälöt Vektoriavaruudet Riikka Kangaslampi Matematiikan ja systeemianalyysin laitos Aalto-yliopisto 2015 1 / 17 R. Kangaslampi Vektoriavaruudet Vektoriavaruus

Lisätiedot

Ristitulolle saadaan toinen muistisääntö determinantin avulla. Vektoreiden v ja w ristitulo saadaan laskemalla determinantti

Ristitulolle saadaan toinen muistisääntö determinantin avulla. Vektoreiden v ja w ristitulo saadaan laskemalla determinantti 14 Ristitulo Avaruuden R 3 vektoreille voidaan määritellä pistetulon lisäksi niin kutsuttu ristitulo. Pistetulosta poiketen ristitulon tulos ei ole reaaliluku vaan avaruuden R 3 vektori. Ristitulosta on

Lisätiedot

Ennakkotehtävän ratkaisu

Ennakkotehtävän ratkaisu Ennakkotehtävän ratkaisu Ratkaisu [ ] [ ] 1 3 4 3 A = ja B =. 1 4 1 1 [ ] [ ] 4 3 12 12 1 0 a) BA = =. 1 + 1 3 + 4 0 1 [ ] [ ] [ ] 1 0 x1 x1 b) (BA)x = =. 0 1 x 2 x [ ] [ ] [ 2 ] [ ] 4 3 1 4 9 5 c) Bb

Lisätiedot

Avaruuden kolme sellaista pistettä, jotka eivät sijaitse samalla suoralla, määräävät

Avaruuden kolme sellaista pistettä, jotka eivät sijaitse samalla suoralla, määräävät 11 Taso Avaruuden kolme sellaista pistettä, jotka eivät sijaitse samalla suoralla, määräävät tason. Olkoot nämä pisteet P, B ja C. Merkitään vaikkapa P B r ja PC s. Tällöin voidaan sanoa, että vektorit

Lisätiedot

MS-A0003/A0005 Matriisilaskenta Laskuharjoitus 1 / vko 44

MS-A0003/A0005 Matriisilaskenta Laskuharjoitus 1 / vko 44 MS-A0003/A0005 Matriisilaskenta Laskuharjoitus / vko Tehtävä (L): Käynnistä Matlab-ohjelma ja kokeile laskea sillä muutama peruslaskutoimitus: laske jokin yhteen-, vähennys-, kerto- ja jakolasku. Laske

Lisätiedot

BM20A5800 Funktiot, lineaarialgebra ja vektorit Harjoitus 4, Syksy 2016

BM20A5800 Funktiot, lineaarialgebra ja vektorit Harjoitus 4, Syksy 2016 BM20A5800 Funktiot, lineaarialgebra ja vektorit Harjoitus 4, Syksy 2016 1. Hahmottele karkeasti funktion f : R R 2 piirtämällä sen arvoja muutamilla eri muuttujan arvoilla kaksiulotteiseen koordinaatistoon

Lisätiedot

1 Matriisit ja lineaariset yhtälöryhmät

1 Matriisit ja lineaariset yhtälöryhmät 1 Matriisit ja lineaariset yhtälöryhmät 11 Yhtälöryhmä matriisimuodossa m n-matriisi sisältää mn kpl reaali- tai kompleksilukuja, jotka on asetetettu suorakaiteen muotoiseksi kaavioksi: a 11 a 12 a 1n

Lisätiedot

110. 111. 112. 113. 114. 4. Matriisit ja vektorit. 4.1. Matriisin käsite. 4.2. Matriisialgebra. Olkoon A = , B = Laske A + B, 5 14 9, 1 3 3

110. 111. 112. 113. 114. 4. Matriisit ja vektorit. 4.1. Matriisin käsite. 4.2. Matriisialgebra. Olkoon A = , B = Laske A + B, 5 14 9, 1 3 3 4 Matriisit ja vektorit 4 Matriisin käsite 42 Matriisialgebra 0 2 2 0, B = 2 2 4 6 2 Laske A + B, 2 A + B, AB ja BA A + B = 2 4 6 5, 2 A + B = 5 9 6 5 4 9, 4 7 6 AB = 0 0 0 6 0 0 0, B 22 2 2 0 0 0 6 5

Lisätiedot

Talousmatematiikan perusteet: Luento 8. Vektoreista ja matriiseista Vektorien peruslaskutoimitukset Lineaarinen riippumattomuus Vektorien sisätulo

Talousmatematiikan perusteet: Luento 8. Vektoreista ja matriiseista Vektorien peruslaskutoimitukset Lineaarinen riippumattomuus Vektorien sisätulo Talousmatematiikan perusteet: Luento 8 Vektoreista ja matriiseista Vektorien peruslaskutoimitukset Lineaarinen riippumattomuus Vektorien sisätulo Motivointi Esim. Herkkumatikka maksaa 50 /kg. Paljonko

Lisätiedot

Ortogonaalisen kannan etsiminen

Ortogonaalisen kannan etsiminen Ortogonaalisen kannan etsiminen Lause 94 (Gramin-Schmidtin menetelmä) Oletetaan, että B = ( v 1,..., v n ) on sisätuloavaruuden V kanta. Merkitään V k = span( v 1,..., v k ) ja w 1 = v 1 w 2 = v 2 v 2,

Lisätiedot

Seuraava luento ti on salissa XXII. Lineaarialgebra (muut ko) p. 1/117

Seuraava luento ti on salissa XXII. Lineaarialgebra (muut ko) p. 1/117 Seuraava luento ti 31.10 on salissa XXII Lineaarialgebra (muut ko) p. 1/117 Lineaarialgebra (muut ko) p. 2/117 Operaatiot Vektoreille u = (u 1,u 2 ) ja v = (v 1,v 2 ) Yhteenlasku: u+v = (u 1 +v 1,u 2 +v

Lisätiedot

Kaksirivisen matriisin determinantille käytämme myös merkintää. a 11 a 12 a 21 a 22. = a 11a 22 a 12 a 21. (5.1) kaksirivine

Kaksirivisen matriisin determinantille käytämme myös merkintää. a 11 a 12 a 21 a 22. = a 11a 22 a 12 a 21. (5.1) kaksirivine Vaasan yliopiston julkaisuja 97 5 DETERMINANTIT Ch:Determ Sec:DetDef 5.1 Determinantti Tämä kappale jakautuu kolmeen alakappaleeseen. Ensimmäisessä alakappaleessa määrittelemme kaksi- ja kolmiriviset determinantit.

Lisätiedot

Vapaus. Määritelmä. jos c 1 v 1 + c 2 v c k v k = 0 joillakin c 1,..., c k R, niin c 1 = 0, c 2 = 0,..., c k = 0.

Vapaus. Määritelmä. jos c 1 v 1 + c 2 v c k v k = 0 joillakin c 1,..., c k R, niin c 1 = 0, c 2 = 0,..., c k = 0. Vapaus Määritelmä Oletetaan, että v 1, v 2,..., v k R n, missä n {1, 2,... }. Vektorijono ( v 1, v 2,..., v k ) on vapaa eli lineaarisesti riippumaton, jos seuraava ehto pätee: jos c 1 v 1 + c 2 v 2 +

Lisätiedot

1 Kompleksiluvut 1. y z = (x, y) Kuva 1: Euklidinen taso R 2

1 Kompleksiluvut 1. y z = (x, y) Kuva 1: Euklidinen taso R 2 Sisältö 1 Kompleksiluvut 1 1.1 Määritelmä............................ 1 1. Kertolasku suorakulmaisissa koordinaateissa.......... 4 1.3 Käänteisluku ja jakolasku..................... 9 1.4 Esimerkkejä.............................

Lisätiedot

Suorat ja tasot, L6. Suuntajana. Suora xy-tasossa. Suora xyzkoordinaatistossa. Taso xyzkoordinaatistossa. Tason koordinaattimuotoinen yhtälö.

Suorat ja tasot, L6. Suuntajana. Suora xy-tasossa. Suora xyzkoordinaatistossa. Taso xyzkoordinaatistossa. Tason koordinaattimuotoinen yhtälö. Suorat ja tasot, L6 Suora xyz-koordinaatistossa Taso xyz-koordinaatistossa stä stä 1 Näillä kalvoilla käsittelemme kolmen laisia olioita. Suora xyz-avaruudessa. Taso xyz-avaruudessa. Emme nyt ryhdy pohtimaan,

Lisätiedot

y z = (x, y) Kuva 1: Euklidinen taso R 2

y z = (x, y) Kuva 1: Euklidinen taso R 2 Kompleksiluvut. Määritelmä Tarkastellaan euklidista tasoa R = {(, y), y R}. y y z = (, y) R Kuva : Euklidinen taso R Suorakulmaisessa koordinaatistossa on -akseli ja y-akseli. Luvut ja y ovat pisteen z

Lisätiedot

Matemaattinen Analyysi / kertaus

Matemaattinen Analyysi / kertaus Matemaattinen Analyysi / kertaus Ensimmäinen välikoe o { 2x + 3y 4z = 2 5x 2y + 5z = 7 ( ) x 2 3 4 y = 5 2 5 z ) ( 3 + y 2 ( 2 x 5 ( 2 7 ) ) ( 4 + z 5 ) = ( 2 7 ) yhteys determinanttiin Yhtälöryhmän ratkaiseminen

Lisätiedot

3 Lineaariset yhtälöryhmät ja Gaussin eliminointimenetelmä

3 Lineaariset yhtälöryhmät ja Gaussin eliminointimenetelmä 3 Lineaariset yhtälöryhmät ja Gaussin eliminointimenetelmä Lineaarinen m:n yhtälön yhtälöryhmä, jossa on n tuntematonta x 1,, x n on joukko yhtälöitä, jotka ovat muotoa a 11 x 1 + + a 1n x n = b 1 a 21

Lisätiedot

Määritelmä Olkoon T i L (V i, W i ), 1 i m. Yksikäsitteisen lineaarikuvauksen h L (V 1 V 2 V m, W 1 W 2 W m )

Määritelmä Olkoon T i L (V i, W i ), 1 i m. Yksikäsitteisen lineaarikuvauksen h L (V 1 V 2 V m, W 1 W 2 W m ) Määritelmä 519 Olkoon T i L V i, W i, 1 i m Yksikäsitteisen lineaarikuvauksen h L V 1 V 2 V m, W 1 W 2 W m h v 1 v 2 v m T 1 v 1 T 2 v 2 T m v m 514 sanotaan olevan kuvausten T 1,, T m indusoima ja sitä

Lisätiedot

(1.1) Ae j = a k,j e k.

(1.1) Ae j = a k,j e k. Lineaarikuvauksen determinantti ja jälki 1. Lineaarikuvauksen matriisi. Palautetaan mieleen, mikä lineaarikuvauksen matriisi annetun kannan suhteen on. Olkoot V äärellisulotteinen vektoriavaruus, n = dim

Lisätiedot

5 Ominaisarvot ja ominaisvektorit

5 Ominaisarvot ja ominaisvektorit 5 Ominaisarvot ja ominaisvektorit Olkoon A = [a jk ] n n matriisi. Tarkastellaan vektoriyhtälöä Ax = λx, (1) missä λ on luku. Sellaista λ:n arvoa, jolla yhtälöllä on ratkaisu x 0, kutsutaan matriisin A

Lisätiedot

6 Vektoriavaruus R n. 6.1 Lineaarikombinaatio

6 Vektoriavaruus R n. 6.1 Lineaarikombinaatio 6 Vektoriavaruus R n 6.1 Lineaarikombinaatio Määritelmä 19. Vektori x œ R n on vektorien v 1,...,v k œ R n lineaarikombinaatio, jos on olemassa sellaiset 1,..., k œ R, että x = i v i. i=1 Esimerkki 30.

Lisätiedot

tyyppi metalli puu lasi työ I II III metalli puu lasi työ

tyyppi metalli puu lasi työ I II III metalli puu lasi työ MATRIISIALGEBRA Harjoitustehtäviä syksy 29 ( 7 1 1 4 1 1. Olkoot, B = 1 5 2 5 3 Määrää 2A, B 2A, A T, ( 2A) T, (A T ) T. ), C = ( 1 ) 4 4 ja E = 7. 3 2. Olkoot A, B, C ja E kuten edellisessä tehtävässä.

Lisätiedot

Alkeismuunnokset matriisille, sivu 57

Alkeismuunnokset matriisille, sivu 57 Lineaarialgebra (muut ko) p. 1/88 Alkeismuunnokset matriisille, sivu 57 AM1: Kahden vaakarivin vaihto AM2: Vaakarivin kertominen skalaarilla c 0 AM3: Vaakarivin lisääminen toiseen skalaarilla c kerrottuna

Lisätiedot