Osnove geometrije
Implementacija točke
Točku u 2D možemo implementirati kao strukturu koja pamti koordinate, tako da tip_podatka zamijenimo odgovarajućim tipom, najčešće int, long long ili double. Svaki isječak koda koji slijedi možemo prilagoditi i za 3D slučaj.
struct tocka {
tip_podatka x, y;
};
Možemo je doživljavati kao uređeni par koordinata, ali i kao vektor s početkom u ishodištu i krajem u , pa pojmove vektora i točke možemo poistovjećivati. Sljedeći operatori, na primjer, baziraju se na vizualizaciji točke kao vektora:
struct tocka {
tip_podatka x, y;
tocka& operator+=(const tocka &t) {
x += t.x;
y += t.y;
return *this;
}
tocka operator+(const tocka &t) const {
tocka rez = *this;
rez += t;
return rez;
}
tocka& operator*=(tip_podatka t) {
x *= t;
y *= t;
return *this;
}
tocka operator*(tip_podatka t) const {
tocka rez = *this;
rez *= t;
return rez;
}
/* slično za oduzimanje i dijeljenje */
};
tocka operator*(tip_podatka a, tocka b) {
return b * a;
}
Skalarni produkt
Skalarni produkt dvaju vektora može se definirati na dva ekvivalentna načina. Geometrijski, on je duljina projekcije jednog vektora na drugi, pa iznosi , gdje je mjera kuta između njih. Algebarski, on je zbroj umnožaka odgovarajućih koordinata. Uz zapis i , iznosi (s dodatnom z-koordinatom u 3D slučaju).
tip_podatka skalarni_produkt(tocka a, tocka b) {
return a.x * b.x + a.y * b.y;
}
Vektorski produkt
Vektorski produkt definiramo samo za 3D vektore, i također ima više interpretacija. Geometrijski, vektorski produkt vektora i novi je vektor koji je po smjeru okomit na oba faktora, a po iznosu površina paralelograma kojeg i razapinju (). Algebarski se može dobiti kao sljedeća determinanta:
gdje je , a . Raspisan izgleda ovako:
.
struct tocka {
tip_podatka x, y, z;
}
tocka vektorski_produkt(tocka a, tocka b) {
tocka rez;
rez.x = a.y * b.z - a.z * b.y;
rez.y = a.z * b.x - a.x * b.z;
rez.z = a.x * b.y - a.y * b.x;
return rez;
}
Zanimljiva primjena vektorskog produkta je u računanju volumena paralelepipeda. Ako su njegove stranice vektori , i , volumen možemo dobiti kao .
Pseudoskalarni produkt
Nešto slično vektorskom produktu možemo implementirati i u 2D ravnini: površinu paralelograma kojeg razapinju i možemo dobiti kao . Tako i definiramo pseudoskalarni produkt:
tip_podatka pseudoskalarni(tocka a, tocka b) {
return a.x * b.y - a.y * b.x;
}
Orijentacija kuta
Bitna primjena ovog produkta je u računanju orijentacije kuta između dvaju vektora. Može se pokazati da, ako kut između i opisujemo u smjeru kazaljke na satu (clockwise), njihov pseudoskalarni produkt bit će negativan, a inače (u counterclockwise smjeru) pozitivan. Kut može biti zadan i točkama; ako su dane tri točke koje određuju kut ( na jednom kraku, vrh , na drugom kraku), orijentaciju kuta možemo provjeriti sljedećim funkcijama:
bool clockwise(tocka p1, tocka p2, tocka p3) {
return pseudoskalarni(p1 - p2, p3 - p2) < 0;
}
bool counterclockwise(tocka p1, tocka p2, tocka p3) {
return pseudoskalarni(p1 - p2, p3 - p2) > 0;
}