Komputergrafika – Matematikai alapok

Dr. Kovács Emőd

Eszterházy Károly Főiskola, Matematikai és Informatikai Intézet

Új Széchenyi Terv logó.

A tananyag a TÁMOP-4.1.2-08/1/A-2009-0046 számú Kelet-magyarországi Informatika Tananyag Tárház projekt keretében készült. A tananyagfejlesztés az Európai Unió támogatásával és az Európai Szociális Alap társfinanszírozásával valósult meg.

A Kelet-magyarországi Informatika Tananyag Tárház logója.

Magyarország megújul logó.

Nemzeti Fejlesztési Ügynökség http://ujszechenyiterv.gov.hu/ 06 40 638-638

Az EU logója.

2011


Tartalom

Bevezetés
1. Vektorok (Vectors)
Helyvektorok a térben
Műveletek vektorokkal
Vektorok normalizálása (Normalization)
Vektorok összeadása (Addition)
Két vektor különbsége (Subtraction)
Vektor szorzása számmal (skalárral) (Scalar multiplication)
Két vektor skaláris szorzata (Dot product)
Példák skaláris szorzás használatára
Két vektor vektoriális szorzata (Cross product)
Példák vektoriális szorzat használatára
2. Mátrixok (Matrices)
Nevezetes mátrixok
Mátrix determinánsa (Determinant)
Mátrixműveletek (Matrix Operations)
Mátrixok összeadása (Matrix addition and subtraction)
Mátrix szorzása számmal (Matrix skalar multiplication)
Mátrixok szorzása (Matrix multiplication)
3. Koordináta-rendszerek (Coordinate system)
Descartes-féle koordináta-rendszer (Cartesian coordinate system)
Kétdimenziós Descartes-féle koordináta-rendszer
Háromdimenziós Descartes-féle koordináta-rendszer
Görbevonalú koordináta-rendszer
Polárkoordináta-rendszer (Polar coordinate system)
Hengerkoordináta-rendszer (Cylindrical coordinates)
Gömbi koordináta-rendszer (Spherical coordinates)
4. Homogén koordináták
Síkbeli homogén koordináták
Két pontra illeszkedő egyenes egyenlete
Pont és egyenes távolsága
Két egyenes metszéspontjának meghatározása
Térbeli homogén koordináták
5. Ponttranszformációk (Linear transformation)
Egybevágósági transzformáció (Congruence transformation)
Identitás (Identity)
Eltolás (Translation)
Forgatás (Rotation)
Tükrözés (Reflection)
Hasonlósági transzformáció (Similarity transformation)
Affin transzformációk (Affine transformations)
Skálázás (Scaling)
Nyírás (Shear)
Projektív transzformáció (Projective transformation)
Térbeli transzformációk szorzata (Concatenation of transformations)
Forgatás a három koordináta-tengely körül
Tetszőleges tengely körüli forgatás (Rotation about an arbitrary axis)
Tetszőleges síkra való tükrözés (Reflection about an arbitrary plane)
6. Koordináta-transzformációk (Coordinatesystem transformation)
7. Tér leképezése a síkra
Párhuzamos vetítés
Centrális vetítés
8. Görbék megadása
Interpoláció
Hermite-görbe
Approximáció
Bézier-görbe
A de Casteljau-algoritmus
A Bézier-görbe előállítása Bernstein-polinommal
A Bézier-görbe néhány tulajdonsága
Harmadfokú Bézier-görbék
Kapcsolódó Bézier-görbék
Cardinal spline
9. B-spline görbe és felület
Normalizált B-spline alapfüggvény
B-spline görbe
Tulajdonságok
B-spline görbék kapcsolódása
B-spline görbe előállítása
Cox-de Boor algoritmus
Interpoláció B–spline görbével
Racionális görbék
Racionális Bézier görbe
Racionális B-spline görbe, NURBS
B-spline felület
10. Függelék
Window-viewport transzformációk
Uniform eszköz transzformáció
Window-viewport tarnszformáció 2. változat
Programkódok
Irodalomjegyzék

Bevezetés

A komputergrafika az informatika (Computer Science) egyik legdinamikusabban fejlődő területe. Ma már szinte minden számítógép iránt egy kicsit is érdeklődő ember fantáziáját megmozgatják a mai fantasztikus grafikai képességek, amire korunk eszközei lehetőséget teremtenek. Rengetegen el kezdenek foglakozni a számítógépi grafikával, de igen hamar szembetalálkoznak olyan matematikai hiányosságokkal, ami a későbbi továbbhaladásukat megakadályozza. Ez a jegyzet elsősorban a programtervező informatikusok BSc hallgatóknak készült, ahol a képzési programban egy bevezető grafikai kurzus után lehetőség van a komputergrafikát emelt szinten is tanulni. Mivel nagyon különböző előképzettséggel, és matematikai tudással jelentkeznek a hallgatók, ezért tartottuk szükségesnek a jegyzet elkészítését. Bizonyos helyeken – elsősorban a címeknél – a magyar elnevezés angol terminológiában használt megfelelőjét is megadjuk, ezzel az idegen nyelvű irodalomban való tájékozódást kívánjuk segíteni. A példákat C♯-ban készítettem el, a kódolás során pedig a Microsoft Visual Studio környezetet használtam. A programkódokat a könyv végén külön fejezetben lehet megtalálni. Mivel ez a jegyzet ingyenesen elérhető mindenki számára, reméljük, hogy nemcsak a hallgatók, hanem más érdeklődők is szívesen olvassák. Minden esetleges hibát, észrevételt szívesen veszünk a kedves olvasótól az alábbi email címen: emod@ektf.hu. Az olvasók segítségével, az elektronikus jegyzet adta formai lehetőség révén a javítást rövid időn belül tudjuk megtenni.

1. fejezet - Vektorok (Vectors)

[105] A vektorokat a legkülönbözőbb összefüggésekben használjuk a komputergrafikában. Használatosak például az árnyalásnál, ahol szükségünk van felület normálisa és a fénysugár iránya által bezárt szögre. A számítógépes játékokban ábrázolhatjuk egy tárgy mozgásának irányát és sebességét is vektorral.

A vektor két jellemző adattal rendelkezik: nagysággal és iránnyal (beleértve az irányítást is). A vektort az iránya különbözteti meg a skaláris mennyiségektől, amelyeknek csak nagyságuk van. Háromdimenziós vektort egy számhármassal írunk le , melynek minden komponense skalár.

1.1. ábra. Vektor - irányított szakasz

A vektor, mint irányított szakasz, abban különbözik a szakaszoktól, hogy valójában két pont kapcsolatát írja le. A vektorok elemi geometriai használata mellett (például: eltolás jellemzése) felmerül az ötlet, hogy vektorokat feleltessünk meg pontoknak. Minden pontot egy ponthoz viszonyítsunk, az irányított szakaszok kezdőpontját közösnek választva. Ennek segítségével a már megismert koordináta-rendszerbeli problémákat egy új szemszögből vizsgálhatjuk meg. Az irányított szakaszokat a végpontjuk koordinátáival jellemezzük.

Bázisvektorok olyan speciális vektorok, melyek lineáris kombinációjával felírhatjuk a tér (sík) bármely vektorát. A bázisvektorok vagy ortogonálisak, ekkor páronként merőlegesek egymásra, normáltak, azaz a vektorok egységnyi hosszúak, vagy teljesítik mindkét előző tulajdonságot, akkor ortonormáltak.

Helyvektorok a térben

[93] Megtehetjük, hogy pontokat egy adott pontból kiinduló vektorokkal határozunk meg. Ehhez egy vonatkozási pontot kell rögzíteni, általában ez megegyezik a koordináta-rendszer origójával. Az origóból induló vektorokat helyvektoroknak nevezzük. A helyvektorok és a sík (tér) pontjai között egyértelmű megfeleltetés van. Valamint a sík (tér) bármely vektorának meg tudunk feleltetni egy vele egyenlő helyvektort. Egy helyvektort végpontjával, illetve végpontjának koordinátáival adhatunk meg. Így a helyvektorok kölcsönösen megfeleltethetők a sík pontjainak.

A vektorokat három adat jellemzi: az irány, az irányítás és a hossz (abszolútérték):

  • Minden pontot egyértelműen megadhatunk egy helyvektorral, amelynek jelölése: . Az i, j, k alapvektorok (bázisvektorok) rendre a koordinátarendszer x-, y-, z- tengelyei irányába mutató egységvektorok.

  • A vektor irányát a vektor irányszögével, vagy annak valamely szögfüggvényével adhatjuk meg. Irányszögeknek a vektor és az egyes tengelyek által bezárt szögeket nevezzük. Ezek koszinuszai az iránykoszinuszok: , , , ahol teljesül az egyenlőség. Az illetve iránykoszinuszokhoz tartozó vektorok egymással bezárt szögére érvényes a összefüggés. Ha , akkor a két irány merőleges egymásra.

    1.2. ábra. A vektor irányszöge

  • Bármely vektor hosszát, abszolútértékét megkapjuk,ha a koordinátáinak négyzetösszegéből négyzetgyököt vonunk:

Műveletek vektorokkal

Vektorok normalizálása (Normalization)

Vektor normalizálása esetén a vektor iránya nem változik, viszont a hossza egy lesz. A normalizált vektort úgy kaphatjuk meg, hogy az eredeti vektort elosztjuk a hosszával:

ahol

Az helyvektor esetén:

Vektorok összeadása (Addition)

Adott két vektor. Az egyik vektor végpontjából indítjuk a másik vektort. Az első kezdőpontjából a második végpontjába mutató vektort a két vektor összegvektorának nevezzük. Több vektor összeadása esetén először két vektort összegzünk, majd az összeghez adjuk hozzá a következő összeadandót.

1.3. ábra. Vektorok öszege

Tulajdonságai:

  • Kommutatív:

  • Asszociatív:

  • Bármely vektorhoz a nullvektort hozzáadva visszakapjuk az eredeti vektort: .

  • Egy a vektorhoz megadható olyan -a vektor, hogy a két vektor összege nullvektor. Az ilyen módon megadott vektort az eredeti vektor ellentettjének nevezzük: .

Helyvektorok esetén az összeadásvektor koordinátáit az egyes vektorok megfelelő koordinátáinak összege adja. Azaz és helyvektorok esetén:

Két vektor különbsége (Subtraction)

Az különbségvektorán az összegvektort értjük, azaz azt a vektort, amelyet úgy kapunk, hogy a-hoz hozzáadjuk b ellentettjét. Ha az a és b vektorokat egy pontból indítjuk ki, akkor a b végpontjából az a végpontjába mutató vektor az .

1.4. ábra. Vektorok különbsége

Tulajdonságai:

  • A kivonás nem kommutatív, és nem asszociatív művelet.

  • Ha nullvektort vonunk ki egy a vektorból, visszakapjuk az a vektort:

  • Ha a nullvektorból vonjuk ki az a vektort, akkor az a vektor ellentettjéhez jutunk:

  • Ha egy vektorból önmagát vonjuk ki a művelet 0 vektort eredményez:

Helyvektorok különbségének koordinátáit az egyes vektorok megfelelő koordinátáinak különbsége adja. Azaz és helyvektorok esetén:

Vektor szorzása számmal (skalárral) (Scalar multiplication)

Adott egy a vektor és egy szám. Az a vektor számszorosán a következő vektort értjük:

  • Ha vagy , akkor

  • Ha és , akkor hosszúságú vektort kapunk, melynek iránya:

    • esetén a-val megegyező,

    • esetén a-val ellentétes.

Tehát egy vektornak egy számmal való szorzata a vektor hosszának növekedését vagy csökkenését vonja maga után.

1.5. ábra. Vektor szorzása

Tulajdonságai:

  • Bármely vektor -val vett szorzata nullvektort eredményez: .

  • A nullvektornak bármely számmal vett szorzata nullvektor: .

Egy helyvektor skalárszorosának koordinátáit a vektor koordinátáinak adott skalárral való szorzásával kapjuk. Azaz helyvektor esetén:

Adottak a és b vektorok, valamint az és valós számok,akkor a velük képzett vektort az a és b vektor lineáris kombinációjának nevezzük, ha , akkor konvex lineáris kombinációról beszélünk. Pl. a szakasz tetszőleges pontjába mutató helyvektor a szakasz kezdő és végpontjába mutató vektorok konvex lineáris kombinációja.

Két vektor skaláris szorzata (Dot product)

Euklideszi térben adott a és b vektorok skaláris szorzata a két vektor hosszának és az általuk közbezárt szög koszinuszának szorzata. Azaz:

Tehát a skaláris szorzat egy valós szám.

A művelet tulajdonságai:

  • Kommutatív:

  • Nem asszociatív: , mivel a szorzás bal oldala az a vektor egy számszorosa, míg a jobb oldal a c vektoré.

  • Számmal való szorzásra asszociatív:

  • Összeadásra nézve disztributív

  • Ha és akkor , azaz a skaláris szorzat egységvektorok esetén megegyezik a közbezárt szög koszinuszával.

Két vektor skaláris szorzata akkor és csak akkor 0, ha a két vektor merőleges egymásra. Tehát ha merőlegesek, akkor skaláris szorzatuk nulla, ha pedig a skaláris szorzatuk nulla, akkor merőlegesek.

A derékszögű Descartes-féle koordináta rendszerben a párhuzamos egységvektorok skaláris szorzatainak értéke egység, míg az egymásra merőleges egységvektorok skaláris szorzatai nulla értéket ad:

A vektorok skaláris szorzatának eredménye a koordináta komponensekkel is megadható, ha figyelembe vesszük az egységvektorok skaláris szorzataira vonatkozó összefüggéseket. Így az és helyvektorok skaláris szorzata a következő alakban írható:

Az irodalomban a skaláris szorzatra a zárójeles ill. az alsópont jelölést is szokás használni:

Példák skaláris szorzás használatára

[105] Két vektor hajlásszögének kiszámítása: A skaláris szorzás legáltalánosabb használata két vektor hajlásszögének a meghatározása. Hajlásszöget számolunk például árnyékolásnál, vagy láthatósági tesztelésnél. Árnyékolásnál a fény irányvektora és a felületi normális szögét számítjuk ki, míg láthatósági vizsgálatnál a nézeti irány, illetve a felületi normális által bezárt szög szükséges.

Használjuk a két vektor különbségére a koszinusz-tételt. Ebből azt kapjuk, hogy:

ahol a két vektor által bezárt szög.

Valamint a négyzetre emelést elvégezve teljesül, hogy

ezért fennáll az

egyenlőség, amiből átrendezéssel az alábbi összefüggést kapjuk:

Ami pontosan azt jelenti, hogy két vektor hajlásszögének koszinuszát megkaphatjuk a normalizált vektoraik skalárszorzatával.

Vektornak egy másik vektorra történő merőleges vetítése: A skaláris szorzat másik alkalmazása vektornak egy másik vektorra történő vetületének megadása. Adott egy b egységvektor. Az a vektornak szeretnénk a b vektorra történő vetületét megadni, az eredményvektort jelöljük a’-vel. Ekkor azt kapjuk, hogy

mivel

Tehát az a és b vektorok skaláris szorzata megegyezik az a vektornak a b vektorra vonatkozó vetületének hosszával.

1.6. ábra. Az vektor merőleges vetülete a vektorra

A skaláris szorzat előjele: A közbezárt szög jellemzésére szolgál a skaláris szorzat előjele. Két vektor skaláris szorzatának előjelét a közbezárt szögük koszinusza határozza meg

Két vektor vektoriális szorzata (Cross product)

Két vektor vektoriális szorzata vektort eredményez. Az a és b vektorok vektoriális szorzatának azt a v vektort tekintjük, amelynek az hosszúsága az a és a b vektorok által kifeszített paralelogramma területével egyenlő, iránya merőleges mind az a, mind a b vektorra, olyan irányítással, hogy az a, b és v vektorok jobbsodrású hármast alkotnak. Ezért vektoriális szorzattal lehet a legegyszerűbben két vektorra merőleges vektort megadni.

1.7. ábra. Vektoriális szorzat

1.8. ábra. A vektoriális szorzat hossza:

Tulajdonságai:

  • Antikommutatív:

  • Az összeadásra nézve disztributív:

    Mivel a vektoriális szorzat nem kommutatív, ezért mindkét alak felírására szükség van.

  • Skalárral való szorzás:

  • Nem asszociatív:

  • Teljesíti a Jacobi azonosságot:

  • Az a vektornak az e egységvektorra merőleges összetevője előáll alakban.

Két vektor vektoriális szorzata akkor és csak akkor nullvektor, ha a két vektor párhuzamos.

A derékszögű, Descartes-féle koordináta-rendszerben a párhuzamos egységvektorok vektoriális szorzatai nulla hosszúságú vektorokat eredményeznek, míg az egymásra merőleges egységvektorok vektoriális szorzatai mindkét vektorra merőleges, egységnyi hosszúságú, egységvektorokat adnak.

Az és vektorok vektoriális szorzatát a legegyszerűbben a következő mátrix determinánsának kiszámításával (Sarrus-szabály) kapjuk:

Példák vektoriális szorzat használatára

[105] Poligon felületi normálisa: A grafikában kitüntetett szerepe van azoknak a vektoroknak, melyek merőlegesek egy felületre. Egy testet határoló poligon (sokszögvonal) normálvektora a poligon három pontja segítségével számítható ki. Három pont két vektort és definiál, melyek vektoriális szorzatából előállítható a felületi normálisa a következő alakban:

1.9. ábra. Poligonlap normálvektora

Amikor meghatározzuk egy adott poligon felületi normálisát, akkor a vektoriális szorzatnak a poligont tartalmazó test szempontjából kifelé kell mutatnia. Egy jobbsodrású rendszerben a vektoriális szorzat követi a jobbkézszabályt. Ha a hüvelykujj és a mutatóujj a , illetve vektor irányába mutat, akkor a iránya megegyezik a középsőujj irányával.

Görbe felületi normálisa: Amennyiben a felszín egy másodrendű paraméteres (bicubic parametric) görbe, akkor a normálvektor iránya folyamatosan változik a felületen. Valamelyik (u, v) pontban kiszámítjuk a felületi normálist a vektoriális szorzás segítségével. Ehhez szükséges ebben a pontban az érintősíkot kifeszítő két érintővektor. Amennyiben a felszínt a Q(u,v) függvény állítja elő, akkor a két érintővektor a parciális deriváltak segítségével áll elő

illetve

alakban. Tehát a felületi normálist ezen két parciális derivált vektoriális szorzataként definiálhatjuk:

1.10. ábra. Felületi normális

2. fejezet - Mátrixok (Matrices)

[92] A matematikában – de általában az életben is – gyakoriak az olyan rendszerek, amelynek „jellemzéséhez” több szám kell. (Például egy tetraéder jellemezhető az éleinek hosszával, egy elektromos hálózat a csomópontok közötti részek ellenállásának nagyságával, stb.)

Ezekben az esetekben természetesen nem csak az számít, hogy milyen adatok szerepelnek, hanem az is, hogy ezek az adatok egymáshoz képest hogyan helyezkednek el. Ezzel lehet meghatározni, hogy egy-egy adat mit jellemez. Ilyen esetekben a szóban forgó alakzathoz tartozó mátrixról beszélünk.

A mátrixoknak különböző alakjuk lehet annak megfelelően, hogy a benne szereplő számokat hogyan helyeztük el. A leggyakrabban téglalap alakú mátrixokat használunk.

Mátrixaknak tekintjük tehát adatoknak téglalap alakban való elrendezését. E téglalapokról feltesszük, hogy véges sok soruk és véges sok oszlopuk van. A mátrixban szereplő adatokat a mátrix elemeinek nevezzük. Ezek az adatok általában számok, de más adatok is előfordulhatnak, például függvények, vagy újabb mátrixok. Az elemeket azzal határozzuk meg, hogy egy-egy elemről megmondjuk, melyik sorban és melyik oszlopban áll. Az itt lévő sor- és oszlopszámot az elemhez írjuk kettős indexként. Az valamely mátrixnak az i-edik sorában és j-edik oszlopában lévő elemet jelöli. Tekintsünk egy általános -es mátrixot, amelynek sora és oszlopa van:

