Szerzői jog © 2011 Hallgatói Információs Központ
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.
Nemzeti Fejlesztési Ügynökség http://ujszechenyiterv.gov.hu/ 06 40 638-638
2011
Tartalom
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.
Tartalom
[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.
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.
[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.
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:
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:
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.
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:
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
.
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:
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.
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.
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:
[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.
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 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.
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:
[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:
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:
Tartalom
[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.
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.
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.
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.
Az
és
mátrix összeadása akkor végezhető el, ha alakjuk megegyezik, azaz
mindkettő m
n-es. Ennek megfelelően az eredménymátrix alakja is m
n-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.
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.
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)
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.
Tartalom
[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.
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.
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.
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).
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:
.
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.
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ű).
[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.
[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.
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.
[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.
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:
[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.
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).
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.
Tartalom
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.
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).
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ő.
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.
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.
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.
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 ):
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.
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:
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:
,
,
.
Tartalom
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]).
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.
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.
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.
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:
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.
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.
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.
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.
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:
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:
Megállapítható, hogy minden nem szinguláris 4
4-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 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:
Ennek megfelelően a transzformációs mátrixot a következőképpen kaphatjuk meg:
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:
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.
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:
Eltoljuk a
tengelypontot az origóba.
Végrehajtjuk a
megfelelő forgatásokat, úgy hogy a transzfomációk eredményeképpen forgástengely
a
koordinátatengelyre illeszkedik.
Elvégezzük a
szöggel való forgatást a
tengely körül.
Végrehajtjuk a 2. lépésben kivitelezett forgatások inverzét.
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:
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).
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.
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.
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:
Eltoljuk el a tükrözési síkot egy
pontjának
segítségével az origóba.
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.
Az
koordinátasíkra a tükrözést végzünk el.
Végrehajtjuk a 2. lépésben kivitelezett forgatások inverzét.
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.
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
:
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.
Á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.
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.
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:
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.
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.
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.
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.
Tartalom
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.
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.
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.
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
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.
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.
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 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.
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.
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.
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.
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.
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.
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!
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.
Zárt görbe estén az érintő a kezdő és a végpontban is az
általános képlettel határozható meg.
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.
Tartalom
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.
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
![]()
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
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.
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:
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.
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.
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.
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.
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.
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.)
A Bernstein polinomokat a következő binomiális formulából származtathatjuk
A
polinomokat
-edfokú Bernstein poilomoknak nevezzük.
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.
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.
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
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.
Tartalom
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.
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.
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.
Megoldhatjuk a problémát síkbeli – 3x3-as – transzformációs mátrixok szorzásával is.
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.
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;
}
| [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 |