Fő tartalom
Tantárgy/kurzus: Programozás > 5. témakör
4. lecke: A vektorok- Bevezetés a vektorokba
- Feladat: Vektor bolyongó
- Még több vektor matematika
- Feladat: Fénykard
- Vektor hossza és a normalizálás
- Feladat: Vektor hosszának megjelenítése
- Vektormozgás
- Feladat: Fékező autó
- Statikus függvények vagy példány metódusok?
- Feladat: Statikus függvények
- Interaktív vektormozgás
- Feladat: Egérpiszkálás
- Projekt: Számítógépes lények
© 2024 Khan AcademyFelhasználási feltételekAdatkezelési tájékoztatóSüti figyelmeztetés
Vektor hossza és a normalizálás
Ahogy láttuk, szorzással és osztással megváltoztathatjuk a vektor hosszát anélkül, hogy annak iránya megváltozna. Eltűnődhetsz azon, hogy „OK, akkor honnan tudom, milyen hosszú egy vektor? Ismerem a vektor
x
és y
komponenseit, de milyen hosszú (hány pixel) az adott nyíl?” Nagyon hasznos és fontos tudni, hogyan kell kiszámolni a vektor hosszát (más néven magnitúdóját).Figyeld meg a fenti ábrán, hogy a vektor, amit egy nyíllal és az
x
és y
komponensekkel ábrázoltunk, egy derékszögű háromszöget alkot! A befogók a komponensek, és az átfogó maga a nyíl. Nagy szerencsénk van a derékszögű háromszöggel, mert valamikor réges-régen, egy Pitagorasz nevű görög matematikus kidolgozott egy klassz képletet, ami a derékszögű háromszög befogói és átfogója közötti kapcsolatot írja le.A pitagorasz tétel kimondja: négyzet plusz négyzet egyenlő négyzettel.
Ennek a képletnek a birtokában ki tudjuk számítani a nagyságát az alábbiak szerint:
A
PVector
objektumban ez így van megvalósítva:PVector.prototype.mag = function() {
return sqrt(this.x*this.x + this.y*this.y);
};
A következő példában a rajzvászon tetején egy vízszintes oszloppal jelenítjük meg a vektor nagyságát. (A programban található megjegyzések: 1. sor: Dan Shiffman, natureofcode.com példája alapján; 7-8. sor: Két PVector, egy az egér helyzetéhez és egy az ablak középpontjához; 11. sor: PVector kivonás! 18. sor: Megrajzoljuk a vektort megjelenítő vonalat.)
A vektor hosszának kiszámítása csak a kezdet. A hosszát visszaadó függvény (magnitude) számos új utat nyit meg előttünk, ezek közül az első a normalizálás. A normalizálás azt jelenti, hogy valamit „egységesítünk”, azaz „normalizálunk”. Vektorok esetében tételezzük most fel, hogy a normalizált vektor hossza 1. Ekkor a vektor normalizálása azt jelenti, hogy veszünk egy tetszőleges hosszúságú vektort, és az irányát változatlanul hagyva a hosszát 1-re változtatjuk, az így keletkező vektort egységvektornak hívjuk.
Mivel az egységvektor a vektor irányát annak hosszától függetlenül írja le, hasznos lesz, ha kéznél van. Majd a következő részben meglátjuk, milyen jól is fog ez jönni, amikor az erőkkel foglalkozunk.
Bármelyik vektor esetében az egységvektor (aminek a jele ) számítása:
Más szóval a vektor normalizálásához a vektor minden egyes komponensét el kell osztani annak hosszával. Ez eléggé kézenfekvő. Tegyük fel, hogy egy vektor hossza 5. Nos, 5 osztva 5-tel egyenlő 1. Ha ránézünk a derékszögű háromszögünkre, akkor az átfogót le kell csökkentenünk úgy, hogy elosztjuk 5-tel. Ezáltal a befogók is ötödükre mennek össze.
A PVector objektumban a normalizáló függvényt így írtuk meg:
PVector.prototype.normalize = function() {
var m = this.mag();
this.div(m);
};
Persze van egy kis gond. Mi van akkor, ha a vektor hossza 0? Nem oszthatunk 0-val! Egy gyors hibaellenőrzés ezt kiküszöböli:
PVector.prototype.normalize = function() {
var m = this.mag();
if (m > 0) {
this.div(m);
}
};
Az alábbi program az egérnek a középponthoz viszonyított helyzetét kifejező vektort mindig normalizálja (majd megszorozza azt, hogy látni lehessen, mert egy pixel az nagyon pici!). (A programban található megjegyzések: 1. sor: Dan Shiffman, natureofcode.com példája alapján; 6-7. sor: Két PVector, egy az egér helyzetéhez és egy az ablak középpontjához; 10. sor: PVector kivonás! 13. sor: Ebben a példában a vektor normalizálása után megszorozzuk 50-nel, hogy látszódjon a rajzvásznon. Figyeld meg, hogy bárhol is van az egér, a vektor mindig ugyanolyan hosszú (50) a normalizálásnak köszönhetően! 17. sor: Megrajzoljuk a vektort jelző vonalat).
Ez a „Természetes szimulációk" tananyag a Daniel Shiffman által készített „The Nature of Code” alapján készült, a Creative Commons Attribution-NonCommercial 3.0 Unported License szerint.
Szeretnél részt venni a beszélgetésben?
Még nincs hozzászólás.