A mátrixokat rendszerint zárójelbe tesszük, jelölve hogy a táblázatot egyetlen egységként kezeljük. Az matematikai irodalomban általában kerek zárójelet használnak, ebben a könyvben a komputergrafikában szokásos szögletes zárójeles jelölést alkalmazzuk.

Tehát a mátrixot azzal tudjuk meghatározni, ha megadjuk a sorainak és oszlopainak számát, valamint azt, hogy egy-egy előírt helyen milyen szám áll. Ez a szám tehát egy helynek a függvénye. A hely pedig nem más, mint egy számpár. Így a mátrixot egy olyan függvénynek tekintjük, amely egy természetes számokból álló számpárhoz egy számot rendel hozzá. A számpárban szereplő első számnak a sorok számánál, a második számnak pedig az oszlopok számánál kell kisebb vagy egyenlőnek lennie. Vegyük figyelembe, hogy számos programnyelvben nullától kezdődik a számozás, ekkor érteleszerűen 1-et le kell vonni minden indexelésből. Speciálisan egyetlen sort vagy egyetlen oszlopot, sőt egyetlen elemet is mátrixnak tekinthetünk.

Két mátrixot akkor tekintünk egyenlőnek, ha ugyanannyi soruk és oszlopuk van, és a megfelelő helyeken álló elemek megegyeznek. Viszont nem kell megkövetelnünk az értékkészletek megegyezését, vagyis, ha például egy valós elemű mátrix minden eleme racionális, akkor nem tekintjük különbözőnek attól a mátrixtól, amelyik „ugyanez”, csak éppen racionális elemű mátrixnak értelmeztük.

Nevezetes mátrixok

  • Ha a mátrixnak egy sora vagy egy oszlopa van, azaz -es vagy -es, akkor sor-, illetve oszlopvektornak nevezzük.

  • Amennyiben a mátrix sorainak száma megegyezik az oszlopainak számával, a mátrix négyzetes.

  • A diagonálmátrix olyan négyzetes mátrix, melynek csak főátlójában vannak 0-tól eltérő elemek.

  • Az egységmátrix olyan diagonálmátrix, melynek főátlóbeli elemei egységek, jele: .

  • Nullmátrix minden eleme 0.

  • Egy mátrix transzponáltja a sorok és oszlopok felcserélésével nyert mátrix.

    Pl:

    továbbá érvényesek az alábbi szabályok:

  • Egy A négyzetes mátrixnak akkor létezik inverze, ha az mátrix kielégíti az és egyenleteket, ekkor az inverzmátrix. Egy mátrixnak csak abban az esetben lehet inverze, ha a determinánsa nem nulla, . Érvényesek az alábbi szabályok:

  • -es mátrix inverze:

  • Az ortogonális mátrix olyan négyzetes mátrix, melynek transzponáltja egyben az inverze is. A térben minden tengely körüli elforgatás olyan ortogonális mátrixszal írható fel, melynek determinánsa 1. A tengely körüli elforgatás és síkra vonatkozó tükrözés szorzata pedig -1 determinánsú ortogonális mátrix.

Mátrix determinánsa (Determinant)

A determináns fogalmával mindenütt lehet találkozni, ahol négyzetes (vagy quadratikus) mátrix szerepel, azaz olyan mátrixok, amelyeknél a sorok száma megegyezik az oszlopok számával. A determináns nem más, mint egy négyzetes mátrixhoz rendelt szám.

A determináns kiszámolható kifejtéssel. az egyelemű mátrix determinánsa megegyezik az elem értékével. A másodrendű determinánst a következőképp lehet kiszámítani:

Harmadrendű determinánst a Sarrus-féle szabállyal számítjuk ki (lásd http://en.wikipedia.org/wiki/Rule_of_Sarrus).

A magasabb rendű determináns értékét úgy kapjuk meg, hogy valamely sorának elemeit megszorozzuk a hozzájuk tartozó előjeles aldeterminánsokkal, és ezeket a szorzatokat összeadjuk.

Bármely n természetes szám esetén az n-ed rendű determinánsokra igazak az alábbiak:

  • Ha a mátrix főátlója fölött (alatt) csupa 0 áll, akkor a determináns értéke a főátlóban álló elemek szorzata. Speciálisan, ha a fődiagonális minden eleme 1, és a többi elem 0, akkor a determináns értéke 1 lesz.

  • Ha a mátrix valamely sorának vagy oszlopának minden eleme 0, akkor a determináns értéke is 0.

  • Ha a mátrix egy sorát (vagy oszlopát) egy c valós számmal megszorozzuk, akkor a determináns értéke is c-szeresére változik.

  • Ha a négyzetes mátrix sorait permutáljuk, akkor páros permutálás esetén nem változik a determináns, páratlan permutálás esetén előjelet vált. Speciálisan, ha a determináns két sorát felcseréljük, az értéke -szeresére változik.

  • Ha egy mátrix két sora (vagy két oszlopa) megegyezik, akkor a determináns értéke 0.

  • A mátrix transzponáltjának a determinánsa megegyezik az eredeti mátrix determinánsával.

  • A determináns értéke nem változik, ha a mátrix egyik sorához (oszlopához) hozzáadjuk valamely másik sor (oszlop) számszorosát.

A mátrix determinánsa Gauss-eliminációval is kiszámolható. Az eljárás lényege, hogy a sorokon vagy oszlopokon végrehajtott lineáris transzformációt addig kell folytatni, míg felső háromszögmátrixhoz nem jutunk. Ekkor a determináns értékét a főátlóbeli elemek szorzataként kapjuk. A Gauss-elimináció lépései során a determináns értéke nem változik meg. A Gauss-elimináció lépései a következők:

  • Keresünk egy nem nulla elemet, és sor- vagy oszlopcserével a főátlóba tesszük. Mivel a páratlan számú cserék megváltoztatják a determináns előjelét, ezért a cserék számát feljegyezzük.

  • Az elem alatt lévő elemeket kinullázzuk. Mindezt két lépéssel lehet megoldani, a mátrix sorának számmal szorzásával, és egyik sorhoz a másik sor skalárszorosának hozzáadásával.

  • Az előző két lépést kell ismételni úgy, hogy a kiválasztott elemet mindig másik sorból és másik oszlopból választjuk.

  • Ha két sor vagy oszlop megegyezik, illetve ha egy sor vagy oszlop minden eleme 0, akkor nincs szükség további átalakításokra, mert a determináns értéke 0.

  • Különben felső háromszögmátrixot kapunk, melynek determinánsa a főátlóban álló elemek szorzata.

A mátrix inverze pedig Gauss-Jordan eliminációval határozható meg. Az algoritmus lényege az, hogy a mátrix mellé felírjuk a vele azonos méretű egységmátrixot, majd addig használjuk a sorokon vagy oszlopokon végrehajtott lineáris transzfomációt, amíg az eredeti mátrix helyén egységmátrix keletkezik. Ekkor az egységmátrix helyén kapjuk meg az inverzmátrixot. Numerikus algoritmusok megoldására ajánljuk a „Numerical Recipes: The Art of Scientific Computing” irodalmat (lásd [106]), ahol programkódokat is közölnek a szerzők.

Mátrixműveletek (Matrix Operations)

A mátrixokat a számok egy általánosításaiként tekinthetjük. Pontosabban szólva, az egyelemű mátrixokat majdnem azonosnak tekinthetjük a számokkal. Tekintettel arra, hogy számokkal különböző műveleteket lehet elvégezni, ezért lehetőség van, hogy a műveleteket általában mátrixokra is kiterjesszük. E kiterjesztésnél természetesen vigyázni kell arra, hogy speciális esetben – vagyis egyelemű mátrixokra – a művelet ugyanaz legyen, mint számokra. Két eltérés tapasztalható csak a számműveletek és a mátrixműveletek között, ugyanis a mátrixműveletek között nem szerepel az osztás, és nincs szükség a szorzás kommutativitására sem.

Mátrixok összeadása (Matrix addition and subtraction)

Az és mátrix összeadása akkor végezhető el, ha alakjuk megegyezik, azaz mindkettő mn-es. Ennek megfelelően az eredménymátrix alakja is mn-es lesz, és az mátrix i-edik sorában és j-edik oszlopában lévő elem az A, illetve B mátrix i-edik sorában és j-edik oszlopában lévő és elemek összege. Például:

Tulajdonságai:

  • Kommutatív:

  • Asszociatív:

  • Ha egy 0 nullmátrix ugyanolyan típusú, mint az A mátrix, akkor teljesül: .

  • Minden A mátrixhoz található olyan B mátrix, melyre teljesül:

    .

  • Tetszőleges A és B mátrixokhoz létezik pontosan egy olyan X mátrix, amelyre . Ezt az X mátrixot a jelöli. E mátrix előállítását értelmezhetjük a mátrixokon végzett kivonás műveleteként.

Mátrix szorzása számmal (Matrix skalar multiplication)

Egy A mátrix r valós számmal való szorzatán azt a mátrixot értjük, melyet A-ból úgy kapunk, hogy A minden elemét megszorozzuk r-rel. Például:

Tulajdonságai:

Az utolsó tulajdonság esetében értelmeznünk kell a mátrix közötti szorzást.

Mátrixok szorzása (Matrix multiplication)

A és B mátrixok között a szorzás művelete csak akkor értelmezhető, ha A-nak ugyanannyi oszlopa van, mint ahány sora B-nek. Amennyiben A -es és B -es mátrix, akkor a C szorzat mátrix egy -es típusú mátrix lesz. A szorzat mátrix -edik sorának és -edik oszlopának találkozásánál lévő elemet úgy kapjuk meg, hogy az első mátrix -edik sorának minden elemét összeszorozzuk a második mátrix -edik oszlopának minden elemével, majd a szorzatokat összeadjuk. A definíciót megfogalmazhatjuk a skaláris szorzat segítségével is. A elem az A mátrix -edik sorvektorának és a mátrix -edik oszlopvektorának a skaláris szorzata, melyet a következő képlet alapján kapunk meg:

ezt kell elvégeznünk minden elemen, azaz

tehát három egymásba ágyazott ciklussal lehet megoldani a feladatot (lásd programozási melléklet)

2.1. ábra. Az -es szorzatmátrix elemének kiszámítása

Például:

A művelet tulajdonságai:

  • Asszociatív:

  • Mindkét oldalról disztributív:

  • Skalárral való szorzás:

  • Egy -es A mátrixot akár balról, akár jobbról szorzunk egy -es egységmátrixszal, egyaránt az eredeti A mátrixot kapjuk eredményül. , ill. .

  • A mátrixok szorzása nem kommutatív: . Gyakran az is előfordul, hogy az A mátrix szorozható a B-vel, de a tényezők felcserélésével már nem értelmezhető a művelet.

  • Mátrixok szorzatának inverzére és transzponáltjára érvényesek a következő szabályok:

    Megfigyelhetjük, hogy a transzponáltakat illetve az inverz mátrixokat fordított sorrendben kell összeszorozni. Mivel a szorzás nem kommutatív, ezért fontos ügyelnünk a sorrendre.

3. fejezet - Koordináta-rendszerek (Coordinate system)

[102] Feladatunk a különböző tárgyak geometriai sajátosságainak leírása. Ehhez valamilyen megállapodásra van szükségünk, ilyen a vonatkozási pont és a lépték. Ezeket a megállapodásokat összességében nevezzük koordináta-rendszernek. Ha kiválasztunk egy koordináta-rendszert, a tárgy bármely pontjának térbeli helyzetét néhány számérték segítségével meg tudjuk adni.

Azt, hogy melyik koordináta-rendszert érdemes alkalmazni az ábrázolandó alakzat határozza meg. Természetesen bármely koordináta-rendszerről át lehet térni egy másikra a megfelelő képletek segítségével. Ez a megfeleltetés kölcsönösen egyértelmű.

Bár a koordináta-rendszerek megválasztásához a lehetőségek száma végtelen, a gyakorlatban mégis csak néhány típust használunk.

Descartes-féle koordináta-rendszer (Cartesian coordinate system)

A leggyakrabban alkalmazott koordináta-rendszer a Descartes-féle. A következőkben a kétdimenziós és háromdimenziós esetet ismertetjük.

Kétdimenziós Descartes-féle koordináta-rendszer

A kétdimenziós eset jól ismert, itt csak arra térünk ki, hogy a komputergrafikában az origó helyzete általában a bal felső sarok, s az y tengely lefelé növekszik.

3.1. ábra. Origó a bal felső sarokban

Speciális esetekben, pl. a teknőcgrafikában előfordul, hogy a koordináta-rendszer kiindulópontja a képernyő közepén található, s az y tengelyirány is fölfelé növekszik. A komputergrafikában hasznát algoritmusok, így az általunk megadott raszteres algoritmusok is ebben a hagyományos rendszerben készülnek, mintha a matematika füzetünkben dolgoznánk. Ez nem okoz nehézséget, mert egy egyszerű ponttranszformációval áttérhetünk a 3.1. ábrán bemutatott, egyébként a monitorok kezelésének szokásos rendszerére. Azaz tengelyre való tükrözésre, az origó középre való eltolására és általában skálázásra (nagyításra) van szükség. Amikor erről megfeledkezünk, akkor születnek olyan tipikus hibák, mint amikor a függvényt ábrázoljuk hibásan (lásd 3.2. ábra).

3.2. ábra. Hibás ábrázolás!

Háromdimenziós Descartes-féle koordináta-rendszer

A Descartes-féle koordináta-rendszerben a három tengely egymásra merőleges, és egy pont helyzetét – koordinátáit – az x, y és z tengelyektől mért távolsága határozza meg. A tengelyek metszéspontja az origó. Az origóból kiinduló, és a tengelyek irányába mutató, egymásra kölcsönösen merőleges egységvektorokat nevezzük alapvektoroknak vagy bázisvektoroknak. A pontba mutató helyvektor felírható a tengelyeken vett egységvektorok (bázisvektorok) lineáris kombinációjaként: .

3.3. ábra. Descartes-féle koordináta-rendszer

A tárgyakat általában jobbsodrású rendszerben ábrázoljuk. Szemléletesen ez azt jelenti, ha az x, y, z jobb kezünk hüvelyk, mutató, és középső ujjunkkal forgatással fedésbe hozható. Ellenkező esetben balsodrású koordináta-rendszerről beszélünk. Más szemlélet szerint egy koordináta-rendszer akkor jobbsodrású, ha annak egy ortogonális bázisával az vegyes szorzat pozitív, negatív esetben balsodrású a rendszer.

3.4. ábra. Bal- ill. jobbsodrású rendszer

A grafikai programok közül a RenderMan alapértelmezetten balsodrású, míg az OpenGL jobbsodrású koordináta-rendszert használ.

Ha az alapvektoroknál nem tesszük kötelezővé sem az egységnyi hosszúságot, sem azt, hogy derékszöget zárjanak be egymással, akkor a koordináta-rendszer affin (ferdeszögű).

Görbevonalú koordináta-rendszer

[88] Gyakran nem lehet, vagy nem célszerű a Descartes-féle koordináta-rendszert használni. Előfordulhat, hogy a koordináta-rendszer az alakzat minden pontjában más és más, és a koordinátatengelyek állása is pontonként változik az adott feladat jellegéhez illeszkedően. Ha például egy gömb alakú térrésszel kapcsolatos feladatot kell megoldanunk, akkor általában célszerű olyan pontonként változó koordináta-rendszert alkalmaznunk, amely „hozzásimul” a gömb alakjához. Ekkor ugyanis a gömb egyenlete ebben a koordináta-rendszerben egyszerűbb lesz, és ez megkönnyíti a számítást.

Polárkoordináta-rendszer (Polar coordinate system)

[94] A sík pontjait (síkbeli) polárkoordinátákkal is jellemezhetjük. Ezt a koordináta-rendszert az O kezdőpontja (az origó) és egy ebből kiinduló L félegyenes definiál, melynek irányát kezdőiránynak nevezzük. A P pont polárkoordinátái az távolság, valamint a kezdőirány és az OP irány által meghatározott irányított szög. Mivel mértéke bármely egész többszörösével megváltoztatható, ezért minden ponthoz többféle koordinátapár adható meg. Magának az O kezdőpontnak a koordinátája tetszőleges lehet.

3.5. ábra. Polárkoordináta-rendszer

Polárkoordináta-rendszerben egy P pont helyét két adattal adhatjuk meg: (r,), ahol

  • r a sugár (), azaz a pontnak az origótól való távolsága,

  • a szög () pedig az L félegyenes és a sugár által bezárt szög.

Ha Descartes koordináta-rendszerben polárkoordinátákkal kell megadni adatokat, akkor általában origóként a (0,0) pontot L félegyenesként pedig az x tengely pozitív részét (az origótól jobbra eső részt) választjuk. Ekkor az r, polárkoordinátájú pont közönséges koordinátái:

Így például az egységkör poláregyenlete

vagyis egyszerűen

A polárkoordináták különösen alkalmasak az olyan mozgások és hasonlósági leképezések leírására, amelyeknek van invariáns pontjuk. Ekkor ugyanis ezt a pontot kezdőpontnak választva az általános helyzetű pontot

  • az szöggel forgatás az ,

  • félfordulat az ,

  • kezdőegyenesre tükrözés az ,

  • nyújtás ,

  • egy O középpontú nyújtva forgatás a ,

pontba transzformál.

Hengerkoordináta-rendszer (Cylindrical coordinates)

[94] A hengerkoordináta-rendszer a polárkoordináta-rendszer térbeli általánosítása a magasság bevezetésével a tengely irányában. A tér pontjait hengerkoordinátákkal is meg tudjuk adni. Egy alapsíkot (az x, y tengelyek által meghatározott sík), egy rá merőleges irányított egyenest (a z tengely), az alapsíkon belül pedig az origóból induló félegyenest (a x tengely pozitív félegyenese) veszünk fel. Az irányított egyenes mind a vele párhuzamos egyenesek, mind az alapsík irányítását is megszabja. Az irányított alapsíkban a megadott félegyenes egy polárkoordináta-rendszert határoz meg. A P pont polárkoordinátái az alapsíkra vetett vetületének , polárkoordinátái, valamint az irányított szakasz előjeles hossza.

3.6. ábra. Hengerkoordináta-rendszer

Ezért egy P pontot három koordinátája definiál:

  • r a tengelytől mért merőleges távolság;

  • a pont és a tengely által meghatározott sík hajlásszöge a () síkhoz. -t azimuth szögnek is nevezik (lásd gömbikoordináták);

  • a pont és a pont merőleges vetületének, -nek a távolsága;

Sajnálatos módon az irodalomban sok eltérő jelölést használnak, mivel mi a polárkoordinátáknál is -val jelöltük a fenti szöget, ezért használjuk továbbra is így. Ellenben pl. Arfken (lásd [87]) jelölést használja. Több javaslatot is olvashatunk (lásd [103]) az egységesítésre, de elég ha figyelmesen olvassuk az irodalmat, hogy ne keverjük össze a jelöléseket.

[88] Az összes olyan pont, amelynek egyik hengerkoordinátája rögzített érték, ún. koordinátafelületet határoz meg. Így az egyenletű koordinátafelületek a z tengely körüli végtelen hosszú körhengerek, a koordinátafelületek a z tengelyre illeszkedő félsíkok, míg a koordinátafelületek a z tengelyre merőleges síkok.

Ha azokat a pontokat keressük, amelyeknek hengerkoordinátája rögzített, akkor az ún. koordinátagörbéket kapjuk. Így , esetén z tengellyel párhuzamos egyeneseket; , esetén síkkal párhuzamos, z tengely körüli körvonalakat; míg , esetén síkkal párhuzamos, a z tengelytől induló félegyeneseket kapunk.

Ha az alapsíkbeli polárkoordináta-rendszerhez derékszögű koordináta-rendszert illesztünk, és irányított egyenesünket z tengelyül választjuk, akkor a közönséges koordinátákat az polárkoordinátákból a következőképp számítjuk ki:

A Descartes-féle koordinátákból a hengerkoordinátákat a következő összefüggés alapján kapjuk meg:

Gömbi koordináta-rendszer (Spherical coordinates)

[94] A gömbi koordinátákat gömbi polárkoordinátáknak is nevezik. Most egy félsíkot (a z tengely, illetve az x pozitív fele által meghatározott félsík) és ennek határán egy origó kezdőpontú félegyenest (z tengely pozitív fele) veszünk fel. A P pont első koordinátája az távolság. A második koordináta az a irányított szög, amelyet az adott félsík, valamint a vele közös határú, a P pontot tartalmazó félsík határoz meg. Ennek az irányított szögnek a mérésénél azt a forgásirányt választjuk pozitívnak, amely az adott félegyenes irányából nézve pozitívnak látszik. Végül a harmadik koordináta az adott és az OP félegyenes hajlásszöge. Eszerint konvex szög; minden pontra több értékű, mégpedig bármely egész többszörösével megváltoztatható; az O kezdőpont , koordinátái pedig tetszőlegesek lehetnek.

3.7. ábra. Gömbi koordináta-rendszer

Egy pontot három koordináta határoz meg, ahol

  • az origótól mért távolság, azaz a gömb sugara;

  • a pont és a tengely által meghatározott sík, valamint sík közötti hajlásszög az koordinátasíkban, -t azimut szögnek is nevezik;

  • a pontot és az origót összekötő egyenes hajlásszöge a irányhoz, azaz a tengellyel bezárt szög.

A -t a földrajzi hálózatban hosszúsági foknak (longitude) nevezik, továbbá , ahol -t pedig szélességi foknak (latitude) hívják. A következő magyarázó ábrán a hosszúsági majd a szélességi köröket látjuk. (forrás:Pearson Scott Foresman képei, http:www.wikipedia.org).

3.8. ábra. Hosszúsági körök

3.9. ábra. Szélességi körök

Azért töltünk ilyen sok időt a fogalmak tisztázással, mert a szakirodalomban sajnos többféle jelölést is használnak a gömbikoordinátákra. Pl. Arfken (lásd [87]) jelölést használja, azaz felcseréli a görög ábécé betűit a szögek jelölésében, ezért legyünk óvatosak az irodalom olvasásában.

Ha olyan jobbsodrású koordináta-rendszert veszünk fel, amelynek kezdőpontja , -tengelye az adott félegyenes irányába mutat, -tengelyének pozitív fele pedig az adott félsíkban halad, akkor az koordinátájú pont közönséges koordinátái:

A Descartes-féle koordináták ismeretében a következőképp kapjuk meg a gömbi koordinátákat:

A gömbi polárkoordináták alkalmazása olyankor lehetnek hasznos, amikor gömböket tartalmazó problémával van dolgunk. Jól használhatók például tárgyak egy ponthoz viszonyított térbeli helyzetének és mozgásának leírásakor. Ugyancsak jól használhatók a földgömbön való, és ahhoz képesti helyzet megadásakor. Komputergrafikában a kamera vagy a fényforrás pozíciójának a megadására is elterjedt a gömbikoordináták használata, mivel így könnyedén tudjuk forgatni a kamerát vagy a fényforrást az objektum körül. Képzeljük el a kamerát egy gömb felületén, ahol a térbeli objektum a gömb középpontjában van. A kamera a gömb középpontjába néz. Ha körbe akarjuk forgatni az objektumot, akkor erre nincs szükség, hiszen a kamera mozgatásával a szélességi és hosszúsági körök mentén ugyanazt a hatást érjük el. Ezen a módon a felhasználó számára sokkal jobban érthető és használható modellt alkotunk, mintha az objektumot forgatnánk a koordináta tengelyek körül.

4. fejezet - Homogén koordináták

Komputergrafikában igen elterjedt a homogén koordináták használata. Nagyon sok irodalomban és leírásban csak formális, az egységes tárgyalási módot lehetővé tevő eszközként említik, mint például a ponttranszformációk esetében.

A homogén koordináták fogalma alapkonstrukció a projektív geometriában (lásd [29]). Számos komputergrafikai megoldás, algoritmus a projektív geometriai ismereteken alapszík. Ebben a könyvben csak fel tudjuk hívni a figyelmet ezen ismeretek fontosságára. Például a homogén koordináták használata elengedhetetlen amikor a térbeli objektumokat a képernyőn síkjában kívánjuk megjeleleníteni, azaz centrális vetítést kell alkalmaznunk. Ha 3D megjelenítés kívánunk alkalmazni, akkor is két centrális vetítést alkalmazunk, szimulálva a két szemünk által elvégzett leképezést.

Több ezer éves probléma a párhuzamosság kérdése. A sík két egyenese vagy párhuzamos, vagy pedig egy közös pontjuk van. Ha nem szeretnénk a párhuzamosságot külön kezelni, bővítsük ki az egyenes pontjait egy ideális pontnak nevezett elemmel. Erre a végtelen távoli pontra teljesülnie kell a következőnek: két egyenes pontjainak az összességét akkor és csak akkor bővítjük ugyanazzal az új elemmel, ha párhuzamosak. A nem ideális pontokat megkülönböztetésül közönséges pontoknak nevezzük. Az ideális pontok egy egyenesen helyezkednek el, az ideális egyenesen. A térben szintén elvégezhető az ideális elemekkel történő bővítés. A tér valamennyi ideális pontja az ideális síkot határozza meg.

Síkbeli homogén koordináták

Az ideális pontokkal való bővítést a homogén koordináták bevezetésével oldjuk meg (lásd [48]). A sík pontjainak homogén koordinátás, három összetevős alakját egy háromdimenziós Descartes-féle koordináta-rendszerben szokás szemléltetni. Legyen adott egy sík, amely tehát párhuzamos az koordináta síkkal. Definiáljunk ezen sík pontjai és a koordináta-rendszer kezdőpontján áthaladó egyenesek között egy kölcsönösen egyértelmű kapcsolatot, úgy, hogy az egyenesekhez a síkkal alkotott metszéspontjukat (döféspontjukat) rendeljük hozzá, a sík tetszőleges pontjához pedig az origóval összekötő egyenest. Az koordinátasíkban fekvő egyeneseknek a z = 1 sík végtelen távoli pontjai felelnek meg (lásd ábra).

4.1. ábra. Síkbeli homogén koordináták

Az origón áthaladó egyenesek egyértelműen reprezentálhatók irányvektorukkal, melyek hossza tetszőleges, tehát a és (ahol valós szám) ugyanazt az egyenest, azaz ugyanazt a síkra illeszkedő pontot reprezentálja. Ilyen módon a sík pontjait olyan rendezett számhármasokkal reprezentáljuk,amelyek arányosság erejéig vannak meghatározva és mindhárom egyszerre nulla. Ezeket, a koordinátákat nevezik homogén koordinátáknak.

4.1. definíció. Síkbeli homogén koordináták: A sík pontjait olyan rendezett számhármasokkal reprezentáljuk, amelyek arányosság erejéig vannak meghatározva, és mind a három egyszerre nem lehet nulla.

A definíció értelmezése:

  • rendezett számhármas:,

  • arányosság: az ugyanazt a pontot jelöli, mint a

    , ahol egy 0-tól különböző valós szám, Pl: ugyanaz a pontot jelöli, mint a ,

  • homogén koordinátájú pont nem létezik.

Áttérés hagyományos Descartes koordinátákról homogén koordinátákra.

Legyen egy síkbeli pont hagyományos valós koordinátája , a homogén koordinátás alak lesz. Tehát az megfeleltetést használjuk. Mivel a homogén koordináták csak arányosság erejéig vannak meghatározva, ezért most már szorozhatjuk a koordinátákat, egy tetszőleges nem nulla számmal.

Visszatérés homogén koordinátákról Descartes koordinátákra.

Ha csak affin transzformációkkal foglakozunk, akkor a harmadik koordináta 1 lesz, ezért a visszatérésnél egyszerűen elhagyjuk. Általánosan ha egy pont homogén koordinátája , és nem nulla, akkor az első két koordinátát eloszthatjuk a definícióban foglalt arányossági tulajdonság miatt a harmadik koordinátával:

Ebben az esetben láthatjuk, hogy valójában az és az megfeleltetést használtuk. Ha , akkor nincs hagyományos valós megfelelője a pontnak, ez csak a nem affin transzformációknál fordul elő.

Két pontra illeszkedő egyenes egyenlete

Amennyiben szeretnénk meghatározni az S sík egy e egyenesét, ezt a legegyszerűbben a térbeli koordináta-rendszer O kezdőpontján és az e egyenesen átfektetett sík megadásával tehetjük meg. Ezt a síkot az normálvektorával jellemezhetjük. A következőkben az egyenest meghatározó vektorok esetén ilyen normálvektorokra kell gondolnunk.

Vegyük az e egyenes két pontját -t és -t, melyek normált homogén koordinátás alakban vannak. Az ezen pontokba mutató helyvektorok vektoriális szorzataként meg tudjuk határozni az e egyenes normálvektorát. Azaz:

Ennek alapján kiszámíthatók az e vektor koordinátái:

Mivel az a és b vektorok az S sík e egyenesének és a térbeli koordináta-rendszer O kezdőpontja által meghatározott síkjában vannak, a vektoriális szorzatuk pontosan merőleges lesz mind az S síkra, mind az e egyenesre.

4.2. ábra. Két pontra illeszkedő egyenes.

Legyen az e egyenes egyenlete alakú. Szorozzuk meg az egyenlet mindkét oldalát -mal, így a homogén koordináta definíciójából az -t kapjuk. Ennek alapján az e egyenes keresett egyenlete:

Tehát a sík egyeneseit (hasonlóan a sík pontjaihoz) rendezett számhármasokkal reprezentáljuk, amelyek az arányosság erejéig vannak meghatározva, és mind a három egyszerre nem lehet nulla.

Illeszkedés.

Az előzőekből következik, hogy egy p vektor által meghatározott pont akkor és csak akkor illeszkedik az e vektor által meghatározott egyenesre, ha . Ez tulajdonképpen a két vektor merőlegességét jelenti.

Pont és egyenes távolsága

Egy pont homogén koordinátás vektora és egy egyenes irányvektorának a skaláris szorzata a pont és az egyenes távolságával arányos. A keresett távolságot megkapjuk, ha a két vektor skaláris szorzatát elosztjuk az egyenes normálvektorának hosszával. Az vektorral mint homogén koordinátákkal reprezentált síkbeli egyenes egyenlete Ebből az egyenes normálvektora . Legyen a P pontba mutató helyvektor .

Pont és egyenes távolsága a síkon.

4.3. ábra. Pont és egyenes távolsága síkon

A fenti összefüggést megtaláljuk az alábbi linken Weisstein munkájában (lásd [84]):

http://mathworld.wolfram.com/Point-LineDistance2-Dimensional.html

Ha az egyenes két pontjával adott és akkor (4.1) szerint

Ekkor (4.2) szerint

Ez utóbbi formula, azért szerencsés, mert megfelel a térbeli esetnek (lásd [85]), ahol minden vektornak van koordinátája is.

Pont és egyenes távolsága térben. A vektoriális szorzat definíciója alapján (lásd [76] 252. oldal ):

4.4. ábra. Pont és egyenes távolsága, ahol

Két egyenes metszéspontjának meghatározása

Tekintsük az S sík e és f egyeneseit. Az egyenesek metszéspontjának koordinátáit szeretnénk meghatározni. Az e egyenest az A és B pont, az f egyenest a C és D pont határozza meg. Legyen a metszéspont P.

4.5. ábra. Két egyenes metszéspontja.

Mivel a P pont illeszkedik mind az e, mind az f egyenesre, így fennáll a , illetve egyenlőség. Az előző két egyenlet azt jelenti, hogy a p vektor merőleges az e illetve f vektorokra. Ilyen irányú vektort a legegyszerűbben az e és f vektoriális szorzata segítségével állíthatunk elő, azaz , ahol és :

A pont Descartes koordinátái:

Térbeli homogén koordináták

definíció: Térbeli homogén koordináták: A tér pontjait olyan rendezett számnégyesekkel reprezentáljuk, amelyek arányosság erejéig vannak meghatározva, és mind a négy egyszerre nem lehet nulla.

A definíció értelmezése:

  • rendezett számnégyes: ,

  • arányosság: az ugyanazt a pontot jelöli, mint a

    , ahol egy 0-tól különböző valós szám.

    Pl: ugyanazt a pontot jelöli, mint a ,

  • homogén koordinátájú pont nem létezik.

Áttérés hagyományos Descartes koordinátákról homogén koordinátákra.

Legyen egy térbeli pont hagyományos valós koordinátája , a homogén koordinátás alak lesz. Tehát az megfeleltetést használjuk. Mivel a homogén koordináták csak arányosság erejéig vannak meghatározva, ezért most már szorozhatjuk a koordinátákat, egy tetszőleges nem nulla valós számmal.

Visszatérés homogén koordinátákról Descartes koordinátákra.

Ha csak affin transzformációkkal foglakozunk, akkor a negyedik koordináta egy lesz, ezért a visszatérésnél egyszerűen elhagyjuk. Általánosan ha egy pont homogén koordinátája , és nem nulla, akkor az első három koordinátát eloszthatjuk a definícióban foglalt arányossági tulajdonság miatt a negyedik koordinátával:

Ebben az esetben láthatjuk, hogy valójában az és az megfeleltetést használtuk. Ha , akkor nincs hagyományos valós megfelelője a pontnak, ez csak a nem affin transzformációknál fordul elő.

Három ponton átmenő sík egyenletének megadása.

A síkot határozza meg három nem egy egyenesre 8 nem kollineáris) normált alakú pontja: , a , valamint a . Egy sík általános egyenlete , melyből -gyel való szorzás után következik az egyenlőség. Végezzük el az általánosan a két dimenzióban alkalmazott két ponton átmenő egyenes egyenletére alkalmazott eljárást, amiből azt kapjuk, hogy:

