This is an old revision of the document!
Vectorul reprezinta un instrument matematic ce descrie deplasamentul unui punct de la o pozitie initiala la o pozitie finala.
Un astfel de exemplu se poate vedea in imaginea de mai jos, unde vectorul $\vec{V_{12}}$ descrie deplasamentul de la pozitia la care se afla punctul $P_1$ la pozitia la care se afla punctul $P_2$ . Se poate observa faptul ca simbolul grafic ce descrie un element de tip vector reprezinta numele elementului, acompaniat de o sageata ce este pozitionata deasupra lui.
Un vector are asociate urmatoarele 2 proprietati:
Se defineste printr-un N-tuplu, pe baza numarului de dimensiuni ale spatiului in care este construit.
Pentru vectorul din imaginea de mai sus, descrierea este in felul urmator:
$$ \vec{V_{12}} = \begin{bmatrix} 4 & 3 \end{bmatrix} $$
Analog, pentru un vector in spatiul $\mathbb{R}^3$ , el poate fi definit in felul urmator:
$$ \vec{V_{\mathbb{R}^3}} = \begin{bmatrix} 4 & 3 & 1 \end{bmatrix} $$
In situatia in care consideram conceptul de vector in alt context decat cel de descriere a unui deplasament intre doua puncte, el se descrie vizual printr-o sageata trasata din originea axelor de coordonate, la pozitia definita de N-tuplu. Pentru aceasta reprezentare vizuala, consideram faptul ca plasam coada sagetii in originea axelor si capul la pozitie. Pentru vectorul de mai sus, reprezentarea vizuala este descrisa in imaginea de mai jos.
Un punct reprezinta un instrument matematic ce este definit doar printr-o pozitie. Vizual, putem considera ca este o forma geometrica ce este descrisa doar printr-o pozitie si are dimensiunea 0. In practica, punctul este utilizat pentru a descrie pozitii in spatiu.
Situatia face ca un punct se defineste la fel precum un vector, printr-un N-tuplu, pe baza numarului de dimensiuni ale spatiului in care este descris punctul. Este important de considerat in momentul in care se lucreaza cu puncte si vectori care este interpretarea fiecarui element. Altfel spus, este important sa stim ce element este punct si ce element este vector. In toate formulele din acest laborator, se poate observa ca vectorii sunt marcati corespunzator prin simbolul matematic specific.
$$ \vec{V_{12}} = P_2-P_1 = \begin{bmatrix} x_{P_2} - x_{P_1} & y_{P_2}-y_{P_1} \end{bmatrix} $$
Analog, vectorul in directie opusa, vizibil in imaginea de mai jos, se obtine dupa urmatoarea formula:
$$ \vec{V_{21}} = P_1-P_2 = \begin{bmatrix} x_{P_1} - x_{P_2} & y_{P_1}-y_{P_2} \end{bmatrix} $$
Analog operatiei descrise mai sus, putem considera operatia inversa, in care adunam un punct cu un vector. Rezolutatul se poate observa in imaginea de mai jos si se poate descrie cu urmatoarea formula:
$$ P_{res} = P + \vec{V} = (x_{P}+x_{\vec{V}}, y_{P}+y_{\vec{V}}) $$
Se poate observa si din formula faptul ca in urma adunarii unui punct cu un vector, se obtine un punct. Este important de mentionat faptul ca interpretarea ce ofera cele mai multe aplicabilitati este cea in care rezultatul este un punct. Schimbarea interpretarii rezultatului obtine procesul de compunere a 2 vectori, descris mai jos, dar aceasta schimbare nu este consistenta matematic, deoarece interpretarea uneia dintre elementele adunarii este un punct.
O observatie importanta este faptul ca operatia de adunare a unui punct cu un vector este comutativa. Prin interschimbarea interpretarii celor doua elemente din adunare, se obtine un punct cu aceleasi coordonate.
Procesul de compunere a 2 vectori produce un alt vector, conform formulei de mai jos:
$$ \vec{V_{res}} = \vec{V_1} + \vec{V_2} = \begin{bmatrix} x_{\vec{V_1}} + x_{\vec{V_2}} & y_{\vec{V_1}}+y_{\vec{V_2}} \end{bmatrix} $$
Compunerea se poate reprezenta grafic prin plasarea coditei sagetii celui de-al doilea vector in capatul sagetii primului vector. Prin trasarea unei sageti de la coada primului vector la capatul celui de-al doilea vector. Vectorul rezultant se afla pe directia bisectoarei unghiului dintre cei doi vectori. Acest proces se poate observa in imaginea de mai jos.
Un vector unitate este un vector ce are lungimea 1.
Un astfel de vector are aplicabilitati in programarea jocurilor video pentru realizarea animatiilor continue si in grafica pe calculator pentru simularea efectului de iluminare. Majoritatea situatiilor de utilizare necesita obtinerea unui vector unitate $\vec{V_u}$ ce are aceeasi directie cu un alt vector $\vec{V}$ dat. Pentru a obtine acest vector $\vec{V_u}$ se poate folosi formula de mai jos.
$$ \vec{V_u} = \frac{\vec{V}}{\lVert \vec{V} \rVert} = \begin{bmatrix} \frac{x_{\vec{V}}}{\lVert \vec{V} \rVert} & \frac{y_{\vec{V}}}{\lVert \vec{V} \rVert} \end{bmatrix} $$
unde $\lVert \vec{V} \rVert$ este norma sau lungimea vectorului $\vec{V}$ , ce se calculeaza dupa urmatoarea formula:
$$ \lVert \vec{V} \rVert = \sqrt{{x_{\vec{V}}}^2+{y_{\vec{V}}}^2} $$
Obtinerea vectorului $\vec{V_u}$ poarta denumirea de normalizare a vectorului $\vec{V}$ , deoarece se imparte fiecare componenta la norma sa :) .
$$ \vec{V_1}\cdot\vec{V_2} = x_{\vec{V_1}}x_{\vec{V_2}} + y_{\vec{V_1}}y_{\vec{V_2}} $$
$$ \vec{V_1}\cdot\vec{V_2} = \lVert \vec{V_1} \rVert \lVert \vec{V_2} \rVert \cos{\angle (\vec{V_1}, \vec{V_2})} $$
unde $\angle (\vec{V_1}, \vec{V_2})$ este unghiul dintre cei doi vectori.
O observatie importanta in aceasta situatie este ca prin utilizarea produsului scalar, se obtine
Imagine
Pentru calcularea ariei unui triunghi oarecare, se poate folosi formula lui Heron:
$$ A_{\Delta P_1 P_2 P_3} = \sqrt{s \cdot (s-a) \cdot (s-b) \cdot (s-c)} \\ s = \frac{1}{2} \cdot (a+b+c) \\ a=\lVert P_1-P_2 \rVert \\ b=\lVert P_1-P_3 \rVert \\ c=\lVert P_2-P_3 \rVert \\ $$
Pentru a calcula norma unui vector $\lVert\vec{V_1V_2}\rVert=\lVert V_1-V_2 \rVert$, se poate folosi biblioteca glm în felul următor:
float norm_vec12 = glm::length(v1 - v2);
Pentru a verifica dacă un punct se află în interiorul unui triunghi, se pot folosi ariile triunghiului și cele ale triunghiurilor formate de punct cu perechi de vârfuri din triunghi. În imaginea de mai jos se pot vedea aceste suprafețe.
Astfel, în situația în care suma ariilor triunghiurilor interioare este egală cu aria triunghiului, punctul se află în interior.
$$ A_{\Delta V_1 V_2 V_3} = A_{\Delta P V_1 V_3} + A_{\Delta P V_1 V_2} + A_{\Delta P V_2 V_3} $$
Deoarece ariile sunt calculate cu tipuri de date în virgulă mobilă, nu se poate folosi direct comparația de egalitate și trebuie să ne asumăm un anumit nivel de eroare în calcule. Astfel, în cod, comparația va fi în felul următor:
const float EPSILON = 5.0f; bool inside_triangle = abs(area_v1v2v3 - (area_pv1v3 + area_pv1v2 + area_pv2v3)) < EPSILON;
În framework-ul de laborator, rețeaua de triunghiuri se va descrie prin două structuri de date. Prima este mulțimea ordonată de vârfuri:
Structura de date glm::vec3
reprezintă un vector de 3 dimensiuni (x, y, z). Aceasta face parte din biblioteca glm , inclusă în framework-ul de laborator. Componentele individuale ale vectorului, x, y și z, pot fi accesate în felul următor:
glm::vec3 position = glm::vec3 (10.0f, 10.0f, 0.1f); float x = position.x; float y = position.y; float z = position.z;
In cadrul acestui laborator, sunt oferite metode specifice pentru desenarea mai multor primitive grafice. Aceste metode sunt mentionate mai jos. Consultati fisierul primitives_rendering_scene.h
pentru o descriere mai detaliata a fiecarui parametru al metodelor.
void RenderVector(const glm::vec2 &v, const glm::vec3 &color, const std::string& label = std::string (), const glm::vec2 &p = glm::vec2(0.0f)); void RenderPoint(const glm::vec2 &p, const glm::vec3 &color, const std::string &label = std::string()); void RenderArc(float start_angle, float angle, const glm::vec3 &color, float radius = 3.0f, const glm::vec2 ¢er = glm::vec2(0.0f)); void RenderTriangle(const glm::vec2 &p1, const glm::vec2 &p2, const glm::vec2 &p3, const glm::vec3 &color); void RenderText(const glm::vec2 &p, const std::string &text, float size, const glm::vec3 &color);
Completați fisierul Lab01.cpp
cu următoarele:
Exercise1()
pentru desenarea vectorului rezultant in urma compunerii vectorilor $\vec{V_1}$ si $\vec{V_2}$ . Suplimentar acestui vector, desenati vectorul $\vec{V_2}$ in continuarea lui $\vec{V_1}$ si vectorul $\vec{V_1}$ in continuarea lui $\vec{V_2}$ , conform procesului de compunere a doi vectori, descris mai sus. Utilizati metoda RenderVector(…)
pentru desenarea unui vector. Dupa rezolvarea acestei cerinte, ar trebui sa obtineti rezultatul urmator. Exercise4()
pentru desenarea arcului de cerc dintre cei doi vectori. Utilizati metoda RenderArc(…)
pentru desenarea arcului de cerc, impreuna cu produsul scalar si acos(radians)
pentru calcularea unghiului dintre cei 2 vectori. Dupa rezolvarea acestei cerinte, ar trebui sa obtineti rezultatul urmator. Exercise5()
pentru desenarea ariei fiecareia dintre cele 3 triunghiuri. Utilizati metoda RenderText(…)
pentru desenarea valorii ariei, impreuna cu formula lui Heron pentru calcularea acestei valori. Textul trebuie afisat la pozitia centrului de greutate al fiecarui triunghi. Dupa rezolvarea acestei cerinte, ar trebui sa obtineti rezultatul urmator. Exercise6()
pentru desenarea ariei fiecaruia dintre cele 3 triunghiuri. Utilizati metoda RenderText(…)
pentru desenarea valorii pentru arie, impreuna. Textul trebuie afisat la pozitia centrului de greutate a fiecarui triunghi. Dupa rezolvarea acestei cerinte, ar trebui sa obtineti rezultatul urmator.