Preskoči na glavni sadržaj

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 (x,y)(x,y), 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 v1v2=v1v2cosθ\overrightarrow{v_1} \cdot \overrightarrow{v_2} =|\overrightarrow{v_1}| |\overrightarrow{v_2}| \cos{\theta}, gdje je θ\theta mjera kuta između njih. Algebarski, on je zbroj umnožaka odgovarajućih koordinata. Uz zapis v1=(x1,y1)\overrightarrow{v_1} = (x_1, y_1) i v2=(x2,y2)\overrightarrow{v_2} = (x_2, y_2), iznosi v1v2=x1x2+y1y2\overrightarrow{v_1} \cdot \overrightarrow{v_2} = x_1 x_2 + y_1 y_2 (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 v1\overrightarrow{v_1} i v2\overrightarrow{v_2} novi je vektor koji je po smjeru okomit na oba faktora, a po iznosu površina paralelograma kojeg v1\overrightarrow{v_1} i v2\overrightarrow{v_2} razapinju (v1v2sinθ|\overrightarrow{v_1}| |\overrightarrow{v_2}| \sin{\theta}). Algebarski se može dobiti kao sljedeća determinanta:

v1×v2=e1e2e3x1y1z1x2y2z2\overrightarrow{v_1} \times \overrightarrow{v_2} = \begin{vmatrix} \overrightarrow{e_1} & \overrightarrow{e_2} & \overrightarrow{e_3} \\ x_1 & y_1 & z_1 \\ x_2 & y_2 & z_2 \end{vmatrix}

gdje je e1=(1,0,0)\overrightarrow{e_1} = (1,0,0), e2=(0,1,0)\overrightarrow{e_2} = (0,1,0) a e3=(0,0,1)\overrightarrow{e_3} = (0,0,1). Raspisan izgleda ovako:

v1×v2=(y1z2z1y2)e1+(z1x2x1z2)e2+(x1y2y1x2)e3\overrightarrow{v_1} \times \overrightarrow{v_2} = (y_1 z_2 -z_1 y_2) \overrightarrow{e_1} +(z_1 x_2 − x_1 z_2) \overrightarrow{e_2} + (x_1 y_2 − y_1 x_2) \overrightarrow{e_3}.

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 a\overrightarrow{a}, b\overrightarrow{b} i c\overrightarrow{c}, volumen možemo dobiti kao a(b×c)|\overrightarrow{a} \cdot \left( \overrightarrow{b} \times \overrightarrow{c} \right) |.

Pseudoskalarni produkt

Nešto slično vektorskom produktu možemo implementirati i u 2D ravnini: površinu paralelograma kojeg razapinju a\overrightarrow{a} i b\overrightarrow{b} možemo dobiti kao e3(a×b)=x1y2y1x2|\overrightarrow{e_3} \cdot \left( \overrightarrow{a} \times \overrightarrow{b} \right) | = |x_1 y_2−y_1 x_2|. 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 a\overrightarrow{a} i b\overrightarrow{b} 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 (P1P_1 na jednom kraku, vrh P2P_2, P3P_3 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;
}