Tehát az a, b, c és d értékeket előállíthatjuk a megfelelő -as részmátrixok determinánsaként.

A homogén koordináták előnye az, hogy az ideális pontokhoz is tudunk megfelelő koordinátákat rendelni. Hátránya, hogy egyazon pont homogén koordinátákkal való meghatározása nem egyértelmű, mivel az így megadott pontok koordinátái csak arányosság erejével meghatározottak.

A módszer lényege, hogy a térbeli pontokat három koordináta helyett négy koordinátával azonosítjuk, azaz valamely P pont koordinátahármasa helyett a koordinátanégyest használjuk, ahol w egy tetszőleges, nullától különböző valós szám (skalár). Ebből az írásmódból bármikor visszatérhetünk a háromdimenziós koordinátákra, ha a vektor első három rendezőjét elosztjuk a negyedikkel. Látható, hogy egy számnégyeshez pontosan egy pont tartozik, de egy ponthoz végtelen számnégyes, melyek egymástól csak nullától különböző konstansszorzóban térnek el. A közönséges pont legegyszerűbb felírása az alábbi: , ebben az esetben a koordináta normált alakú.

Speciális esetet jelent, ha a negyedik koordináta 0, ebben az esetben ez végtelen távoli pontot jelöl, aminek nincs megfelelője az euklideszi térben. Az ideális pontok homogén alakjának összetevői közül az utolsót, a nullát elhagyva, a többiek az illető ideális pontra illeszkedő egyenesek irányvektorának összetevői. Az nem fordulhat elő, hogy mind a négy koordinátája egyszerre legyen nulla.

A transzformáció leírására szolgáló mátrixokat homogén koordinátákból építjük fel. A homogén koordináták segítségével a perspektivikus transzformációk is leírhatók. E koordináták bevezetésével minden transzformáció önálló matematikai egységként kezelhető, s egyben biztosítható az egymás után következő transzformációk összekapcsolása (konkatenációja).

Néhány nevezetes pont homogén koordinátája (tetszőleges, nullától különböző valós számmal):

  • az origó homogén alakja:

  • az x, y, illetve a z tengely végtelen távoli pontja: , , .

5. fejezet - Ponttranszformációk (Linear transformation)

Ponttranszformáción olyan megfeleltetést értünk, mely az alakzat minden egyes pontjához egyértelműen hozzárendel egy pontot. Olyan eljárásoknál kell ezt alkalmazni, amelyekben a tárggyal összefüggésben annak valamilyen hasonmása keletkezik. Tipikus példa erre minden leképezési folyamat (például a fényképezés), ahol a tárgyhoz, annak egyes pontjaihoz egy kép pontjait rendeljük. Ide értjük azokat az eseteket is, amikor a tárgy deformációkat szenved. Az általunk tárgyalt legbővebb transzformáció a projektív transzformáció.

A térbeli ponttranszformációk általános alakja, ahol p a transzformálandó, p’ a transzformált pontba mutató helyvektor, pedig a -es transzformációs mátrix:

ahol

Először az úgynevezett elemi transzformációkat tárgyaljuk, ezekből lehet összetett transzformációkat létrehozni. Minden transzformáció esetén megadjuk az inverz transzformációt is. A leírásnál elsősorban Juhász Imre könyvére támaszkodunk (lásd [48], [96]).

Egybevágósági transzformáció (Congruence transformation)

Azokat a transzformációkat, ahol bármely szakasz képe ugyanolyan hosszúságú szakasz egybevágósági transzformációnak nevezzük. Ilyen tulajdonságú transzformáció az identitás, az elforgatás, az eltolás és a tükrözés. Az eltolást és elforgatást összefoglalóan mozgásnak szokás nevezni, ugyanis ilyen esetben van olyan térbeli „mozgás” amivel az egybevágó alakzatok egymással „fedésbe” hozhatók. Az egybevágósági transzformációk közös jellemzője, hogy a reprezentáló mátrixok bal felső -as minor mátrixa ortonormált mátrix –azaz sorai és oszlopai páronként merőleges egységvektorok– és determinánsa mozgás esetén 1, tükrözésnél pedig -1.

Identitás (Identity)

Az identitás esetén minden ponthoz önmagát rendeljük hozzá, tehát a pontok koordinátái nem változnak. Itt a tárgy mozdulatlan.

Eltolás (Translation)

Az eltolás esetén a P ponthoz megadott irányban és távolságban levő P’ pontot rendeljük hozzá. Ez esetben az eltolást egy vektorral adhatjuk meg. Legyen a vektor koordinátája

5.1. ábra. Síkbeli eltolás.[108]

A P’ pont koordinátáját megkapjuk, ha a P pont megfelelő koordinátáihoz hozzáadjuk a d vektor megfelelő koordinátáit:

Ugyanez homogén koordinátás alakban és mátrix szorzással felírva:

adódik az eltolás mátrixa illetve inverze:

Az eltolás hatására a tárgy önmagával párhuzamosan a d vektornak megfelelő irányba és távolságra tolódik el.

Forgatás (Rotation)

Térbeli forgatásnál szükség van egy e egyenesre, mely körül forgatunk, valamint egy (theta) szögre, hogy milyen mértékkel. Az egy irányított szög, ami azt jelenti, hogy pozitív szög esetén az óramutató járásával ellentétesen, míg negatív szög esetén az óramutató járásával megegyezően forgatunk. Egyenes körüli elforgatás esetén az egyenes pontjai fixpontok, azaz a forgatás során a képpont megegyezik az eredeti ponttal. Ha a P pontot az e egyenes nem tartalmazza, akkor a képe az a P’ pont lesz, melyre teljesül, hogy P és P’ pontnak az e egyenestől vett távolsága megegyezik, valamint PeP’ szög nagysága és iránya a megadott szög.

A legegyszerűbb, ha a forgatás tengelyének valamelyik koordináta-tengelyt választjuk. Amennyiben a z tengelyt választjuk, akkor a pontnak és a képpontnak a z tengelytől vett távolsága nem változik. Ezen térbeli elforgatás visszavezethető egy origó körüli síkbeli elforgatásra, ahol az elforgatás szöge megegyezik a térbeli elforgatás szögével. Síkbeli elforgatás esetén pedig:

5.2. ábra. Síkbeli elforgatás.[107]

Ennek megfelelően a z tengely körüli elforgatás mátrixa:

Ha az elforgatás tengelyének az x vagy az y tengely valamelyikét választjuk, akkor a mátrix a következőképpen módosul:

Vegyük észre, hogy az y tengely körüli forgatás esetén a főátló felett a előjele pozitív ellentétben a másik két forgatással! A forgatás pozitív irányát úgy határozzuk meg, hogy a forgástengelynek kiválasztott koordináta tengely pozitív oldaláról nézünk az origóba. A forgás tengely pontonként fix, tehát a másik két tengely elforgatásánál vesszük figyelembe, hogy az óramutató járásával megegyező, vagy ellentétes irányba forgatunk. Az óramutató járásával ellentétes irányt (counter clock-wise) nevezzük pozitív illetve a megegyező irány (clock-wise)negatív forgatásnak. Tehát így értelmezhetünk negatív forgatási szöget is. A forgatás inverzét megkaphatjuk, ha a szög ellentétét használjuk, azaz a forgatás mátrixában a helyett -t, míg helyett -t írunk:

Forgatási mátrix esetében az inverz mátrix megegyezik (otrogonális mátrixok) a transzponált mátrixszal:

Tükrözés (Reflection)

A térbeli tükrözés esetén szükség van egy s síkra, amelyre vonatkoztatva végezzük el a tükrözést. A tér egy P pontjához úgy rendeljük hozzá a képét, hogyha P illeszkedik az s síkra, akkor a képe önmaga; ha a P nem illeszkedik az s síkra, akkor azt a P’ pontot rendeljük hozzá, amelyre fennáll, hogy a P-P’ szakasz felezőmerőleges síkja az s sík.

Elemi tükrözési transzformációk esetén a tükrözést a koordinátasíkokra hajtjuk végre. Ha az (x,y) síkra történik a tükrözés, akkor a pontnak az x, valamint y tengelytől való távolsága nem változik, viszont a z tengelytől való távolsága az ellentéte lesz az eredeti ponthoz tartozónak. Ennek megfelelően ennek a tükrözésnek a mátrixa:

Az (y,z), valamint (x,z) síkokra vonatkozó tükrözésnél - ugyanilyen gondolatmenet alapján – az első, illetve a második oszlopban lesz -1.

A tükrözés inverzének mátrixa megegyezik a tükrözés mátrixával. Ez abból következik, hogyha egy pontot ugyanarra a síkra nézve kétszer tükrözünk, akkor a kétszeres tükrözést követően visszakapjuk az eredeti pontot.

Hasonlósági transzformáció (Similarity transformation)

Az egybevágósági transzformációk kibővítésével a hasonlósági transzformációkat kapjuk. Egy ponttranszformációt hasonlóságnak nevezünk, ha bármely két pont képének a távolsága a pontok távolságával osztva mindig ugyanazt a nullától különböző hányadost adja. A képtávolságok és a megfelelő tárgytávolságok aránya adja a hasonlóság arányát. Mivel távolságokról van szó, ezért a hasonlóság aránya pozitív szám. Amennyiben a hasonlóság aránya (lambda) egynél kisebb, akkor kicsinyítésről, ha egynél nagyobb, akkor nagyításról beszélünk. Ha a értéke pontosan 1, akkor az azonosság.

Minden hasonlósági transzformáció az origóra történő kicsinyítés, vagy nagyítás segítségével állítható elő. Ekkor egy P pont képének koordinátái a P pont koordinátáinak -szorosaként állnak elő:

A hasonlósági mátrix inverzét megkapjuk, ha a hasonlósági arány reciprokát használjuk.

Affin transzformációk (Affine transformations)

A transzformációk nagyobb halmazát az affin transzformációk adják. Az affinitás olyan transzformáció, amely párhuzamos egyeneseket párhuzamos egyenesekbe képez le. A párhuzamosságtartás egyik következménye, hogy paralelogrammának paralelogramma a képe, tehát pl. a négyzetrács képe egy paralelogrammarács (lásd [95]).

Az affinitás természetesen nem elfajuló transzformáció, és affin transzformációk egymásutánja is affinitást eredményez.

Természetesen a hasonlósági transzformációk, és ezen belül az egybevágóságok is az affin transzformációk halmazának egy részhalmaza, mivel azok egyenestartó transzformációk. A két legismertebb affinitás a skálázás és a nyírás.

Az euklideszi tér pontjainak homogén alakján ezeket a transzformációkat -es, nem szinguláris mátrixokkal való szorzással hajthatjuk végre. Az affin transzformációk mátrixának utolsó sorának első három eleme 0, negyedik eleme 1 (vagy bármilyen 0-tól különböző szám). Az ilyen mátrixszal szorozva minden közönséges pont képe közönséges pont, az ideális pontok képe ideális pont.

Általánosságban elmondható, hogy egy -es nem szinguláris mátrix (a mátrix determinánsa nem zérus), melynek negyedik sora , és egy affin transzformációt ír le.

Skálázás (Scaling)

A skálázással az origóból a három koordinátatengely mentén megadott mértékű nyújtást, zsugorítást érhetünk el. Ennél a ponttranszformációnál a kép már nem egybevágó mása a tárgynak.

5.3. ábra. Síkbeli skálázás.[109]

A transzformáció mátrixa:

ahol („lambda,mű,nű”) a nagyítások az egyes tengelyek mentén. Ha ezek egyenlők, akkor a tárgy arányos nagyítással (kicsinyítéssel) került leképezésre, egyébként torzulás lép fel.

Amennyiben egy közös skálázási faktorral szeretnénk számolni, ebben az esetben elegendő az egységmátrix egyetlen elemét módosítani:

A közös skálázási faktor használata pontosan megfelel a kicsinyítésnek vagy nagyításnak.

A skálázás inverzénél a reciprokával számolunk.

Nyírás (Shear)

A térbeli nyírás a tér P pontjainak egy fix síkkal párhuzamos csúsztatása. Legyen a fix sík az origón áthaladó. A csúszás mértéke arányos a pontnak a fix síktól való d távolságával. A sík állása megadható egységhosszúságú n normálvektorával, a csúszást pedig a t irány egységvektorával, amely merőleges n-re.

Egy mértékű nyírás: alakba írható (lásd [48]). Ennek mátrixát a következőképpen írhatjuk fel:

5.4. ábra. Nyírás.

A fenti ábrákon egy adott tengely irányában végeztük a nyírást. A legelsőn az x tengely irányában x-y sík mentén, ebben az esetben a transzformációt leíró egyenletrendszer a következő (kotangens szokásos ctg jelölése helyett a -ot használtuk):

Mátrix alakban jelölést bevezetve:

hasonlóan

adódik. A nyírás inverze:

Végezzük el a nyírást speciálisan az x, és y tengely irányában, a z tengely pedig legyen fix. Legyen a nyírási faktor a az x tengely irányában, illetve b az y irányában. Ebben az esetben a mátrix a következőre egyszerűsödik:

A mátrix alapján leolvashatóak a következő egyenlőségek:

Ami azt jelenti, hogy a tér egy pontja az pontba transzformálódik. Az x és z irányban elvégzett nyírás mátrixa:

Az y és z irányban elvégzett nyírás mátrixa:

Projektív transzformáció (Projective transformation)

Megállapítható, hogy minden nem szinguláris 44-es mátrixnak megfeleltethető egy projektív transzformáció. A projektív transzformációnál csak az a megkötés, hogy az egyenes képe egyenes maradjon. Így elvesznek viszont olyan tulajdonságok, mint például a párhuzamosság, vagy a szögtartás. Tehát egy négyzet képe általános négyszög is lehet, kör képe pedig lehet parabola vagy hiperbola is.

Térbeli transzformációk szorzata (Concatenation of transformations)

Térbeli transzformációk egymás utáni végrehajtását térbeli transzformációk szorzásának illetve szorzatának nevezzük. Térbeli alakzatokon több transzformációt végrehajthatunk egymás után. Ha összetett transzformációt szeretnénk végrehajtani, akkor ennek elvégzését leegyszerűsíthetjük úgy, hogy az egyes transzformációkat leíró mátrixokat a megfelelő sorrendben összeszorozzuk, és a pontokat csak ezzel a szorzatmátrixszal kell megszorozni. Legyen az első, a második transzformáció mátrixa. Ekkor:

és

ami átírható

alakba. Ekkor a transzformációs mátrixokat össze lehet szorozni:

amiből

A sorrend lényeges, lévén a mátrixszorzás nem kommutatív, így különböző sorrendben különböző eredményhez, tehát különböző transzformációhoz jutunk.

A pontranszformáció általános megadásánál balról szoroztunk a transzformációs mátrixszal. Ha jobbról szoroztunk volna, akkor egy teljesen ekvivalens rendszert tudtunk volna felépíteni, ilyen pl DirectX által használt rendszer is. Ebben az esetben a transzformációs mátrixok transzponáltjait kell használni, s az összetett transzformáció esetén egyenes sorrendben szorozzuk össze a transzformációs mátrixokat.

Minden összetett transzformáció felírható elemi transzformációk szorzataként. Egy tetszőleges mozgás felírható eltolásokból és forgatásokból; az általános egybevágósági transzformáció eltolásokból, tükrözésekből és forgatásokból; az általános hasonlósági transzformáció egybevágósági transzformációkból és origó középpontú hasonlóságokból, az általános affin transzformáció egybevágósági transzformációkból és skálázásokból állítható elő.

Könnyen belátható, hogy még a forgatás és az eltolás is összetett transzformáció. Mindkettő felírható tükrözés segítségével. Két párhuzamos egyenesre vonatkozó tükrözés szorzata eltolás. Az eltolás iránya merőleges az egyenesekre, nagysága a tengelyek távolságának kétszerese. Két, közös ponttal rendelkező egyenesre vonatkozó tükrözés egymásutánja a két egyenes metszéspontja körüli elforgatásnak felel meg, ahol az elforgatás szöge a két egyenes által bezárt szög kétszerese, iránya pedig a tükrözés sorrendjétől függ. Ebből következik, hogy a mozgás előáll két tükrözés, az egybevágóság pedig legfeljebb három tükrözés szorzataként.

A transzformációs mátrix négy fő részre osztható attól függően, hogy a koordináta-transzformáció során milyen jellegű változásokat eredményeznek az együtthatók:

esetén

  • A bal felső -as részmátrix: az elforgatás, tükrözés, skálázás,

  • A jobb felső -es részmátrix: az eltolás,

  • A bal alsó -as részmátrix: projektív jelleg,

  • A jobb alsó -es részmátrix: kicsinyítés, nagyítás (azonos mértékű skálázás).

Például szeretnénk egy tárgyat a z tengellyel párhuzamos egyenesen lévő koordinátájú pontban adott szöggel forgatni. Ezt a forgatást három elemi transzformáció szorzatára lehet felbontani:

  1. Eltoljuk a tárgyat az origóba ().

  2. Elforgatjuk a megadott szöggel ().

  3. Visszatoljuk a tárgyat az eredeti pozíciójába ().

Ennek megfelelően a transzformációs mátrixot a következőképpen kaphatjuk meg:

Forgatás a három koordináta-tengely körül

Egy általános forgatás előállítható a három koordinátatengely körüli forgatással, viszont figyelembe kell venni, hogy a forgatások sorrendje nem felcserélhető. Pl. DirectX-ben a D3DXMatrixRotationYawPitchRoll függvénnyel lehet elvégezni a forgatást, ahol a sorrend:

  1. Csavarás (roll), azaz tengely körüli forgatás,

  2. Billentés (pitch) következik, azaz tengely körüli forgatás,

  3. Fordulás (yaw) azaz tengely körüli forgatás.

