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:
Un vector se defineste printr-o multime ordonata de n elemente, 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 dupa cum urmeaza:
$$ \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 multimea ordonata de n elemente. Pentru aceasta reprezentare vizuala, consideram faptul ca plasam coada sagetii in originea axelor si capul in pozitia descrisa de multimea ordonata. 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-o multime ordonata de n elemente, 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 descrie procesul de compunere a 2 vectori, prezentat mai jos, dar aceasta schimbare nu este consistenta matematic, deoarece interpretarea unuia 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 :) .
Aceasta operatie produce la finalul ei un scalar. Definitia algebrica a acestui produs este urmatoarea:
$$ \vec{V_1}\cdot\vec{V_2} = x_{\vec{V_1}}x_{\vec{V_2}} + y_{\vec{V_1}}y_{\vec{V_2}} $$
O interpretare importanta a produsului scalar este in context geometric. Formula de mai sus este echivalenta cu urmatoarea:
$$ \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.
Datorita constructiei funcției trigonometrice cosinus, $\cos\theta_1=\cos\theta_2$ .
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 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, se utilizeaza biblioteca glm , ce pune la dispozitie structuri de date pentru puncte si vectori si operatii specifice de lucru cu aceste elemente.
Definirea unui obiect de tip vector in spatiul $\mathbb{R}^2$ se realizeaza dupa cum urmeaza:
glm::vec2 v = glm::vec2(4.0f, 3.0f);
Accesarea componentelor individuale ale unui vector se realizeaza:
float x = position.x; float y = position.y;
Obtinerea unui vector prin diferenta a doua puncte:
glm::vec2 p1 = glm::vec2(2, 2); glm::vec2 p2 = glm::vec2(6, 5); glm::vec2 v12 = p2 - p1;
Compunerea a 2 vectori:
glm::vec2 v1 = glm::vec2(3.0f, 1.0f); glm::vec2 v2 = glm::vec2(2.0f, 3.0f); glm::vec2 v_res = v1 + v2;
Obtinerea magnitudinii unui vector:
glm::vec2 v = glm::vec2(4.0f, 3.0f); float magnitude = glm::length(v);
Obtinerea unui vector unitate pe directia unui alt vector dat:
glm::vec2 v = glm::vec2(4.0f, 3.0f); glm::vec2 vu = glm::normalize(v);
Produsul scalar a doi vectori:
glm::vec2 v1 = glm::vec2(2, 2); glm::vec2 v2 = glm::vec2(6, 5); float res = glm::dot(v1, v2);
TBA
In cadrul acestui laborator, sunt oferite metode specifice pentru desenarea mai multor tipuri de primitive grafice. Semnaturile acestor metode sunt scrise 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()
astfel: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.RenderText(…)
pentru desenarea valorii ariei.Exercise6()
pentru desenarea punctelor din lista dupa urmatoarea regula: