This is an old revision of the document!


Laboratorul 01

Bun venit la prima activitate practică a acestei materii. În fiecare săptămână, până la finalul semestrului, vom folosi un framework adaptat special pentru aceste activități practice. Framwork-ul este scris în limbajul C++ și folosește API-ul grafic OpenGL. Primul pas al acestui laborator este să realizați setup-ul framework-ului .

Elemene de geometrie

Vectorul

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.

Termenul de vector provine din limba latina si se traduce in limba romana prin “transportator”. Intelegerea aceasta a termenului are aplicabilitati in domeniul medical unde se utilizeaza structura “vector de propagare”. Vizual, aplicarea conceptului de vector in domeniul matematic se poate asocia cu procesul de “transportare” a un element de la o pozitie la o alta pozitie in spatiu.

Un vector are asociate urmatoarele 2 proprietati:

  • Magnitudine, respectiv lungimea distantei vectorului
  • Directie; acest concept se va elabora in laboratorul 3.

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.

Toata discutia din acest laborator, impreuna cu imaginile demonstrative si aplicatiile, se rezuma la utilizarea conceptului de vector in spatiul $\mathbb{R}^2$. Cu toate acestea, este important de mentionat faptul ca toate conceptele prezentate sunt valabile si pentru spatiul $\mathbb{R}^3$ si pentru orice alt spatiu $\mathbb{R}^n$. Diferenta dintre utilizarea unui vector in spatiul $\mathbb{R}^2$ fata de un spatiu $\mathbb{R}^n$ este data de faptul ca formula comuna pentru primele 2 componente ale unui vector din spatiul $\mathbb{R}^2$ se aplica pentru restul de n-2 a spatiului $\mathbb{R}^n$.

Definirea prin diferenta a 2 puncte

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} $$

In situatia in care doriti se obtineti vectorul de deplasare de la punctul $P_1$ la punctul $P_2$ , in directia spre $P_2$ , se calculeaza vectorul de diferenta $\vec{V_{12}}=P_2-P_1$ . Cu alte cuvinte, punctul spre care doriti sa obtineti vectorul rezultant este cel din care scadeti punctul de la care pleaca vectorul.

Adunarea unui punct cu un vector

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.

Compunerea a 2 vectori

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.

Procesul de compunere de vectori are aplicabilitate in geometrie prin faptul ca ne ofera o operatie cu care se pot prelucra vectori. Un exemplu de aplicabilitate este compunerea a doua directii, una data de cea de deplasare a unui obiect si o alta data de directia de acceleratie a lui, ce este diferite de cea de deplasare. Prin procesul de compunere a celor doua directii, se obtine directia la un cadru ulterior.

Vectorul unitate

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 :) .

Produsul scalar a doi vectori

Interpretare algebrica

$$ \vec{V_1}\cdot\vec{V_2} = x_{\vec{V_1}}x_{\vec{V_2}} + y_{\vec{V_1}}y_{\vec{V_2}} $$

Interpretare geometrica

$$ \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

?Produsul vectorial a doi vectori - Concept 3D

Triunghiul

Aria unui triunghi oarecare

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);

Punct în interiorul unui triunghi

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;

Laborator

Biblioteca glm

Î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;

Descrierea culorilor

Metode utilitare

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 &center = 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);

Cerințe laborator

In cadrul acestui laborator, veti avea de rezolvat 6 cerinte distincte. Pentru a schimba intre panourile specifice cerintelor, apasati tastele 1, 2, 3, 4, 5 si 6 de la tastatura.

Completați fisierul Lab01.cpp cu următoarele:

  1. 0.05p - Completati metoda 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.
  2. 0.05p - Completati metoda Exercise2() pentru desenarea urmatorilor vectori rezultanti in urma diferentei dintre doua puncte: $\{\vec{V_{21}}, \vec{V_{43}}, \vec{V_{56}}, \vec{V_{87}}\}$ . Dupa rezolvarea acestei cerinte, ar trebui sa obtineti rezultatul urmator.
  3. 0.05p - Completati metoda Exercise3() pentru desenarea vectorilor unitate aflati pe directia celor 5 vectori prezenti in cadrul cerintei. Nu utilizati etichete pentru desenarea vectorilor unitate. Dupa rezolvare, ar trebui sa obtineti rezultatul urmator.
  4. 0.05p - Completati metoda 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.
  5. 0.05p - Completati metoda 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.
  6. 0.05p - Completati metoda 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.
ppbg/laboratoare/01.1727134144.txt.gz · Last modified: 2024/09/24 02:29 by andrei.lambru
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0