Ha balról szorzunk a transzformációs mátrixszal (, akkor a összetett transzformáció esetén fordított sorrendben (lásd a Térbeli transzformációk szorzata fejezetet) kell összeszoroznunk a transzformációs mátrixokat:

ha jobbról szorzunk, akkor az előbbi mátrix transzponáltját kapjuk. Mivel a forgatások sorrendje kötött, ezért általánosan a tetszőleges tengely körüli forgatást használjuk.

Tetszőleges tengely körüli forgatás (Rotation about an arbitrary axis)

A tetszőleges tengely körüli forgatás gyakori feladat a robotikában, az animációk készítésében és a szimulációk esetében. Követve az tranzformációk egymás utáni végrehajtásáról tanultakat, egyszerűen adódik a megoldás. Vezessük vissza a problémát a koordináta-tengely körüli forgatásra. Tegyük fel, hogy a térbeli tengely adott két pontjával: ill. , továbbá a forgatás szöge legyen .

Ebben az esetben a következő transzformációkat kell sorban végrehajtanunk:

  1. Eltoljuk a tengelypontot az origóba.

  2. Végrehajtjuk a megfelelő forgatásokat, úgy hogy a transzfomációk eredményeképpen forgástengely a koordinátatengelyre illeszkedik.

  3. Elvégezzük a szöggel való forgatást a tengely körül.

  4. Végrehajtjuk a 2. lépésben kivitelezett forgatások inverzét.

  5. Elvégezzük el az 1. lépésben lévő eltolás inverzét.

Az egyszerűség kedvéért előállítjuk az vektort, amely a forgás tengellyel párhuzamos, majd normalizáljuk:

Az vektor komponenseit az origón átmenő tengely íránykoszinuszainak nevezzük (lásd 5.5. ábra), és teljesül a következő összefüggés:

5.5. ábra. Iránykoszinuszok

A második lépésben két forgatásra lesz szükség. Az első egy koordinátatengely körüli pozitív irányú forgatás szöggel, úgy hogy a forgástengely az koordinátasíkra fog illeszkedni (lásd 5.6. ábra).

5.6. ábra. tengelykörüli forgatás

Az 5.6. ábráról leolvasható, hogy , és a forgatás szögének szögfüggvényei:

és ebből adódik a forgatás mátrixa:

A második egy koordinátatengely körüli negatív irányú forgatás szöggel, úgy hogy a forgástengely a koordinátatengelyre illeszkedjen.

5.7. ábra. tengelykörüli forgatás

Az 5.7. ábráról leolvashatóak a forgatás szögének szögfüggvényei:

és ebből adódik a forgatás mátrixa figyelembe véve a negatív irányt:

A teljes transzformáció a transzformációs mátrixok fordított sorrendben történő összeszorzásából adódik

ahol a belső öt mátrixot szokás külön is kiemelni:

azaz

Az (5.1)-ben lévő általános forgatási mátrixot Rodrigues formulának vagy Rodrigues-féle forgatási mátrixnak nevezzük, melynek a legtöbb irodalomban teljesen más levezetését tanulmányozhatjuk (lásd [105],vagy [11]). Belátható, hogy ha az öt forgatási mátrixot összeszorozzuk és elvégezzük a trigonometrikus függvényeken értelmezett azonos átalakításokat (lásd [98]), akkor az mátrix következő alakját kapjuk:

Mivel a forgatás mátrixának az inverze a mátrix transzponáltja, ezért teljesül, hogy A fentiekben megadott levezetés azért szerencsés, mert segítségével könnyedén áttérhetünk a tetszőleges síkra való tükrözés megoldására is.

Tetszőleges síkra való tükrözés (Reflection about an arbitrary plane)

Szintén gyakori feladat, amikor egy testet az egyik oldalapjának a síkjára szeretnénk tükrözni. Vezessük vissza a problémát a koordinátasíkra való tükrözésre. Figyelembe véve az előző fejezet levezetését adódik:

  1. Eltoljuk el a tükrözési síkot egy pontjának segítségével az origóba.

  2. Megfelelő forgatásokat hajtunk végre, úgy hogy a tükrözési sík normálvektora a koordinátatengely pozitív irányába mutasson, ezáltal a tükrözési sík illeszkedni fog a , azaz az koordináta síkra.

  3. Az koordinátasíkra a tükrözést végzünk el.

  4. Végrehajtjuk a 2. lépésben kivitelezett forgatások inverzét.

  5. Elvégezzük az 1. lépésben leírt eltolás inverzét.

Tehát ha adott a sík és , három nem egy egyenesre eső (nem kollineáris) pontjával, akkor a sík normál vektora könnyedén kiszámolható az , vektorok vektoriális szorzatából:

amelyet normalizálunk

ahol az vektor komponenseit íránykoszinuszoknak nevezzük, s az 5.5. ábra alapján igaz, hogy

A 2. lépésben lévő forgatási mátrixok ugyanazok lesznek, mint amelyeket a tetszőleges tengely körüli forgatásnál alkalmaztunk. A teljes transzformáció a transzformációs mátrixok fordított sorrendben történő összeszorzásából adódnak

ahol a belső öt mátrixot szokás külön is kiemelni:

azaz

Az (5.2)-ben lévő általános tükrözési mátrixnak nincs külön neve az irodalomban, levezetése megtalálható a [98] cikkben. Belátható, hogy ha az öt mátrixot összeszorozzuk és elvégezzük a trigonometrikus függvényeken értelmezett azonos átalakításokat, akkor a következő alakot kapjuk:

mivel a tükrözés inverze önmaga, ezért Szokás még az (5.3)-ben levő szorzást is elvégezni, mivel az eredmény nem lesz bonyolult:

ahol . Ugyanezt az eredmény használja a DirectX a D3DXMatrixReflect függvényben.

6. fejezet - Koordináta-transzformációk (Coordinatesystem transformation)

Koordináta-transzformációról akkor beszélünk, ha a tárgypont egy új koordináta-rendszerre vonatkozó koordinátáit határozzuk meg, a régiek ismeretében. Ilyenkor tehát a vizsgált tárgy változatlan, csupán a nézőpontunkat változtatjuk meg. A grafikus objektum változatlan marad.

A legtöbb alakzat koordináta-geometriai vizsgálata egyszerűbbé válik, ha az alakzathoz képest a koordináta-rendszert alkalmasan – rendszerint valamilyen speciális helyzetben – választjuk meg. Ehhez általában az szükséges, hogy egy meglévő koordináta-rendszerről áttérjünk egy új koordináta-rendszerre.

A koordináta-transzformációt a komputergrafikában szokásos problémán keresztül ismertetjük. A tárgyakat általában a világkoordináta-rendszerben (world) adjuk meg, s innen akarunk áttérni a kamera- vagy nézetikoordináta-rendszerre (view). Minkét rendszer Descartes-féle derékszögű koordináta-rendszer. Tegyük fel, hogy a nézetikoordináta-rendszer bázisvektorai és origója a világkoordináta-rendszerben rendre és :

6.1. ábra. Koordináta-transzformáció

Először ismerjük a pontnak az nézeti (új) koordináta-rendszerbeli helyvektorát. Határozzuk meg a pont világ (régi) koordináta-rendszerbeli helyvektorát (lásd a 6.1. ábrán ).

aminek mátrix reprezentációja homogén koordinátákat felhasználva

Másodszor tekintsük a feladat inverzét, ami a komputergrafikában gyakoribb probléma. Ismerjük a pontnak a világ (régi) koordináta-rendszerbeli helyvektorát. Határozzuk meg a pont nézeti (új) koordináta-rendszerbeli helyvektorának komponenseit.

-nek az új koordináta-rendszerbeli komponenseire

aminek mátrix reprezentációja homogén koordinátákat felhasználva

Az előzőekhez hasonlóan felírhatjuk, hogy

ahol

A mátrix inverze könnyen előállítható, hiszen ekkor a bal-felső minormátrix ortonormált mátrix (a sorvektorai egymásra merőleges egységvektorok), tehát annak inverze egyenlő a transzponáltjával, azaz

ahol a második mátrix egy eltolás ponttranszformációját írja le, nevezetesen a kamera pozíciójának az eltolását a világkoordináta-rendszer origójába. Az első mátrix két koordináta-tengely körüli forgatást és ha az új rendszernek a sodrása is (pl.jobbsodrásúból balsodrásúvá) megváltozik, akkor koordináta-síkra való tükrözést is tartalmaz.

7. fejezet - Tér leképezése a síkra

Általában a vetítési ponttranszformáció alatt azt értjük, amikor n dimenziós koordináta-rendszer pontjait vetítjük n-nél kevesebb dimenziójú koordináta-rendszer pontjaiba. Leggyakrabban a 3 dimenziós tér pontjait vetítjük a 2 dimenziós síkra. A vetítéshez meg kell adnunk a vetítés centrumát, és amire vetítünk, azaz a képsíkot. A centrumból indított és a térbeli objektum pontjain át húzott vetítősugarak képsíkkal alkotott döféspontjai (metszéspontjai) határozzák meg az objektum képét. Csak olyan esetekkel foglakozunk, amit síkbeli geometria projekciónak (vetítés) nevezünk, azaz a vetítő sugarak egyenesek és nem görbék, illetve a képsík sík és nem görbült felület. A térképészetben használnak más eseteket is. hasonló az IMAX vagy Omnimax filmszínház esete.

7.1. ábra. Vetítések osztályozása

A síkra való vetítések osztályozását megtalálhatjuk a 7.1. ábrán, ami Foley könyve [23] alapján készült. A * megjegyzés azt jelenti, hogy figyelembe kell venni az axonometria estében Pohlke-tételét: Egy alakzat axonometrikus képe hasonló az alakzat párhuzamos projekciójához. Tehát az axonometria egy párhuzamos vetítés és egy hasonlósági transzformáció szorzata. A hasonlósági transzformációknak részhalmaza a helybenhagyás (a hasonlósági tényező 1), azaz létezik olyan axonometria, amely párhuzamos vetítés, de nem minden axonometria párhuzamos vetítés.

Párhuzamos vetítés

Ebben az esetben a vetítés centruma végtelen távoli pont, azaz homogén koordinátás alakban a negyedik koordinátája 0. A vetítősugarak amelyek illeszkednek erre a végtelen távoli pontra párhuzamosak lesznek egymással hagyományos (eukleidészi) értelemben. Ezért sok esetben csak a vetítés irányvektorát szokás megadni descartesi alakban:

7.2. ábra. Vetítések osztályozása

A képsíknak tekinthetjük az koordináta síkot. A képsíkon egy térbeli pont képét úgy kapjuk meg, hogy vesszük a vetítési iránnyal (-vel) párhuzamos egyenest a ponton keresztül, majd ennek az egyenesnek és a képsíknak a metszéspontját határozzuk meg. Legyen pont helyvektora , illetve a képpont helyvektora melynek kiszámítása a 7.2. ábra alapján a következőképpen történik:

Kibontva ezt az egyenletet, a következő három egyenlőséget kapjuk:

Ezek után meg kell határoznunk -t. Az koordináta sík egyenlete , azaz minden pontjának koordinátája nulla. Ebből az következik:

amiből -t kifejezhetjük

Az eredményt visszahelyettesítve az első két egyenletbe a következőket kapjuk:

A fenti összefüggést mátrix alakban is megadjuk

Az mátrix harmadik sora csupa nulla, ami jelzi, hogy a párhuzamos vetítés dimenzió vesztő transzformáció. A párhuzamos vetítés speciális esete a merőleges vetítésről, ha vetítés iránya merőleges a képsíkra. Ebben az esetben

Az előbbi eredményt behelyettesítve a fenti egyenletrendszerbe, akkor a következőt kapjuk:

Tehát a legegyszerűbb vetítés az, ha elhagyjuk a térbeli koordinátát.

Centrális vetítés

Ebben az esetben a vetítés centruma valós pont (a párhuzamos vetítéssel ellentétben nem végtelen távoli pont), azaz homogén koordinátás alakban a negyedik koordinátája nem 0. A vetítősugarak illeszkednek erre a centrumra és nem lesznek párhuzamosak. Centrális vetítésnél a vetítés centrumát rendszerint a tengelyen helyezzük el. Két esetet fogunk tárgyalni.

Első eset.

7.3. ábra. Centrális vetítés első eset

A centrum a tengely pozitív felén található. Távolságát az origótól -vel jelöljük. A képsíknak tekinthetjük az koordináta () síkot. Egy pont vetületét, -t a hasonló háromszögek közötti összefüggések alapján a következőképpen határozhatjuk meg:

Szorozzuk meg mindkét oldalt -vel:

A , mivel a képsík az koordináta sík. A fenti összefüggést mátrix alakban is megadjuk felhasználva a homogén koordinátás alakot:

A kapott eredmény még nem használható, vissza kell térnünk a homogén koordinátás alakról a descartesi alakra, azaz a negyedik koordinátával végigosztjuk az első három koordinátát:

A fenti műveletet csak akkor tudjuk megtenni, ha . Azon pontok mértani helye, ahol a centrumra illeszkedő és az koordináta síkkal párhuzamos sík. Ezt a () síkot eltűnési síknak nevezzük, ezen sík pontjai képe végtelen távoli pontok lesznek, azaz a végtelenbe kerülnek. Ha egy objektumot elmetsz az eltűnési sík, akkor az alakzat képe szétesik.

Második eset.

7.4. ábra. Centális vetítés második eset

A centrum az origóban található. Képsíknak tekinthetjük az koordináta síkkal párhuzamos () síkot. A képsík távolsága az origótól -vel jelöljük. Egy pont vetületét, -t a hasonló háromszögek közötti összefüggések alapján a következőképpen határozhatjuk meg:

Szorozzuk meg mindkét oldalt -vel:

A , mivel a pont illeszkedik a képsíkra. A fenti összefüggést mátrix alakban is megadjuk felhasználva a homogén koordinátás alakot:

A kapott eredmény még nem használható, vissza kell térnünk a homogén koordinátás alakról a descartesi alakra, azaz a negyedik koordinátával végigosztjuk az első három koordinátát:

A fenti műveletet csak akkor tudjuk megtenni, ha . Azon pontok mértani helye, ahol a centrumra, azaz az origóra illeszkedő koordináta sík, amely párhuzamos a képsíkkal. Ezt a () síkot eltűnési síknak nevezzük, ezen sík pontjai képe végtelen távoli pontok lesznek, azaz a végtelenbe kerülnek. Ha egy objektumot elmetsz az eltűnési sík, akkor az alakzat képe szétesik.

A komputergrafikában gyakori a második eset használata, mivel ekkor a kamerát képzelhetjük el az origóba.

Mind az és az mátrixok determinánsa nulla, azaz a pontranszformáció dimenzió vesztő transzformáció. Ez az is jelenti, hogy nem kölcsönösen egyértelmű a leképezés. Ha két térbeli pont képe egybeesik, akkor az ilyen pontokat fedőpontoknak nevezzük.

8. fejezet - Görbék megadása

A görbéket általában implicit módon a következő alakban adhatjuk meg Például az origó középpontú sugarú kör egyenlete . Szintén gyakori az explicit megadás is: . Az előbbi kör egyenletéből az egyik változóra kifejezve nyerhetjük a félkör egyenletét. . További lehetőségünk a paraméteres egyenletrendszer alkalmazása: . Például:

egyenlet szintén a fenti kör egyenletét adja meg. Ez utóbbi alakot át is alakíthatjuk alkalmas helyettesítéssel:

ami adja a következő alakot:

Tehát megállapíthatjuk hogy a paraméteres alak többféle is lehet.

Gyakori példa a és a pontokat összekötő egyenes szakasz paraméteres egyenlete is, a melyet most vektor alakban adunk meg:

átalakítva:

Kifejtve a síkban két egyenlettel

a térben pedig egy kicsit átalakítva a szokásos módon három egyenlettel adhatjuk meg:

Megjegyezzük, ha a paramétert a teljes valós számhalmazon futtatjuk, akkor a két ponton átmenő végtelen egyenes paraméteres egyenletrendszerét kapjuk meg.

8.1. ábra. Egyenes paraméteres előállítása

Interpoláció

Adottak a sík vagy a tér pontjai, ezeket kontrollpontoknak, az általuk meghatározott poligont kontrollpoligonnak nevezzük.

Keressük azt a legtöbbször -ad fokú polinommal megadott görbét, melyre találhatóak olyan értékek, hogy

Tehát a görbe áthalad (interpolálja) a megadott kontroll pontokat. A numerikus matematika is foglakozik ezzel a problémával, s ad több megoldást is. Pl. ha a fenti egyenletrendszer jobboldalára n-edfokú interpolációs polinomot helyettesítünk, akkor egy lineáris egyenletrendszert kapunk, ahol az együtthatók lesznek az ismeretlenek. Az egyenletrendszer megoldható pl. Gauss-eliminációval. Emellett még a Lagrange- ill. Newton-interpolációa legismertebbek a numerikus matematikában.

Hermite-görbe

Charles Hermite általánosabb fogalomnak tekintette a kontroll adatokat.

Keressük azt a harmadfokú polinomot, ahol az input adat négy pont; vagy három pont és egy érintő; ill. két pont és két érintő lehet. Ebben a könyvben az utóbbi probléma megoldását fejtjük ki.

Tekintsük azt a harmadfokú Hermite-görbét, amely a kezdő és végpontjával ill. a kezdő és végpontban érintőjével adott. Tehát adottak a és pontok, valamint a és érintő vektorok.

Keressük az

harmadfokú polinommal megadott görbét amelyre

teljesül, ahol a felső pont a derivált jele. Tehát a kezdő- és a végpont, valamint a végpontokban húzott érintők ismertek. Ezek alapján az egyenletrendszer felírása és megoldása következik.

Az egyenletrendszer megoldása után

polinom-együtthatókat kapjuk. Ezeket visszahelyettesítve és átrendezve

Az egyenletben szereplő együttható polinomokat Hermite-polinomoknak nevezzük, és a következőképpen jelöljük:

Ekkor a görbe felírható a Hermite-alappolinomok segítségével:

Az előbbi összefüggés alapján az Hermite-görbét úgy tekinthetjük, mint a kontrolladatok súlyozott összege, ahol a súly- vagy bázisfüggvények az Hermite-alappolinomok.

Az egységesebb szemléletmód miatt felírhatjuk a görbét mátrix alakban is:

Megjegyzés: ha a végpontbeli érintőket egyre nagyobb mértékben növeljük, miközben irányukat nem változtatjuk, akkor váratlanul kialakulhat hurok a görbén, azaz átmetszheti önmagát.

Approximáció

Az approximáció esetében nem kívánjuk meg, hogy az előállított görbe érintse (áthaladjon) az összes kontrolladaton (kontrollponton), hanem csak közelítse azokat tetszőleges mértékben.

Ebben a könyvben olyan approximációt keresünk, ahol adott a sík vagy a tér pontjaihoz keressük azt az görbét, melyhez találhatóak olyan súly- vagy bázisfüggvények, hogy

Bézier-görbe

Az eljárást Pierre Bézier francia mérnök publikálta először 1962-ben, aki az autótervezésben alkalmazta a közelítő görbéket. Paul de Casteljau 1959-ben már kifejlesztette azt az algoritmust, amelyet a mai napig is használunk a Bézier-görbék előállítására.

Keressünk olyan görbét, amely a megadott pontokat közelíti (approximálja) az előre megadott sorrendben és nem érinti (nem interpolálja) a pontokat, vagy legalábbis nem mindegyiket.

A de Casteljau-algoritmus

Adottak a sík vagy a tér pontjai és paramétertartomány. A megadott pontokat kontrollpontoknak, az általuk meghatározott poligont kontrollpoligonnak nevezzük. Legyen

A második egyenlet jól ismert, hiszen a szakasz osztópontjának a meghatározására szolgál. Most már elvégezhető a szerkesztés, ahol az így meghatározott pont a Bézier-görbe paraméterhez tarozó pontja lesz.

8.2. ábra. paraméterhez tartozó Bézier-görbepont szerkesztése de Casteljau-algoritmussal.

A Bézier-görbe előállítása Bernstein-polinommal

A Bézier-görbe polinominális előállításához segítségül hívjuk a Bernstein polinom-ot:

ahol a binominális együtthatók a következőképpen adottak

Ezekután az

a Bézier-görbe polinominális alakja. Láthatjuk, hogy a Hermite-görbéhez hasonlóan a kontrolladatok, jelen esetben a kontrollpontok súlyozott összegéről van szó.

A Bézier-görbe néhány tulajdonsága

A Bézier-görbe kontrollpontjai affin transzformációjával szemben invariáns. Ez következik a de Casteljau-féle előállításból. Ezen tulajdonságot kihasználva, a görbe affin transzformációja (Pl.:eltolás, elforgatás, tükrözés, skálázás, párhuzamos vetítés) esetén elég a kontrollpontokra végrehajtani a transzformációt, mivel a transzformált pontok által meghatározott Bézier-görbe megegyezik az eredeti görbe transzformáltjával.

Ha , akkor a Bezier görbe kontrollpontjainak konvex burkán belül van.

8.3. ábra. A Bézier-görbe kontrollpontjainak konvex burkán belül marad

A Bézier-görbe az első és utolsó kontrollponton áthalad.

A Bézier-görbe „szimmetrikus”, azaz a és a pontok ugyanazt a görbét állítják elő.

Ha akkor a Bézier-görbe kezdő- és végérintője:

Tehát a kezdő és a végpontban az érintők tartó egyenese a kontrollpoligon oldalai.

8.4. ábra. A Bézier-görbe és érintői esetén az érintővektorok harmadát felmérve.

A görbe globálisan változtatható, azaz, ha megváltoztatjuk egy kontrolpontjának a helyzetét, akkor az egész görbe alakváltozáson megy keresztül. Bebizonyítható a Bernstein-polinomok tulajdonsága alapján, hogy a kontrollpontnak a paraméterértéknél van legnagyobb hatása a görbe alakjára. Ez utóbbi tulajdonságot nevezik úgy, hogy a görbe pszeudolokálisan változtatható. Tehát a Bézier-görbe alakváltozása jól prognosztizálható.

A polinominális előállításból jól látható, hogy pontok, azaz db pont esetén n-edfokú approximáló görbét kapunk, azaz a kontrollpontok számának növekedésével arányosan nő a poligon fokszáma is.

Harmadfokú Bézier-görbék

Adjuk meg az esetén kontrollpontokat közelítő Bézier-görbe polinominális alakját a harmadfokú Bernstein-polinomok segítségével:

Ahol a harmadfokú Bernstein-polinomok

azaz

tehát

A görbe érintője:

Ezután könnyedén megtalálhatjuk az Hermite-görbe és a Bézier-görbe közötti kapcsolatot. Ha az Hermit-görbe a és pontokkal, valamint a és érintő vektorokkal van meghatározva, akkor a kezdő és végpontbeli érintőknek meg kell egyezniük a Bézier-görbe érintőivel, azaz , továbbá a kezdő és végpontok is egybeesnek.

Tehát az Hermite-görbével megegyező Bézier-görbe kontrollpontjai:

A harmadfokú Beziér-görbék (s természetesen az Hermite-görbék is) változatos képet mutathatnak.

8.5. ábra. Harmadfokú Bézier-görbék

Ha a harmadfokú Bézier-görbe kontrollpontjai nincsenek egy síkban, akkor a Bézier-görbe térgörbe lesz, azaz nem találunk olyan síkot amelyre a görbe minden pontja illeszkedne. A három kontrollpont esetén a másodfokú Bézier-görbe már egy jól ismert síkgörbe, parabola lesz.

Kapcsolódó Bézier-görbék

Az előző fejezetben láttuk, hogyan milyen kapcsolat van az Hermite-görbe és a Bézier-görbe között. Ha több mint két pontot szeretnénk összekötni interpoláló görbével, akkor kézenfekvő megoldás a kapcsolódó harmadfokú Bézier-görbék alkalmazása, amelyek természetesen Hermite-görbék is lehetnek. Kapcsolódó görbeívek használata igen gyakori a modellezésben. Ilyen esetekben a csatlakozásnál megadjuk a folytonosság mértékét. Ha az és két csatlakozó görbe amely négy-négy kontrollponttal adott: és .

A kapcsolódásnál megkövetelhetünk nulladrendű , elsőrendű , illetve másodrendű folytonosságot. Általánosságban azt mondhatjuk, hogy két csatlakozógörbe kapcsolódása folytonos, ha az egyik görbe deriváltjai a végpontjában megegyeznek a másik görbe deriváltjaival a kezdőpontban, az deriváltig bezárólag. A matematikai folytonosság vagy parametrikus folytonosság mellett létezik geometriai folytonosság is. Pl. megegyezik -lal, és folytonosan kapcsolódik két görbe, ha az érintők a kapcsolódási pontban egy irányba néznek, de a hosszuk nem feltétlenül egyezik meg, azaz egyik érintő skalárszorosa a másiknak:

A nulladrendű folytonossághoz elegendő, ha a csatlakozáskor keletkező görbe megrajzolható anélkül, hogy a ceruzánkat felemelnénk. A mi esetünkben ez akkor teljesül, ha az első görbe végpontja megegyezik a második görbe kezdőpontjával, azaz: és mivel ezen görbepontok megegyeznek a megfelelő kontrollpontokkal, hiszen a Bézier-görbe a végpontokat interpolálja, ezért kell, hogy teljesüljön.

Az elsőrendű, folytonossághoz az érintőknek kell megegyezniük, azaz kell, hogy teljesüljön. Ez a kontrollpontokra az feltételt jelenti, azaz, amellett, hogy a két szegmens kezdő- és végpontja megegyezik, az pontoknak egy egyenesre kell illeszkedniük és az pontnak feleznie kell az szakaszt.

A másodrendben folytonos kapcsolódáshoz a fenti feltételeken kívül a második deriváltaknak is meg kell egyezniük, azaz Ez a kontrollpontokra nézve a következőt jelenti:

,

ami geometriai szempontból azt jelenti, hogy az egyenes és a egyenes m metszéspontjára teljesül, hogy felezi az szakaszt, pedig felezi az szakaszt.

A gyakorlatban folytonosságú kapcsolat elégséges, pl. animáció esetén a mozgó kamera által készített felvétel akkor lesz valósághű, ha a második derivált is megegyezik. Gondoljunk arra, hogy az út/idő függvény második deriváltja a gyorsulást adja, tehát ha a kapcsolódási pontban megváltozik a gyorsulás, akkor szaggatott felvételt kapunk.

8.6. ábra. , és folytonosan kapcsolódó Bézier-görbék

Cardinal spline

A cardinal spline egy a kontrollpontokat interpoláló, azaz az előre megadott pontokon adott sorrendben áthaladó görbe, tulajdonképpen elsőrendben folytonosan csatlakozó harmadfokú (kubikus) Hermite-görbék sorozata. Mivel az előző fejezetben már kimutattuk az Hermite- és a Bézier-görbe közötti kapcsolatot, ezért a cardinal spline megadhatjuk harmadfokú folytonosan kapcsolódó Bézier-görbék sorozataként is. Járjunk el az utóbbi módon!

8.7. ábra. 3 pontot interpoláló C folytonosan csatlakozó Bézier-görbék

Az Bézier szegmens kezdő és végpontja a szomszédos a  és  pontok. A görbe deriváltja egy közbülső  pontban párhuzamos a  egyenessel, azaz

Ne felejtsük el, hogy a harmadrendű Bézier-görbe négy kontrollpontjával, az Hermit-görbét pedig a kezdő- és a végpontjával, valamint a kezdő- és a végpontban húzott érintővel adjuk meg. Az Bézier-görbe szegmens kezdő és végpontja  Mivel a görbe érintője:

ezért minden kontrollpont minden szegmens esetén most már meghatározható. Az érintők meghatározásánál használhatunk egy tenziós értéket, amely az érintők nagyságát befolyásolja. Ha akkor a Catmul-Rom spline-t, ha akkor a kontrollpontokat összekötő poligont kapjuk meg.

8.8. ábra. tenziós érték hatása a görbe alakjára

Zárt görbe estén az érintő a kezdő és a végpontban is az

általános képlettel határozható meg.

8.9. ábra. Zárt görbék különböző értékeknél

Visual Studióban GDI+ segítségével lehetőségünk van cardinal spline előállítására DrawCurve metódussal. Mivel a GDI+ kihasználja, hogy a cardinal spline csatlakozó Bézier-görbékből áll, ezért szükség van egy Bézier-görbét előállító metódusra is. A DrawBezier négy kontroll pontra illeszt közelítő görbét, míg a DrawBeziers pedig folytonosan kapcsolódó Bézier-görbéket rajzol.

8.10. ábra. 7 pont esetén a DrawBeziers metódus futási eredménye

9. fejezet - B-spline görbe és felület

Ebben a fejezetben áttekintjük a számítógépes modellezés talán az egyik legnépszerűbb görbéjét, a  B-spline-t. Irodalomként felhasználjuk egyrészt G. Farin[21] és Juhász Imre [48], [41] munkáit, másrészt jól használhatónak tartom még F. Yamaguchi [86], Rogers és Adams [71], és Piegl és Tiller [63] könyvét. Ez utóbbit sokat alapműnek tekintik a témában. A B-spline görbék alapjául szolgáló úgynevezett B-spline alapfüggvények már régóta ismertek. N. I. Lobacsevszkij már a XIX. században vizsgálta egy speciális esetét (speciális csomóérték sorozat fölött definiálta, lásd Rényi [69], 165. o.), J. Schoenberg 1946-ban statisztikai adatok simítására használta, az ő cikkétől [74] származtatjuk a spline approximáció modern elméletének a kezdetét. A B-spline görbék tervezése a hetvenes évek elején válik használhatóvá. Ehhez hozzájárult a B-spline alapfüggvények rekurzív tulajdonságát felfedező C. de Boor [10], M. Cox [17] és L. Mansfield, továbbá W. Gordon és R. Riesenfeld [26] munkásságának köszönthetjük, hogy a csak approximációs szempontból vizsgált függvényeket paraméteres görbék előállítására, görbék tervezésére is használják. Jelentős munkásságot fejtett ki ebben a témakörben még W. Boehm [9] is.

A B-spline görbe a Bézier görbéhez hasonlóan approximáló görbe. A tulajdonságok tárgyalásánál látni fogjuk, hogy a B-spline esetén jóval több szabadsági fokkal rendelkezünk a görbe alakjának változtatása tekintetében. A B-spline görbe használatának előnye még, hogy kevesebb kontrollpontra van szükség, mint a Bézier görbe esetében, azaz kevesebb adatot kell tárolni a számítógépen, és mint látni fogjuk a Bézier görbe egy speciális esete a B-spline görbének.

Normalizált B-spline alapfüggvény

9.1. definíció. Tekintsük az skalárokat. Az

rekurzióval definiált függvényt normalizált B-spline alapfüggvénynek, az skalárokat pedig csomóértékeknek (knot values) vagy csomóvektornak (knot vector) nevezzük. Az előforduló -t definíció szerint -nak tekintjük.

Az normalizált B-spline alapfüggvény egy legfeljebb -edfokú polinom (a rendje . A akkor fordulhat elő, ha a szomszédos csomóértékek egybeesnek.

Az normalizált B-spline alapfüggvény néhány fontos tulajdonsága, melyet fokszám szerinti teljes indukcióval bizonyíthatunk:

  • ha local support

  • és ezen tulajdonság teljesülése miatt nevezzük hívják normáltnak, ahol az alapfüggvények a -ed fokú polinomtér normált bázisát alkotják.

  • -ször folytonosan differenciálható

9.2. megjegyzés. Egyenlőközű csomóértékek esetén () legyen , ekkor a rekurzív definíció átalakul,

és -t uniform B-spline bázisnak nevezzük. Ha a B-spline nem egyenlőközű csomóértékek fölött van megadva, akkor non-uniformnak, ha a csomóértékek növekedése, – azaz a differenciája – állandó vagy 0, akkor open uniform B-spline bázisnak nevezzük.

9.3. megjegyzés. Tekintsünk egy példát a B-spile alapfüggvények előállítására, open uniform csomóérték megadással:

Pl: Legyen ekkor a csomóértékek

9.1. ábra. B-spline alapfüggvények open uniform esetben

A csomóértékek ilyen megadása esetén (a kezdő és a végpontban -szoros a csomóérték) biztosítjuk, hogy a B-spline görbe interpolálja a végpontokban a kontrollpontokat, amely egyébként nem feltétlenül következik be. Legyen ekkor már csak -tól és a kontrollpontoktól függ a B-spline görbe alakja

B-spline görbe

A Bézier görbéhez hasonlóan határozzuk meg a B-spline görbét is. A Bézier görbe fokszáma és a kontrollpontok száma függ egymástól, itt a szituáció különböző.

9.4. definíció. Azt a görbét, amely

alakban felírható, -ed fokú (vagy -adrendű) B-spline görbének nevezzük, ahol a -ed fokú normalizált B-spline alapfüggvény

csomóvektorral. A pontokat kontrollpontoknak vagy de Boor-pontoknak, az általuk meghatározott poligont pedig kontroll- vagy de Boor-poligonnak nevezzük.

Tulajdonságok

  • A B-spline görbe lokálisan változtatható, azaz valamely kontrollpont helyének a megváltoztatása nem eredményezi (szemben a Bezier görbével) a teljes görbe alakjának megváltozását. Ez abból következik, hogy ha az , a B-spline görbe csomóvektora , akkor kontrollpontnak csak estén van befolyása a görbe alakjára.

  • A B-spline görbe (szemben a Bezier görbével) tartalmazhat egyenes szakaszt akkor is, ha nem minden kontrollpontja kollineáris.

  • Egy -ed fokú B-spline görbe bármely pontja a görbe legfeljebb darab kontrollpontjának konvex burkában van. Ez a konvex burok tulajdonság jóval szigorúbb, mint a Bézier görbe esetén, mivel itt a görbe a konvex burkok uniójában halad.

  • -szoros kontrollpont: ha akkor a görbén van. tehát a (9.2) szerinti megadás biztosítja, hogy a görbe interpolálja a kezdő és a végpontot.

  • -szoros csomóérték esetén, , valamely , akkor a görbe áthalad kontrollponton.

  • Érvényes az affin invariancia tulajdonság. Ha a görbét affin transzformációnak akarjuk alávetni, akkor elég a kontrollpontokat transzformálni, és nem kell a görbe összes pontját.

  • -ad rendű nyílt B-spline görbe esetén, ha és a csomóvektor akkor a B-spline görbe amellett hogy interpolálja a kontrollpoligon kezdő és a végpontját még Bézier görbére is redukálódik.

  • Ha ( db) pontok kollineárisak, és nem mind esik egy pontba, akkor a bspline görbe érinti a poligont. Ebből következik, hogy esetén a B-spline görbe érinti a kontrollpoligon minden szegmensét.

  • A görbe legalább annyiszor metsz egy hipersíkot (2D-ben egyenest), mint a hipersik a kontrollpoligont. (Variation-diminishing property)

  • Zárt (vagy periodikus) B-spline görbe a következő két módon definiálható a kontrollpontokra. Az egyik lehetőség, hogy a kontrollpontokat ciklikusan ismételjük, azaz

    Ebben az esetben a görbe megadható a következő módon:

    A másik lehetőség, hogy

    és periódikusan kiterjesztjük a csomóértékeket

    Ez a következő csomóvektorhoz vezet:

    Ebben az esetben a görbe így írható fel:

9.2. ábra. Egyenes szakaszt tartalmazó harmadfokú B-spline görbe

9.3. ábra. Egy másodfokú B-spline görbe íveinek konvex burka

9.4. ábra. Uniform B-spline görbék

B-spline görbék kapcsolódása

Kapcsolódó görbeívek használata igen gyakori a modellezésben. Ilyen esetekben a csatlakozásnál megadjuk a folytonosság mértékét. Ha és két csatlakozó görbe legalább -szer folytonosan differenciálható és az paraméternél igaz, hogy

akkor azt mondjuk, hogy ed renben folytonosan kapcsolódnak egymáshoz (edrenben érintkeznek), ezt röviden -folytonosságnak nevezzük. Az előbbi definíciót gyakran matematikai folytonosságnak nevezzük, emellett beszélhetünk geometriai folytonosságról is. Ha

akkor folytonosságról (érintő folytonosság) beszélünk, tehát csak az érintők iránya kell, hogy megegyezzen a nagysága nem. Ha

akkor folytonosságról (görbület folytonosság) beszélünk, tehát az csatlakozási pontban a görbület megegyezik. Ha

akkor folytonosságról (torzió folytonosság) beszélünk, tehát mindkét görbe esetében a csatlakozási pontban a második deriváltak segítségevel meghatározható torzió megegyezik.

B-spline görbék egymáshoz kapcsolódó ívekből áll. A kapcsolódási pontok a csomóértékekhez tartozó pontokban vannak, tehát ezekben a pontokban vizsgálhatjuk a kapcsolódás folytonosságát. Az

görbe

ívei -ed endben folytonosan kapcsolódnak egymáshoz az csomóértéknél, ha es multiplicitása A csomóérték multiplicitásának növelése csökkenti a kapcsolódás folytonosságát, azaz, ha az csomóérték multiplicitása , akkor a folytonos kapcsolódás rendje Tehát a csomóértk multiplicitásának növelése olyan mértékben húzhatja a megfelelő kontrollpont felé a görbét, hogy akár ott csúcspont is kialakulhat.

9.5. ábra. Csúcspont kialakulása a csomóérték multiplicitásának növelésével

B-spline görbe előállítása

A görbe alőállítására – az előbbi fejezet alapján – már tudunk készíteni programot. Mivel a polinominális alakban megadott rekurzív függvény számítása rosszul kondicionált, ezért javallott  a Bézier görbénél tanult lineáris műveleteket tartalmazó de Casteljau algoritmushoz hasonló Cox de Boor algoritmus használata.

Cox-de Boor algoritmus

de Boor javasolt egy algoritmust arra, hogy B-spline görbe pontot állítsunk elő rekurzívan, lineáris műveletek segítségével. A (9.1) egyenletben definiált rekurzív formula átalakításával kezdjük:

Indextranszformációt hajtunk végre a második tagon, ,amely a következőt eredményezi

ahol, és . Az újraindexelést folytatva kapjuk

ha

akkor

konvex lineáris kombináció, ahol

Ha az algoritmust folytatjuk addig, hogy feltétel teljesül, akkor megkapjuk az bázisfüggvényt, azaz esetén a függvényértéket

Ezt a felosztási algoritmust Cox-de Boor algoritmusnak nevezzük. Ha az és multiplicitása , azaz

akkor speciális esetként a de Casteljau-algoritmust kapjuk, következésképpen a B-spline görbe speciális eseteként a Bézier görbét. Bizonyítást a [48]-ban találjuk meg.

Figyelembe véve azt a tényt, hogy adott paraméter esetén minden eltűnik kivéve azon bázisfüggvényt, ahol az indexekre igaz, hogy A Cox- de Boor algoritmus a következő sémával adható meg:

Ez alapján a szerkesztés is könnyen elvégezhető, csak itt a szakaszok osztási aránya függ a csomóértékektől.

9.6. ábra. B-spline görbepont szerkesztése de Boor algoritmussal,

Mivel programozási szempontból nagyon fontos a Cox-de Boor algoritmus, ezért részletesen megadjuk az algoritmust:

Adatok:

  • ahol de Boor pont , a B-spline görbe rendje (fokszám

  • Zárt görbe esetén, a (9.3) szerint megadott csomóértékeket érdemes kiterjeszteni jobbra és balra is, azaz bevezetni az

    értékeket

  • Nyílt görbe esetén, a csomóértékek megadása legyen

A számítás menete:

Határozzuk meg a paraméter értékhez tartozó görbe pontot.

  1. Keressünk olyan értéket, amelyre igaz

  2. Legyen , for to do

  3. Ismételten alkalmazzuk a formulát: for to do for to do

    Ha uniform módon adjuk meg a csomóértékeket és a lépésköz 1, akkor

  4. Számítsuk ki a görbepontot .

Interpoláció B–spline görbével

A B-spline görbe approximáló görbe, de használhatjuk interpolációra is. Farin [21], Piegl [63] munkái alapján is elemeztem ezt a problémát [52]-ban és [32]-ban. Keresünk egy olyan adott fokszámú B-spline görbét, azaz határozzuk meg kontrollpontjait és csomóértékeit, amely az adott paraméterértéknél az adott ponton áthalad. Ha pontok illeszkednek egy ad fokú nem racionális B-spline görbére, akkor kielégítik a következő egyenletből és ismeretlenből álló egyenletrendszert

ahol , és az paramétereket hozzárendeljük minden -hez és választunk egy megfelelő csomóvektort. A kontrollpontok lesznek az egyenletrendszer keresett db ismeretlenje. Az egyenletrendszernek egy együttható mátrixa van és természetesen megoldáshalmaza, ha -kontrollpontoknak koordinátája van, azaz a pontok koordinátáinak a száma, tipikusan 2,3 vagy 4.

A (9.4) egyenletrendszert kifejtve a következőt kapjuk

amelyet átírhatunk (a szokásos módon) mátrix alakba

Ha , azaz egyenletből és ismeretlenből áll az egyenletrendszer, akkor mátrix kvadratikus, és az eredmény mátrixszorzással nyerhető, azaz,

A probléma megoldása tehát és meghatározására korlátozódik, mivel megválasztásuk befolyásolja a görbe alakját. Tegyük fel, hogy a paramétertartomány . A paraméterek kiválasztására sok módszer ismert, ekvidisztáns (egyenlőközű), ívhossz szerinti, centripetális mód. Számítási igényeket és a kapott görbe alakját is figyelembe véve a centripetális módszer a javasolt. Legyen

tudva, hogy és ,

Ez a módszer jobb eredményt ad, amikor a pontok hirtelen élesen változnak, tehát éles „kanyart” várunk a görbétől. Ajánlott még a centripetális módszer kombinálása az átlagolás technikájával. Azaz

Ez a kombináció vezet a (9.4) egyenletrendszerhez, és biztosítja a következő előnyös tulajdonságot: ha . Az egyenletrendszert megoldhatjuk (9.5) szerint is, de javasolt a Gauss elimináció (vagy a Gauss-Jordan módszer) használata. Érdemes az LU dekompozíció technikájával alsó és felső háromszögalakú komponensekre bontani az együtthatómátrixot (lásd [68]).

Bár az eredmény görbe mindenhol folytonos, előfordulhat, hogy nem lesz elég szép sima és tartalmazhat váratlan hullámokat és kilengéseket. A nem várt kilengések elkerülése végett keressünk kevesebb kontrollpontot mint input pontot, azaz . Mivel ebben az esetben már nem kvadratikus, ezért a (9.4) egyenletrendszer átírva kompakt mátrix alakba a következőt eredményezi:

Nem minden esetben kapunk megoldást, mivel a feladat túlhatározott, de ilyenkor numerikus úton kezelhető a probléma.

Racionális görbék

A racionális Bézier görbékhez hasonlóan lehet bevezetni a racionális B-spline görbét is. Térbeli parabolák vetületeként (pl. a síkra) állíthatunk elő kúpszeleteket, azaz, kúpszeletek térbeli másodrendű Bézier görbék centrális vetületei lesznek. Ezen megközelítés általánosítása a racionális Bézier görbe.(Hoschek[42] és Juhász [41] alapján.)

Racionális Bézier görbe

A Bernstein polinomokat a következő binomiális formulából származtathatjuk

A

polinomokat -edfokú Bernstein poilomoknak nevezzük.

9.5. definíció. Az

kifejezéssel definiált görbét n-edrendű racionális Bézier görbének nevezzük. A pontokat a görbe kontrollpontjainak, az általuk definiált poligont kontrollpoligonnak, a skalárokat pedig súlyoknak nevezzük.

A definíció szemléletesen ez azt jelenti, hogy a négydimenziós térben egy koordinátarendszerben adott egy -edrendű Bézier görbe kontrollpontjaival. Ezt a görbét levetítjük az origóból a hipersíkra (3 dimenziós).

Látható, hogy esetén nem racionális Bézier görbét kapunk. Negatív súlyok esetén szingularitások léphetnek fel, azaz (9.6)-ban a nevező eltűnik, azaz amely akkor fordul elő, ha van olyan pont, amelynek vetülete végtelen távoli pont. A súlyok csak arányosság erejéig vannak meghatározva, azaz, a -k tetszőleges számmal szorozhatóak. A (9.6) definíciót átalakítva, kapjuk, hogy

amelyből látható, hogy az alapfüggvény:

Ebből következik, hogy a racionális Bézier görbe a kontrollpontok olyan lineáris kombinációja, ahol az együtthatók nem negatívak és összegük 1. Érvényes tehát az affin invariancia tulajdonság is. A súlyokat alakparamétereknek nevezzük, mivel ha növeljük egy értékét akkor a görbe a megfelelő kontrollpont felé fog mozogni.

Racionális B-spline görbe, NURBS

A jelenlegi tervezési rendszerekben a nem uniform racionális B-spline görbék, amelynek szokásos rövidítése NURBS (nonuniform rational B-spline), biztosítják a legtöbb szabadságot, és a legtöbb alakváltoztatási lehetőséget a tervezők számára. Az előző pont alapján teljesen analóg módon megadhatjuk a racionális Bézier görbéhez hasonlóan a racionális B-spline görbét is. Szemléletesen tárgyalva azt mondhatjuk, hogy ha a négydimenziós térben egy koordinátarendszerben adott egy B-spline görbe kontrollpontjaival, és ezt a görbét centrálisan levetítjük az origóból a hipersíkra (3 dimenziós), akkor vetületként racionális B-spline görbét kapunk. Dimenziószámokat változtatva kapunk egyéb eseteket, pl eggyel csökkentve síkbeli racionális B-spline görbéhez jutunk.

9.6. definíció. Az

kifejezéssel definiált görbét -ed fokú racionális B-spline görbének nevezzük. A pontokat a görbe kontrollpontjainak, az általuk definiált poligont kontrollpoligonnak, a skalárokat pedig súlyoknak nevezzük. Az a -ed fokú normalizált B-spline alapfüggvény, amelyhez meg kell adnunk az csomóvektort is, amelyben a csomóértékekre mint skalárokra igaz, hogy .

A súlyokat a szingularitások elkerülése végett pozitívnak szokták választani, mivel ebben az esetben nem csak a nem racionális B-spline görbék kedvező tulajdonságait tartja meg (local support, konvex burok, folytonosan differenciálhatóság), hanem még újabb alakváltoztatási lehetőséghez is jutunk. A racionális Bézier görbéhez hasonlóan a súlyokat alakparamétereknek nevezzük, mivel ha növeljük egy értékét akkor a görbe a megfelelő kontrollpont felé fog mozogni. Ez a tulajdonság hasonló ahhoz, amelyet a csomóérték multiplicitással érünk el, de nem egyezik meg azzal. Megjegyezzük, hogy egyszerű átalakításokkal megkaphatjuk a racionális Cox- de Boor algoritmust is (lásd [41]).

Legyenek megadva a kontrollpontok (de Boor pontok) homogén koordinátás alakban

ahol a ideális pont, olyan pont képe, amely végtelenbe kerül a centrális vetítés során. Homogén koordinátás alakban a -ad rendű racionális B-spline görbe

amely nem homogén alakban esetén

B-spline felület

Ebben a pontban a B-spline felületet definiáljuk, mivel további kutatásaink szempontjából – a geometria tervezésnél a legnépszerűbb – NURBS felületekkel törődünk. Kiindulásként tekintsük a következő felületek osztályát

ahol egy tetszőleges görbe, pedig egy -es mátrix. Az így kapott felület nem más, mint az paramétertől függő egyparaméteres görbesereg által súrolt felület. A görbe térbeli mozgása során egy felületet ír le. Megengedett, hogy a görbe alakja is változzon a mozgás során. Pontosan az utóbbi tulajdonsággal származtatható Bézier és B-spline felület is.

Tegyük fel, hogy az kontrollpontjával adott B-spline görbét mozgatjuk, úgy, hogy feltételezzük, hogy a B-spline görbe kontrollpontjai ugyancsak B-spline görbén mozognak. Jelöljük -vel az kontrollpontok pályáját meghatározó B-spline görbe kontrollpontjait , azaz . Ebben az esetben a mozgó B-spline görbe

amelynek kontrollpontjai az

B-spline görbén mozognak. A két alakot kombinálva a következő felületet kapjuk

Ezt a felületet B-spline felületnek, vagy tenzor szorzattal előállított B-spline felületnek nevezzük. A pontokat a felület kontrollpontjainak, az általuk meghatározott hálót pedig kontrollhálónak nevezzük. Megjegyezzük, hogy az előbbihez hasonlóan más görbék tenzor szorzataként is származtathatunk felületet. Az

felület tenzor szorzat felület (tensor product surface), ahol a és a különböző bázisfüggvények, például Bézier felület esetén Bernstein polinomok, de lehetnek például Lagrange-, racionális Bézier- vagy racionális B-spline alapfüggvények is.

9.7. ábra. B-spline felület és kontrollháló

10. fejezet - Függelék

Window-viewport transzformációk

A legtöbb grafikus problémát általában Descartes koordináta-rendszerben oldunk meg, tehát derékszögű úgynevezett világkoordináta-rendszerben adjuk meg az algoritmust. A világkoordináta-rendszer speciális, ezért gyakran transzformálni kell a periféria koordináta-rendszerbe. Általában a világ koordináta-rendszer derékszögű ablakát (Window) transzformáljuk az output rendszer képtartományába (Viewport). Gyors algoritmusra van szükségünk, mivel sok pont kezelésével nagy mennyiségű ismétlődő számítást kell elvégeznünk.

10.1. ábra. Window-vieport transzformáció

A geometriai input és output adatokat koordináta-rendszerek közötti leképezéseknek vetjük alá. A következő koordináta-rendszereket különböztetjük meg:

  • világkoordináta-rendszer (World Coordinates, WC) a felhasználó ebben adja meg illetve ebben kapja vissza a geometria információkat.

  • normalizált eszközkoordináta-rendszer (Normalized Device Coordinates, NDC), a különböző grafikus munkahelyek számára egységes koordináta-rendszer.

  • eszközkoordináta-rendszere (Device Coordinates, DC), a munkahely hardverének megfelelő specifikus koordináta-rendszer.

A 10.1. ábra alapján könnyen előállíthatunk egy olyan függvényt, amely világkoordináta-rendszerben lévő pont leképezi a normalizált eszközkoordináta-rendszerbe. A függvénynek rendelkeznie kell a következő tulajdonságokkal:

a világ koordináta-rendszer derékszögű ablakának (Window) határvonalpontjait az output rendszer képtartományának (Viewport) határvonalpontjaiba transzformálja.

Tehát a következő megfeleltetés igaz:

Egyenestartó leképezés, vagyis egyenes képe is egyenes lesz. Az x és y tengelyek a két rendszerben páronként párhuzamosak egymással. Ebből következik, hogy a leképezés lineáris és a 19. ábra alapján a következő összefüggés vezethető le:

és igaz, hogy

ebből adódik, hogy

visszahelyettesítve (10.1)-be:

Új jelöléseket bevezetve: és hasonlóan számítható dvy és dwy.

ami lineáris leképezés.

A másik koordinátára hasonló kifejezést kapunk:

Tehát végeredményként azt kaptuk, hogy

Mivel a leképezés során függetlenek a transzformálandó ponttól ezért ezeket az értékeket csak egyszer kell kiszámítani. Ha vagy  akkor a transzformálandó pont kívül esik az ablakon ezért nem kell vele foglalkozni.

Uniform eszköz transzformáció

10.2. ábra. Világ koordináták

10.3. ábra. Normalizált eszköz koordináták

A 10.2. és 10.3. ábrák egy Window-Viewport transzformációt illusztrálnak, ahol a torzítási tényezők (aspect ratio) nem egyeznek meg. Torzítási tényezőn a magasság és a szélesség arányát értjük. Ilyen estetekben a kör képe ellipszis lesz. A leképezési függvényben szereplő (dvx/dwx) és (dvy/dwy) nem egyenlő. Ez elfogadható, de a programozónak nagyon ügyelnie kell, hogy ne feledkezzen meg a torzulásról. Az uniform transzformációknál követelmény az előbbi hányadosok egyenlősége. is nevezhetjük Az uniform transzformáció valójában hasonlósági transzformáció is, mivel hasonló alakzatok keletkeznek.

Window-viewport tarnszformáció 2. változat

Megoldhatjuk a problémát síkbeli – 3x3-as – transzformációs mátrixok szorzásával is.

  1. Az ablak bal alsó sarkát az origóba toljuk.

  2. Skálázunk az ablak és a képmező (viewport) oldalarányaival, és az y tengelyre tükrözünk.

  3. Az ablak bal felső sarkát a képmező bal felső sarkába toljuk. (Az y tengely mentén többet kell tolnunk a tükrözés miatt.)

Az első lépésben az eltolás vektora

A második lépésben az skálázás mátrixa, amely tartalmazza az y tengelyre való tükrözést is:

A harmadik lépésben vissza kell tolnunk a már skálázott ablakot a képmezőbe, akkor eltolás vektora

Figyelnünk kell arra, hogy a transzformációkat fordított sorrendben kell elvégezni, erre a program mellékletben ügyeltünk. Ha összeszorozzuk a mátrixokat, akkor a 10.2-ban közölt eredményeket kapjuk.

Programkódok

Az identitás mátrixa:

         
// NxN-es egységmátrixot ad vissza 
      public static Matrix Identity(int dimensions) 
      { 
        Matrix ret = new Matrix(dimensions, dimensions); 
        for (int i = 1; i <= dimensions; ++i) 
           { 
            ret[i, i] = 1; 
           } 
        return ret; 
      }
         

Az eltolás mátrixa:

      
// Háromdimenziós eltolási mátrix 
public static Matrix Translate3D(double dx, double dy, double dz) 
{ 
   return new Matrix(4, 4, 
                1, 0, 0, dx, 
                0, 1, 0, dy, 
                0, 0, 1, dz, 
                0, 0, 0, 1); 
}
     

Az elforgatás mátrixa:

      
// 3D-s forgatási mátrix az X tengely körül 
public static Matrix Rotate3Dx(double alpha) 
{ 
  return new Matrix(4, 4, 
               1, 0, 0, 0, 
               0, Math.Cos(alpha), -Math.Sin(alpha), 0, 
               0, Math.Sin(alpha), Math.Cos(alpha), 0, 
               0, 0, 0, 1); 
} 
 
// 3D-s forgatási mátrix az Y tengely körül 
public static Matrix Rotate3Dy(double alpha) 
{ 
   return new Matrix(4, 4, 
                 Math.Cos(alpha), 0, Math.Sin(alpha), 0, 
                0, 1, 0, 0, 
                -Math.Sin(alpha), 0, Math.Cos(alpha), 0, 
                0, 0, 0, 1); 
} 
 
// 3D-s forgatási mátrix a Z tengely körül 
public static Matrix Rotate3Dz(double alpha) 
{ 
   return new Matrix(4, 4, 
                Math.Cos(alpha), -Math.Sin(alpha), 0, 0, 
                Math.Sin(alpha), Math.Cos(alpha), 0, 0, 
                0, 0, 1, 0, 
                0, 0, 0, 1); 
}
     

Rodrigues-féle forgatás mátrixa:

      
// Tetszőleges tengely körüli forgatás 
public static Matrix Rodrigues(double phi, Point3D P1, Point3D P2) 
{ 
  double h = Math.Sqrt((P2.X - P1.X) * (P2.X - P1.X) + 
                  (P2.Y - P1.Y) * (P2.Y - P1.Y) + 
                  (P2.Z - P1.Z) * (P2.Z - P1.Z)); 
  // A normált vektor koordinátái: 
  double cx, cy, cz, d, CosPhi, SinPhi; 
  cx = (x2 - x1) / h; 
  cy = (y2 - y1) / h; 
  cz = (z2 - z1) / h; 
  d = Math.Sqrt(cz * cz + cy * cy); 
  CosPhi = Math.Cos(phi); 
  SinPhi = Math.Sin(phi); 
  Matrix cg = new Matrix(4, 4, 
 
  (-CosPhi + 1) * cx * cx + CosPhi, 
  (-CosPhi + 1) * cx * cy - SinPhi * cz, 
  (-CosPhi + 1) * cx * cz + SinPhi * cy, 0, 
 
  (-CosPhi + 1) * cx * cy + SinPhi * cz, 
  (-CosPhi + 1) * cy * cy + CosPhi, 
  (-CosPhi + 1) * cy * cz - cx * SinPhi, 0, 
 
  (-CosPhi + 1) * cx * cz - SinPhi * cy, 
  (-CosPhi + 1) * cy * cz + cx * SinPhi, 
  (-CosPhi + 1) * cz * cz + CosPhi, 0, 
 
   0, 0, 0, 1); 
   return cg; 
}
     

A koordináta síkra való tükrözés mátrixa:

      
// x-y síkra való tükrözés 
public static Matrix ReflectXY() 
{ 
   return new Matrix(4, 4, 
                1, 0, 0, 0, 
                0, 1, 0, 0, 
                0, 0,-1, 0, 
                0, 0, 0, 1); 
}
     

Tetszőleges síkra való tükrözés mátrixa, 1.változat:

      
\\Tetszőleges síkra való tükrözés 1.változat 
public static Matrix Reflection1( Point3D A, Point3D B, Point3D C) 
{ 
  Point3D v1 = new Point3D(B.X - A.X, B.Y - A.Y, B.Z - A.Z), 
        v2 = new Point3D(C.X - A.X, C.Y - A.Y, C.Z - A.Z), 
        normv = new Point3D(0, 0, 0); 
  // vektoriális szorzat normv=v1xv2 
  normv.X = v2.Y * v1.Z - v2.Z * v1.Y; 
  normv.Y = v2.Z * v1.X - v2.X * v1.Z; 
  normv.Z = v2.X * v1.Y - v2.Y * v1.X; 
  //normalizálás :|normv|=1 
  double h = Math.Sqrt(normv.X * normv.X + normv.Y * normv.Y + 
          normv.Z * normv.Z); 
  //normált vektor koordinátáit segédváltozókban tároljuk 
  double cx, ay, az; 
  cx = normv.X / h; 
  cy = normv.Y / h; 
  cz = normv.Z / h; 
  Matrix cg = new Matrix(4, 4, 
      1 - 2 * cx * cx, -2 * cy * cx , -2 * cz * cx , 0, 
      -2 * cy * cx , 1 - 2 * cy * cy, -2 * cy * cz , 0, 
      -2 * cz * cx , -2 * cy * cz , -2 * cz * cz + 1, 0, 
      0, 0, 0, 1); 
  return cg; 
}
     

Tetszőleges síkra való tükrözés mátrixa, 2.változat:

      
\\Tetszőleges síkra való tükrözés 2.változat 
public static Matrix Reflection2( Point3D A, Point3D B, Point3D C) 
{ 
  Point3D v1 = new Point3D(B.X - A.X, B.Y - A.Y, B.Z - A.Z), 
        v2 = new Point3D(C.X - A.X, C.Y - A.Y, C.Z - A.Z), 
        normv = new Point3D(0, 0, 0); 
  // vektoriális szorzat normv=v1xv2 
  normv.X = v2.Y * v1.Z - v2.Z * v1.Y; 
  normv.Y = v2.Z * v1.X - v2.X * v1.Z; 
  normv.Z = v2.X * v1.Y - v2.Y * v1.X; 
  //normalizálás :|normv|=1 
  double h = Math.Sqrt(normv.X * normv.X + normv.Y * normv.Y + 
          normv.Z * normv.Z); 
  //normált vektor koordinátáit segédváltozókban tároljuk 
  double cx, cy, cz; 
  cx = normv.X / h; 
  cy = normv.Y / h; 
  cz = normv.Z / h; 
  //------- különbség cz 1.változattól -------- 
  // a sík fix pontja legyen cz A pont 
  double x0 = A.X, y0 = A.Y, z0 = A.Z, 
       d =-cx * x0-cy * yo-cz * z0; 
  Matrix cg = new Matrix(4, 4, 
   1 - 2 * cx * cx, -2 * cy * cx , -2 * cz * cx , -2 * cx * d, 
   -2 * cy * cx , 1 - 2 * cy * cy, -2 * cy * cz , -2 * cy * d, 
   -2 * cz * cx , -2 * cy * cz , -2 * cz * cz + 1, -2 * cz * d, 
   0, 0, 0, 1); 
  return cg; 
  //------- különbség vége ------- 
}
     

A skálázás mátrixa:

                                                                                                                                     

                                                                                                                                     
         
// Skálázás 
public static Matrix Scale3D(double kx, double ky, double kz) 
{ 
  return new Matrix(4, 4, 
               kx, 0 , 0 , 0, 
               0 , ky, 0 , 0, 
               0 , 0 , kz, 0, 
               0 , 0 , 0 , 1); 
}
         

A hasonlóság mátrixa 1.változat:

      
// Kicsinyítés vagy nagyítás 
public static Matrix Scale3D(double k) 
{ 
  return new Matrix(4, 4, 
               k, 0, 0, 0, 
               0, k, 0, 0, 
               0, 0, k, 0, 
               0, 0, 0, 1); 
}
     

A hasonlóság mátrixa 2.változat:

      
// Kicsinyítés vagy nagyítás 
public static Matrix Scale3D(double k) 
{ 
  return new Matrix(4, 4, 
               1, 0, 0, 0 , 
               0, 1, 0, 0 , 
               0, 0, 1, 0 , 
               0, 0, 0, 1/k); 
}
     

A vetítés mátrixa:

      
//Merőleges vetítés mátrixa 
public static Matrix OrtogonalProj() 
{ 
  return new Matrix(4, 4, 
               1, 0, 0, 0, 
               0, 1, 0, 0, 
               0, 0, 0, 0, 
               0, 0, 0, 1); 
} 
//Párhuzamos vetítés mátrixa 
public static Matrix ParalellProj(double vx,double vy,double vz) 
{ 
  return new Matrix(4, 4, 
               1, 0, -vx/vz, 0, 
               0, 1, -vy/vz, 0, 
               0, 0,    0, 0, 
               0, 0,    0, 1); 
} 
//Centrális vetítés 1.változat 
// A nézőpont a Z tengely pozitív felén van 
// és negatív irányba néz, a képsík az XY sík. 
public static Matrix CentralProj1(double eyeDistance) 
{ 
  return new Matrix(4, 4, 
               1, 0, 0, 0, 
               0, 1, 0, 0, 
               0, 0, 0, 0, 
               0, 0, -1 / eyeDistance, 1); 
} 
//Centrális vetítés 2.változat 
// A nézőpont az origóban van 
// és pozitív irányba néz, a képsík az z=eyeDistance sík. 
public static Matrix CentralProj2(double eyeDistance) 
{ 
  return new Matrix(4, 4, 
               1, 0, 0, 0, 
               0, 1, 0, 0, 
               0, 0, 1, 0, 
               0, 0, 1 / eyeDistance, 0); 
}
     

Speciális nézeti rendszer:

      
// Viewing system 
// Áttérés világ koordináákról kamera koordinátákra 
// Kamera: gömbi koordinátákkal van megadva; 
// a világkoordináta rendszer origójába néz; 
// a függőleges irány a világ koordináta-rendszer 
// z tengelye jelöli ki; 
// balsodrású a kamera koordináta rendszer. 
public static Matrix SpecViewingSystem(double alpha, double beta, 
                             double r) 
{ 
   double sina = Math.Sin(alpha * Math.PI / 180); 
   double cosa = Math.Cos(alpha * Math.PI / 180); 
   double sinb = Math.Sin(beta * Math.PI / 180); 
   double cosb = Math.Cos(beta * Math.PI / 180); 
 
   return new Matrix(4, 4, 
                -sina, cosa, 0, 0, 
                -cosa * cosb, -sina * cosb, sinb, 0, 
                -cosa * sinb, -sina * sinb, -cosb, r, 
                        0, 0, 0, 1); 
}
     

Általános nézeti rendszer:

      
// General Viewing system u,v,n vektorokkal 
public static Matrix GenViewingSystem( Point3D C, Point3D F, 
                             Point3D Up, string sodras) 
{ 
   // Áttérés világ koordináákról kamera koordinátákra 
   // Kamera: Descartes koordinátákkal, van megadva; 
   // a z tengely iránya : n, F-C; 
   // a y tengely iránya: v=Up-skalarisszorzat(Up,n)*n; 
   // a x tengely iránya: u=vxn->jobbsodrású 
   // -u=nxv->balsodrású koordináta-rendszer. 
   Point3D n = new Point3D(F.X - C.X, F.Y - C.Y, F.Z - C.Z), 
         v = new Point3D(0, 0, 0), 
         u = new Point3D(0, 0, 0); 
   //|n|=1 
   n = Normalizalas(n); 
   v.X = Up.X - SkalariSzorzat(Up, n) * n.X; 
   v.Y = Up.Y - SkalariSzorzat(Up, n) * n.Y; 
   v.Z = Up.Z - SkalariSzorzat(Up, n) * n.Z; 
   v = Normalizalas(v); 
   u = VektorialisSzorzat(v, n); 
   u= Normalizalas(u); 
   if (sodras == "bal") 
   { 
      u.X = -u.X; u.Y = -u.Y; u.Z = -u.Z; 
   } 
   Matrix Tc = new Matrix(4, 4, 
                   u.X, u.Y, u.Z, 0, 
                   v.X, v.Y, v.Z, 0, 
                   n.X, n.Y, n.Z, 0, 
                   0, 0, 0, 1); 
   Matrix T = new Matrix(4,4); 
        T = Matrix.Translate3D(-C.X,-C.Y,-C.Z); 
   Matrix cg = new Matrix(4, 4); 
   cg = Tc * T; 
   return cg; 
}
     

Window-viewport transzformáció mátrixa:

      
// Window to viewport transzformációs mátrix 
public static Matrix WindowToViewPort(RectangleF window, 
                            RectangleF viewport) 
{ 
   // 1. Az ablak bal alsó sarkát az origóba toljuk. 
   // 2. Skálázunk az ablak és a viewport oldalarányaival, 
   //   és az Y tengelyre tükrözünk. 
   // 3. A kép bal felső sarkát a viewport bal felső sarkába toljuk. 
   //   (Az Y tengely mentén többet kell tolnunk a tükrözés miatt.) 
 
   return Matrix.Translate2D(viewport.Left, 
                      viewport.Top + viewport.Height) * 
        Matrix.Scale2D(viewport.Width / window.Width, 
                   -viewport.Height / window.Height) * 
        Matrix.Translate2D(-window.Left, -window.Top); 
}
     

Kavalier-axonometria mátrixa:

      
 
// A Kavalier-axonometria mátrixa. 
// Az X és Y tengelyek egységvektorainak képe önmaga, 
// a Z tengely egységvektorának képe length hosszú, és 
// angle szöget zár be az X tengellyel 
public static Matrix KavalierAxonometry(double length, double angle) 
{ 
   return new Matrix(3, 4, 
                1, 0, -length * Math.Cos(angle), 0, 
                0, 1, -length * Math.Sin(angle), 0, 
                0, 0, 0, 1); 
}
     

A mátrix osztály:

                                                                                                                                     

                                                                                                                                     
         
class Matrix 
{ 
   // a sorok és oszlopok száma 
   private int rows, cols; 
   public int Rows 
   { 
      get 
      { 
         return rows; 
      } 
   } 
   public int Cols 
   { 
      get 
      { 
         return cols; 
      } 
   } 
   // Az elemeket 1-től indexelünk, hogy közelebb legyünk 
   // a matematikai jelöléshez. 
   // Az elemek kívülről nem módosíthatók 
   private double[,] elements; 
   public double this[int i, int j] 
   { 
      get 
      { 
         return elements[i - 1, j - 1]; 
      } 
      private set 
      { 
         elements[i - 1, j - 1] = value; 
      } 
   } 
 
   // Az osztály metodusainak a felsorolása, lásd lentebb. 
   //\dots 
} 
//Metodusok 
//Mátrix létrehozása, az elemek implicite 0-k lesznek 
//Privát a konstruktor, mivel kívülről nics értelme hívni 
//(a hívó nem tudná utólag kitölteni az elemeket) 
private Matrix(int_rows, int_cols) 
{ 
   if (_rows <= 0 ||_cols <= 0) 
   { 
      throw new ArgumentException("Legyen␣pozitív␣a␣dimenzió!"); 
   } 
   rows =_rows; cols =_cols; 
   elements = new double[_rows,_cols]; 
} 
 
//Mátrix létrehozása a dimenziók és az elemek megadásával 
public Matrix(int_rows, int_cols, params double[] values) 
   : this(_rows,_cols) 
{ 
   // ellenőrízzük, hogy a megadott elemek száma megfelelő-e 
   if (values.Length != rows * cols) 
   { 
      throw new ArgumentException("Nem␣megfeleő␣az␣elemek␣száma!"); 
   } 
   // a values tömbből sorfolytonosan töltjük fel a mátrix elemeit 
   int curr = 0; 
   for (int i = 0; i < rows; ++i) 
      for (int j = 0; j < cols; ++j) 
      { 
         elements[i, j] = values[curr]; 
         ++curr; 
      } 
} 
 
// A mátrixszorzás operátora 
public static Matrix operator *(Matrix left, Matrix right) 
{ 
   // Megnézzük, lehet-e egyáltalán szorozni a két mátrixot 
   if (left.cols != right.rows) 
   { 
      throw new ArgumentException("Nem␣összeszorozható␣matrixok!"); 
   } 
   Matrix res = new Matrix(left.rows, right.cols); 
   // Kihasználva azt, hogy a privát konstruktorunk 0-val 
   // töltötte fel a res mátrixot, elég a ciklus 
   // belsejében += operátort használni. 
   for (int i = 1; i <= res.rows; ++i) 
      for (int j = 1; j <= res.cols; ++j) 
         for (int k = 1; k <= left.cols; ++k) 
         { 
            res[i, j] += left[i, k] * right[k, j]; 
         } 
   return res; 
} 
 
 
// Kétdimenziós eltolási mátrix 
public static Matrix Translate2D(double x, double y) 
{ 
   return new Matrix(3, 3, 
                1, 0, x, 
                0, 1, y, 
                0, 0, 1); 
} 
 
// Kétdimenziós skálázási mátrix 
public static Matrix Scale2D(double x, double y) 
{ 
   return new Matrix(3, 3, 
                x, 0, 0, 
                0, y, 0, 
                0, 0, 1); 
} 
 
// NxN-es egységmátrixot ad vissza 
public static Matrix Identity(int dimensions) 
{ 
   Matrix ret = new Matrix(dimensions, dimensions); 
   for (int i = 1; i <= dimensions; ++i) 
   { 
      ret[i, i] = 1; 
   } 
   return ret; 
} 
 
\\A mátrix transzponáltja 
public Matrix Transpose() 
{ 
   Matrix ret = new Matrix(cols, rows); 
   for (int i = 1; i <= rows; ++i) 
      for (int j = 1; j <= cols; ++j) 
      { 
         ret[j, i] = this[i, j]; 
      } 
   return ret; 
}
         

Irodalomjegyzék

[1] Alder, M., Togneri, R., Lai, E., Attikiouzel, Y., Kohonen’s algorithm for the numerical parametrisation of manifolds, Pattern Recognition Letters 11, pp. 313-319, 1990.
[2] Aumann, G., Approximate development of skew ruled surfaces. Comput. & Graph. 13 361-366, 1989.
[3] Aumann, G., Interpolation with developable Bézier patches. Computer Aided Geometric. Design. 8 409-420, 1991.
[4] Barhak, J., Fischer, A., Parametrization and reconstruction from 3D scattered points based on neural network and PDE techniques, IEEE Transactions on Visualization and Computer Graphics, Vol. 7, No.1, 2001.
[5] Barsky, B., Computer Graphics and Geometric Modelling Using Beta-splines, Springer-Verlag, Berlin, 1988.
[6] Blum, H., A transformation for extracting new descriptions of shape, IEEE Proceedings of the Symposium on Models for the Speech and Vision Form, Boston, pp. 362-380, 1964.
[7] Bodduluri, R., Ravani, B., Design of developable surfaces using duality between plane and point geometries, Computer-Aided Design, 10, pp. 621–632, 1993.
[8] Bodduluri, R., Ravani, B., Geometric Design and Fabrication of Developable Surfaces, ASME Adv. Design Autom. 2, pp. 243-250, 1992.
[9] Boehm, W., Farin, G., and Kahmann, J., A survey of curve and surface methods in CAGD, Computer Aided Geometric Design, 1, pp.1-60, 1984.
[10] de Boor, C., On calculating with B-splines, J. Approx. Theory, 6:50-62, 1972.
[11] Belongie, Serge, Rodrigues’ Rotation Formula, From MathWorld–A Wolfram Web Resource, created by Eric W. Weisstein. http://mathworld.wolfram.com/RodriguesRotationFormula.html
[12] Borgulya, I., Neurális hálók és fuzzy-rendszerek, Dialóg Campus Kiadó, Budapest-Pécs, 1998.
[13] Branhill, R. E., Representation and Approximation of Surfaces, in: Rice, J.R. (ed): Mathematical Software III., Academic Press, New Yok, 1977.
[14] Budó, Á., Kísérleti fizika, I kötet, Tankönyvkiadó, Budapest, pp 116-118, 1981.
[15] Castillo, E., Functional Networks, Neural Processing Letters 7, pp. 151-159, 1998.
[16] Coons, S.A., Surface Patches and B-spline Curves, Computer Aided Gemetric Design, Academic Press, 1974.
[17] Cox, M., The numerical evaluation of B-splines, DNAC 4, NAtional Physical Laboratory, 1971.
[18] Coxeter, H. S. M., Projektív geometria, Gondolat Könyvkiadó, Budapest, 1986., Eredeti: Porjective Geometry, Second Edition, University of Toronto Press, Toronto, 1974.
[19] Datta, A., Parui, S.K., Chaudhuri, B.B., Skeletonization by topology-adaptive self-organizing neural network, Pattern Recognition 34, Elsevier Science, pp. 617-629, 2001.
[20] Eck, M., Hadenfeld, J., Local energy fairing of B-spline curves, in: Farin, G., Hagen, H., Noltemeier, H. (Eds.), Computing 10. Springer, Berlin, 1995.
[21] Farin, G., Curves and Surfaces for Computer Aided Geometric Design A Practical Guide, Academic Press, 1996.
[22] Floater, M., Parametrization and smooth approximation of surface triangulations, Computer Aided Gemetric Design, 14, pp. 231-250, 1997.
[23] Foley, T., Hagen, H., Advances in Scattered Data Interpolation, Surv. Math. Ind. Vol.4., pp.71-84., 1994.
[24] Freeman, J., Skapura., D., Neural Networks; Algorithms, Applications and Programming Techniques, Addison-Wesley, 1991.
[25] Frey, W., H., Bindschadler, D., Computer Aided Design of a Class of Developable Bézier Surfaces, General Motors R&D Publication 8057, 1993.
[26] Gordon, W., Riesenfeld, R., B-spline curves and surfaces, In R. E. Barnhill and R. F. Riesenfeld editors, Computer Aided Geometric Design, p. 95-126, Academic Press, 1974.
[27] Greiner, G., Hormann, K., Interpolating and approximating scattered 3D data with hierarchical tensor product B-splines, in: Méhauté, A. L., Rabut, C., Schumaker, L. (Eds.), Surface Fitting and Multiresolution Methods. Vanderbilt University Press, Nashville, pp. 163-172., 1997.
[28] Gu, P., Yan, X., Neural Network Approach to the Reconstruction of Freeform Surfaces for Reverse Engineering, Computer Aided Design, Vol. 27, No.1. pp.59-64, 1995.
[29] Herman, I., The use of projective geometry in computer graphics, LectureNotes in Computer Science, 564, Springer-Verlag, 1991.
[30] Hermann, T., Kovács, Z., Várady, T., Special applications in surface fitting, in: Starsser, W., Klein, R., Rau, R. (Eds.), Geometric Modeling: Therory and Practice. Springer, pp. 14-31, 1997.
[31] Hlavaty, V., Differential line geometry, Nordhoff Ltd, Groningen, 1953.
[32] Hoffmann M., Kovács E., Interpolation possibilities using rational B-spline curve, Acta Acad. Paed. Agriensis, Vol. XXV., pp.103-107., 1998.
[33] Hoffmann M., Kovács E., Constructing ruled B-spline surfaces by Kohonen neutral network, Acta Acad. Paed. Agriensis, TOM. XXVII., Sectio Matematicae, pp. 63-68, 2000.
[34] Hoffmann M., Kovács E., Developable surface modelling by neutral network, Computers & Mathematics with Applications (közlésre elfogadva 2002)
[35] Hoffmann M., Interpolation by Beta-spline, Proceedings of the International Conference of Applied Informatics, pp. 36-44, Eger, 1993.
[36] Hoffmann M., Modified Kohonen Neural Network for Surface Reconstruction, Publ. Math. Debrecen, 54 Suppl. 857-864, 1999.
[37] Hoffmann, M., Várady, L., Free-form curve design by neural networks, Acta. Acad. Paed. Agriensis, Tom.XXIV., pp. 99–104, 1997.
[38] Hoffmann, M., Várady, L., Free-form Surfaces for Scattered Data by Neural Networks, Journal for Geometry and Graphics, Vol.2, No.1, pp. 1–6, 1998.
[39] Hormann, K., Greiner, G., An efficient global parametrization method, in: Laurent, P.-J., Sablonniére, P., Schumaker, L. (Eds.), Curve and Surface Design: Saint Malo 1999. Vanderbilt University Press, Nashville, pp. 153-162., 2000.
[40] Horn-Yang Chen, Pottmann, H., Approximation by Ruled Surfaces, Technical Report, Nr.46, 1997.
[41] Horváth, I., Juhász, I., Számítógéppel segített gépészeti tervezés, Műszaki könyvkiadó, 1996.
[42] Hoschek, J., Lasser, D., Fundamentals of Computer Aided Geometric Design, A. K. Peters, Wellesley, MA, 1993.
[43] Hoschek, J., Pottmann, H., Interpolation and approximation with developable B-spline surfaces. In: Mathematical Methods for Curves and Surfaces, (Edited by M. Dćhlen et al.), pp.255-264, Vanderbilt University Press, Nashville, 1995.
[44] Hoschek, J., Schneider, M., Interpolation and approximation with developable surfaces. In: Curves and Surfaces with Applications in CAGD, (Edited by A. Le Méhauté et al.), pp.185-202, Vanderbilt University Press, Nashville, 1997.
[45] Hoschek, J., Schwanecke, U., Interpolation and approximation with ruled surfaces, in: The Mathematics of Surfaces VII. (ed.:Robert Cripps), Elsevier, pp. 213–231, 1988.
[46] Hoschek, J., Dual Bézier Curves and Surfaces, Surfaces in Computer Aided Geometric. Design, R. E. Barnhill & W Boehm, eds., North Holland, pp.147-156, 1983.
[47] Iglesias, A., Gálvez, A., Applying functional Networks to fit data points from B-spline surfaces, in: Proceedings of the Computer Graphics Internatinal, CGI’, Hong-kong pp., 329-332, 2001.
[48] Juhász, I., Számítógépi grafika és geometria, Miskolci Egyetemi Kiadó, 1993.
[49] Klein, F., Vorlesungen Über Höhere Geometrie, Springer, Berlin, 1926.
[50] Kohonen, T., Self-organization and associative memory, Springer Verlag, 1984.
[51] Kovács E., Studying and improving linear mappings by artificial neural networks, Acta Acad. Paed. Agriensis TOM. XXVI., Sectio Matematicae, pp.104-107, 1999.
[52] Kovács E., Curve reconstruction from scaterred data by Kohonen network, Acta Acad. Paed. Agriensis, Vol. XXVII., Sectio Matematicae, pp.69-74., 2000.
[53] Lang, J., Röschel, O., Developable -Bézier surfaces. Computer Aided Geom. Design. 9 291-298, 1992.
[54] Lippmann, R.P., An Introduction to Computing with Neural Nets, IEEE ASSP Magazine, pp.18-21, April 1987.
[55] Loop, C., DeRose, T., Generalized B-spline Surface of Arbitrary Topology, Computer Graphics, Vol.24., N.4., pp.347-356, 1990.
[56] Ma, W., Kruth, J., Parametrization of randomly measured points for least squares fitting of B-spline curves and surfaces, Computer Aided Design, 27 (9), pp. 663-675, 1995.
[57] Márkus, A., Renner, G., Váncza, J., Genetic algorithms in free form curve design, Daehlen, M., Lyche, T., Schumaker, L. (Eds.), Mathematical Methods for Curves and Surfaces, Vanderbilt University Press, pp. 343-354., 1995
[58] McCullogh, W. és Pitts, W., How We Know Universals: the Perception of Auditory and Visual Forms, Bulletin of Math. Biophysics, Vol.9, pp.127-147, 1947.
[59] McCullogh, W. és Pitts, W., A Logical Calculus of the Ideas Immanent in Nervous Activity, Bulletin of Math. Biophysics, Vol.5, pp.115-133, 1943.
[60] Neumann, J., Probabilistic Logic and the Synthesis of Reliable Organisms from Unreliable Components, in: Automata Studies, Princeton University Press, Princeton, pp.43-98, 1956.
[61] Nielson, G.M., Franke, R., Surface Construction Based Upon Triangulations, in: Surfaces in CAGD, North-Holland, Amsterdam, 1983.
[62] Pfeifle, R., Seidel, H.P., Spherical Triangular B-splines with Application to Data Fitting, EUROGRAPHICS ’95, Vol.14., N.3., pp.89-96, 1995.
[63] Piegl, L., Tiller, W., The NURBS Book, Springer Verlag, 1997.
[64] Pottmann, H., Farin, G., Developable rational Bezier and B-spline surfaces, Computer Aided Geometric Design, 12, pp. 513–531, 1995.
[65] Pottmann, H., Peternell, M., Ravani, B., An introduction to line geometry with applications, Computer Aided Geom. Design.  31, pp.3-16, 1999
[66] Pottmann, H., Wallner, J., Computational Line Geometry, Springer -Verlag, Berlin Heidelberg, 2001.
[67] Pottmann, H., Wallner, J., Approximation Algorithms for Developable Surfaces, Technical Report, Nr.51, 1998.
[68] Press, W. H., Flannery, B. P., Teukolsky, S. A., Vetterling, W. T., Numerical Recipes in Pascal, The Art of Scientific Computing, Cambridge University Press, 1989.
[69] Rényi, A., Wahrscheinlichkeitsrechnung, VEB Deutscher Verlag der Wissenschaften, 1962.
[70] Riesenfield, R.F., Applications of B-spline Approximation to Geometric Problems of Computer Aided Design, PhD disszertáció, Syracuse University, 1973.
[71] Rogers, D. F., Adams, J. A., Mathematical elements for computer graphics, Second Edition, McGarw-Hill pulishing Company, 1990.
[72] Rojas, R., Neural Networks. A Systematic Introduction, Springer-Verlag, 1996.
[73] Rousseeuw, P. J., Leroy, A. M., Robust Regression and Outlier Detection, Wiley, New York, 1987.
[74] Schoenberg, I. Contributions to the problem of approximation of equidistant data by analytic functions, Quart. Appl. Math, 4:45-99, 1946.
[75] Shepard, D., A two Dimensional Interpolation Function for Irregularly Spaced Data,ProceedingsoftheACMNat.Conf., pp.517-524, 1965.
[76] Strommer Gyula, Geometria, Tankönyvkiadó, Budapest, 1988.
[77] Struik, D. J., Lectures on Classical Differential geometry, Dover Publications, Inc., Reprint, 1988.
[78] Tiller, W., Rational B-splines for Curve and Surface Representation, IEEE Comp.Graph. and Appl., Vol.3., N.9., pp.36-46., 1983.
[79] Torkkola, K. et al., Status Report of the Finnish Phonetic Typewriter Project, in: Kohonen et al (eds.): Artificial Neural Networks, North-Holland, Amsterdam, pp.771-776, 1991.
[80] Várady, T., Martin, R., Cox,J., Reverse engineering of geometric models –an intruduction, Computer Aided Gemetric Design, 29 (4) pp. 255-268, 1997.
[81] Várady, L., Hoffmann, M., Kovács, E., Improved Free-form Modelling of Scattered Data by Dynamic Neural Networks, Journal for Geometry and Graphics, Vol.3,No.2, pp.177–181, 1999.
[82] Várady, L., Analysis of the Dynamic Kohonen Network Used for Approximating Scattered Data, Proceedings of the 7th ICECGDG, Cracow, pp.433–436, 1996.
[83] Weiss, V.,Andor, L., Renner, G., Várady, T., Advanced surface fitting techniques, Computer Aided Gemetric Design, 19 pp. 19-42, 2002.
[84] Weisstein, Eric W., Point-Line Distance 2-Dimensional, From MathWorld-A Wolfram Web Resource. http://mathworld.wolfram.com/Point-LineDistance2-Dimensional.html
[85] Weisstein, Eric W.,Point-Line Distance 3-Dimensional. From MathWorld-A Wolfram Web Resource. http://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html
[86] Yamaguchi, F., Curves and Surfaces in Computer Aided Geometric Design, Springer-Verlag, Berlin, 1988.
[87] Arfken, G., Circular Cylindrical Coordinates, §2.4 in Mathematical Methods for Physicists, 3rd ed. Orlando, FL: Academic Press, pp. 95-101, 1985.
[88] Bíró Sándorné, Szabados Tamás: Vektoranalízis, Műszaki Könyvkiadó, Budapest, 1983
[89] Bódis Katalin: Geometriai transzformációk alkalmazása a geoinformatikában, 1999, online jegyzet
[90] H. S. M. Coxeter: A geometriák alapjai, Műszaki Könyvkiadó, Budapest, 1987
[91] Csepregi Szabolcs: Forgatás http://www.geo.info.hu/gisopen/cd_2002/dokumentum/doc_html/csepregi_sz.htm
[92] Fried Ervin: Algebra I. Elemi és lineáris algebra, Nemzeti Tankönyvkiadó, Budapest, 2000
[93] Hajnal Imre: Matematika a speciális matematika I. osztálya számára, 1994, Nemzeti Tankönyvkiadó, Budapest
[94] Hajós György: Bevezetés a geometriába, Tankönyvkiadó, Budapest, 1966
[95] Juhász Imre, Lajos Sándor: Számítógépi grafika, Miskolc, 2007, online jegyzet
[96] Juhász Imre: OpenGl, Mobidiák könyvtár, 2003, online jegyzet
[97] Kecskemétiné Pál Éva: Homogén koordináták és transzformációk http://gportal.hu/gindex.php?pg=1898479&nid=480731
[98] Kovács E., Rotation and Reflection in simple way, Annales Mathematicae et Informaticae, Volume 3X. (to appear) 2011.
[99] Krammer Gergely:Koordináta-rendszereink az euklideszi térben http://.../grafika/GrafikaKrammer41-54.pdf
[100] Reiman István: A geometria és határterületei, Gondolat, Budapest, 1986
[101] Schwarcz Tibor: Bevezetés a számítógépi grafikába, Mobidiák könyvtár, 2005, online jegyzet
[102] Székely Vladimir, Poppe András: A számítógépes grafika alapjai IBM PC-n, Computerbooks, Budapest, 1992
[103] Tevian Dray & Corinne A. Manogue, Conventions for Spherical Coordinates, http://www.physics.oregonstate.edu/bridge/papers/spherical.pdf, 2002.
[104] Tornai Róbert: Fejezetek a számítógépi grafikából, Mobidiák könyvtár, 2004, online jegyzet
[105] Alan Watt, Fabio Policarpo: 3D Games: Real-Time Rendering and Software Technology, New York : ACM Press, 2001
[106] William H., Saul A. Teukolsky, William T. Vetterling, Brian P. Flannery, Numerical Recipes: The Art of Scientific Computing, Third Edition, Cambridge University Press, 1256 pp., 2007.
[107] ábra: http://www.programmersheaven.com/articles/angelcode/worldview/images/rotate.gif
[108] ábra: http://www.programmersheaven.com/articles/angelcode/worldview/images/translate.gif
[109] ábra: http://www.programmersheaven.com/articles/angelcode/worldview/images/scale.gif