This shows you the differences between two versions of the page.
ppbg:laboratoare:01 [2024/09/24 02:29] andrei.lambru |
ppbg:laboratoare:01 [2024/10/10 18:31] (current) andrei.lambru [Cerințe laborator] |
||
---|---|---|---|
Line 2: | Line 2: | ||
<note tip> | <note tip> | ||
- | 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 [[ ppbg:setup-framework | setup-ul framework-ului ]]. | + | 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 [[ ppbg:setup-framework | setup-ul framework-ului ]]. |
</note> | </note> | ||
Line 9: | Line 9: | ||
==== Vectorul ==== | ==== Vectorul ==== | ||
- | //**Vectorul** reprezinta un instrument matematic ce descrie deplasamentul unui punct de la o pozitie initiala la o pozitie finala.// | + | //**Vectorul** reprezintă un instrument matematic ce descrie deplasamentul unui punct de la o poziție inițială la o poziție finală.// |
- | 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 astfel de exemplu se poate vedea în imaginea de mai jos, unde vectorul $\vec{V_{12}}$ descrie deplasamentul de la poziția la care se află punctul $P_1$ , la poziția la care se află punctul $P_2$ . Se poate observa faptul că simbolul grafic ce descrie un element de tip vector reprezintă numele elementului, acompaniat de o sageată ce este poziționată deasupra lui. |
{{ :ppbg:laboratoare:vector.png?350 |}} | {{ :ppbg:laboratoare:vector.png?350 |}} | ||
- | <note tip> | + | <note> |
- | 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. | + | Termenul de //vector// provine din limba latină și se traduce în limba română prin "transportator". Interpretarea aceasta are aplicabilități în domeniul medical, unde se utilizează structura "vector de propagare". Vizual, aplicarea conceptului de vector în domeniul matematic se poate asocia cu procesul de "transportare" a unui element de la o poziție la o altă poziție într-un spațiu. |
</note> | </note> | ||
- | Un vector are asociate urmatoarele 2 proprietati: | + | Un vector are asociate următoarele 2 proprietăți: |
- | * Magnitudine, respectiv lungimea distantei vectorului | + | * Magnitudine, respectiv lungimea distanței vectorului; |
- | * Directie; acest concept se va elabora in laboratorul 3. | + | * Direcție; acest concept se va elabora în laboratorul 3. |
{{ :ppbg:laboratoare:magnitude.png?350 |}} | {{ :ppbg:laboratoare:magnitude.png?350 |}} | ||
- | Se defineste printr-un N-tuplu, pe baza numarului de dimensiuni ale spatiului in care este construit. | + | Un vector se definește printr-o mulțime ordonată de $n$ elemente, pe baza numărului de dimensiuni ale spațiului în care este construit. Pentru vectorul din imaginea de mai sus, descrierea este în felul următor: |
- | + | ||
- | Pentru vectorul din imaginea de mai sus, descrierea este in felul urmator: | + | |
$$ | $$ | ||
Line 33: | Line 31: | ||
$$ | $$ | ||
- | Analog, pentru un vector in spatiul $\mathbb{R}^3$ , el poate fi definit in felul urmator: | + | Analog, pentru un vector în spațiul $\mathbb{R}^3$ , el poate fi definit după cum urmează: |
$$ | $$ | ||
Line 40: | Line 38: | ||
- | 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. | + | În situația în care considerăm conceptul de vector în alt context decât cel de descriere a unui deplasament între două puncte, el se descrie vizual printr-o sageată trasată din originea axelor de coordonate, la poziția definită de mulțimea ordonată de $n$ elemente. Pentru această reprezentare vizuală, considerăm faptul că plasăm coada săgeții în originea axelor și capul în poziția descrisă de mulțimea ordonată. Pentru vectorul de mai sus, reprezentarea vizuală este descrisă în imaginea de mai jos. |
{{ :ppbg:laboratoare:vector-4.png?350 |}} | {{ :ppbg:laboratoare:vector-4.png?350 |}} | ||
<note important> | <note important> | ||
- | 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$. | + | Toată discuția din acest laborator, împreună cu imaginile demonstrative și aplicațiile, se rezumă la utilizarea conceptului de vector în spațiul $\mathbb{R}^2$. Cu toate acestea, este important de menționat faptul că toate conceptele prezentate sunt valabile și pentru spațiul $\mathbb{R}^3$ și pentru orice alt spațiu $\mathbb{R}^n$. Diferența dintre utilizarea unui vector în spațiul $\mathbb{R}^2$ față de un spațiu $\mathbb{R}^n$ este dată de faptul că formula comună pentru primele 2 componente ale unui vector din spațiul $\mathbb{R}^2$ se aplică pentru restul de n-2 ale spațiului $\mathbb{R}^n$. |
</note> | </note> | ||
- | === Definirea prin diferenta a 2 puncte === | + | === Definirea prin diferența 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. | + | Un **punct** reprezintă un instrument matematic ce este definit doar printr-o poziție. Vizual, putem considera că este o formă geometrică descrisă doar printr-o poziție, ce are dimensiunea 0. În practică, punctul este utilizat pentru a descrie poziții în spațiu. |
- | 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. | + | Situația face că un punct se definește la fel precum un vector, printr-o mulțime ordonată de $n$ elemente, pe baza numărului de dimensiuni ale spațiului în care este descris punctul. Este important de considerat în momentul în care se lucrează cu puncte și vectori care este interpretarea fiecărui element. Altfel spus, este important să știm ce element este punct și ce element este vector. În toate formulele din acest laborator, se poate observa că vectorii sunt marcați corespunzător prin simbolul matematic specific. |
$$ | $$ | ||
Line 58: | Line 56: | ||
$$ | $$ | ||
- | Analog, vectorul in directie opusa, vizibil in imaginea de mai jos, se obtine dupa urmatoarea formula: | + | Analog, vectorul în direcție opusă, vizibil în imaginea de mai jos, se obține după următoarea formulă: |
$$ | $$ | ||
Line 67: | Line 65: | ||
<note tip> | <note tip> | ||
- | 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. | + | În situația în care doriți să obțineți vectorul de deplasare de la punctul $P_1$ la punctul $P_2$ , în direcția spre $P_2$ , se calculează vectorul de diferență $\vec{V_{12}}=P_2-P_1$ . Cu alte cuvinte, punctul spre care doriți să obțineți vectorul rezultant este cel din care scădeți punctul de la care pleacă vectorul. |
</note> | </note> | ||
=== Adunarea unui punct cu un vector === | === 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: | + | Analog operației descrise mai sus, putem considera operația inversă, în care adunăm un punct cu un vector. Rezultatul se poate observa în imaginea de mai jos și se poate descrie cu următoarea formulă: |
$$ | $$ | ||
Line 80: | Line 78: | ||
{{ :ppbg:laboratoare:vector-3.png?350 |}} | {{ :ppbg:laboratoare:vector-3.png?350 |}} | ||
- | 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. | + | Se poate observa și din formulă faptul că în urma adunării unui punct cu un vector, se obține un punct. Este important de menționat faptul că interpretarea ce oferă cele mai multe aplicabilități este cea în care rezultatul este un punct. Schimbarea interpretării rezultatului descrie procesul de compunere a 2 vectori, prezentat mai jos, dar această schimbare nu este consistentă matematic, deoarece interpretarea unuia dintre elementele adunării 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. | + | O observație importantă este faptul că operația de adunare a unui punct cu un vector este comutativă. Prin interschimbarea interpretării celor două elemente din adunare, se obține un punct cu aceleași coordonate. |
=== Compunerea a 2 vectori === | === Compunerea a 2 vectori === | ||
Line 92: | Line 90: | ||
$$ | $$ | ||
- | 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 a 2 vectori se poate reprezenta grafic prin plasarea celui de-al doilea vector în continuarea primului. Mai exact, se poate plasa coada săgeții celui de-al doilea vector în capătul sageții primului vector. Dupa acest pas, săgeata obținută prin trasarea ei de la coada primului vector la capătul celui de-al doilea este reprezentarea vizuală a vectorului rezultant. Acesta din urmă se află pe direcția bisectoarei unghiului dintre cei doi vectori. Procesul descris se poate observa în imaginea de mai jos. |
{{ :ppbg:laboratoare:vector-5.png?750 |}} | {{ :ppbg:laboratoare:vector-5.png?750 |}} | ||
<note tip> | <note tip> | ||
- | 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. | + | Procesul de compunere de vectori are aplicabilitate în geometrie prin faptul că descrie o operație cu care se pot prelucra direcții. Un exemplu de aplicabilitate este compunerea unei direcții de deplasare a unui obiect cu o alta dată de direcția de accelerație a obiectului, ce este diferită de cea de deplasare. Prin procesul de compunere a celor două directii, se obține direcția de deplasare la cadrul curent. |
</note> | </note> | ||
=== Vectorul unitate === | === Vectorul unitate === | ||
- | //Un vector unitate este un vector ce are lungimea 1.// | + | //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. | + | Un astfel de vector are aplicabilități în programarea jocurilor video pentru realizarea animațiilor continue și în grafica pe calculator pentru simularea efectului de iluminare. Majoritatea situațiilor de utilizare necesită obținerea unui vector unitate $\vec{V_u}$ , ce are aceeași direcție cu un alt vector $\vec{V}$ dat. Pentru a obține acest vector $\vec{V_u}$ , se poate folosi formula de mai jos: |
$$ | $$ | ||
Line 110: | Line 108: | ||
$$ | $$ | ||
- | unde $\lVert \vec{V} \rVert$ este norma sau lungimea vectorului $\vec{V}$ , ce se calculeaza dupa urmatoarea formula: | + | unde $\lVert \vec{V} \rVert$ este norma sau lungimea vectorului $\vec{V}$ , ce se calculează după următoarea formulă: |
Line 117: | Line 115: | ||
$$ | $$ | ||
- | Obtinerea vectorului $\vec{V_u}$ poarta denumirea de **normalizare** a vectorului $\vec{V}$ , deoarece se imparte fiecare componenta la norma sa :) . | + | Obținerea vectorului $\vec{V_u}$ poartă denumirea de **normalizare** a vectorului $\vec{V}$ , deoarece se împarte fiecare componentă la norma lui :) . |
=== Produsul scalar a doi vectori === | === Produsul scalar a doi vectori === | ||
- | == Interpretare algebrica == | + | Această operație produce la finalul ei un scalar. Definiția algebrică a acestui produs este următoarea: |
$$ | $$ | ||
Line 127: | Line 125: | ||
$$ | $$ | ||
- | == Interpretare geometrica == | + | O interpretare importantă a produsului scalar este în context geometric. Formula de mai sus este echivalentă cu următoarea: |
$$ | $$ | ||
- | \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})} | + | \vec{V_1}\cdot\vec{V_2} = \lVert \vec{V_1} \rVert \lVert \vec{V_2} \rVert \cos{\theta} |
$$ | $$ | ||
- | unde $\angle (\vec{V_1}, \vec{V_2})$ este unghiul dintre cei doi vectori. | + | unde $\theta$ este unghiul dintre cei doi vectori, conform imaginii de mai jos. |
- | O observatie importanta in aceasta situatie este ca prin utilizarea produsului scalar, se obtine | + | {{ :ppbg:laboratoare:vector-6.png?350 |}} |
- | Imagine | + | <note> |
+ | Este important de observat faptul că în urma construcției a doi vectori, se pot forma 2 unghiuri între cei doi: | ||
+ | * $\theta_1<=180^\circ$ ; | ||
+ | * $\theta_2=360^\circ-\theta_1>=180^\circ$ . | ||
+ | Datorită construcției funcției trigonometrice cosinus, $\cos\theta_1=\cos\theta_2$ . | ||
+ | </note> | ||
+ | |||
+ | <hidden> | ||
=== ?Produsul vectorial a doi vectori - Concept 3D === | === ?Produsul vectorial a doi vectori - Concept 3D === | ||
+ | </hidden> | ||
+ | |||
+ | <note tip> | ||
+ | Pentru bibliografie suplimentară în legatură cu conceptul de vector, aplicat explicit în contextul graficii pe calculator, puteți accesa următorul articol: | ||
+ | * Goldman, Ronald. (2002). On the algebraic and geometric foundations of computer graphics. ACM Trans. Graph.. 21. 52-86. 10.1145/504789.504792. | ||
+ | </note> | ||
==== Triunghiul ==== | ==== Triunghiul ==== | ||
- | === Aria unui triunghi oarecare === | + | //**Triunghiul** este un poligon cu 3 colțuri și 3 laturi.// |
- | + | ||
- | Pentru calcularea ariei unui triunghi oarecare, se poate folosi formula lui Heron: | + | |
+ | === Aria unui triunghi oarecare === | ||
+ | Pentru calcularea ariei unui triunghi oarecare, se poate folosi formula lui Heron, ce utilizează semiperimetrul triunghiului: | ||
$$ | $$ | ||
Line 161: | Line 172: | ||
$$ | $$ | ||
- | 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: | + | unde $P_1$ , $P_2$ si $P_3$ sunt punctele de la colțurile triunghiului, conform imaginii de mai jos: |
- | <code cpp> | + | {{ :ppbg:laboratoare:triangle.png?350 |}} |
- | float norm_vec12 = glm::length(v1 - v2); | + | |
- | </code> | + | |
Line 176: | Line 185: | ||
$$ | $$ | ||
- | 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} | + | A_{\Delta P_1 P_2 P_3} = A_{\Delta P P_1 P_3} + A_{\Delta P P_1 P_2} + A_{\Delta P P_2 P_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: | + | |
+ | unde $P$ este punctul pentru care se verifica faptul că se află în triunghi. Un exemplu de configurație pentru $P$ se poate vedea în imaginea de mai jos. | ||
+ | |||
+ | {{ :ppbg:laboratoare:point-triangle.png?350 |}} | ||
+ | |||
+ | ===== Laborator ===== | ||
+ | ==== Biblioteca glm ==== | ||
+ | |||
+ | În framework-ul de laborator, se utilizează biblioteca [[ https://glm.g-truc.net/0.9.9/ | glm ]], ce pune la dispoziție structuri de date pentru puncte și vectori, împreună cu operațiile uzuale de lucru cu aceste elemente. | ||
+ | |||
+ | Definirea unui obiect de tip vector în spațiul $\mathbb{R}^2$ se realizează după cum urmează: | ||
<code cpp> | <code cpp> | ||
- | const float EPSILON = 5.0f; | + | glm::vec2 v = glm::vec2(4.0f, 3.0f); |
+ | </code> | ||
- | bool inside_triangle = abs(area_v1v2v3 - (area_pv1v3 + area_pv1v2 + area_pv2v3)) < EPSILON; | + | Accesarea componentelor individuale ale unui vector se realizează: |
+ | |||
+ | <code cpp> | ||
+ | float x = v.x; | ||
+ | float y = v.y; | ||
</code> | </code> | ||
+ | Obținerea unui vector prin diferența a două puncte: | ||
- | ===== Laborator ===== | + | <code cpp> |
+ | glm::vec2 p1 = glm::vec2(2, 2); | ||
+ | glm::vec2 p2 = glm::vec2(6, 5); | ||
+ | glm::vec2 v12 = p2 - p1; | ||
+ | </code> | ||
- | ==== Biblioteca glm ==== | + | Compunerea a 2 vectori: |
- | Î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: | + | <code cpp> |
+ | glm::vec2 v1 = glm::vec2(3.0f, 1.0f); | ||
+ | glm::vec2 v2 = glm::vec2(2.0f, 3.0f); | ||
+ | |||
+ | glm::vec2 v_res = v1 + v2; | ||
+ | </code> | ||
- | Structura de date ''glm::vec3'' reprezintă un vector de 3 dimensiuni (x, y, z). Aceasta face parte din biblioteca [[ https://glm.g-truc.net/0.9.9/ | glm ]], inclusă în framework-ul de laborator. Componentele individuale ale vectorului, x, y și z, pot fi accesate în felul următor: | + | Obținerea magnitudinii unui vector: |
<code cpp> | <code cpp> | ||
- | glm::vec3 position = glm::vec3 (10.0f, 10.0f, 0.1f); | + | glm::vec2 v = glm::vec2(4.0f, 3.0f); |
- | float x = position.x; | + | float norm = glm::length(v); |
- | float y = position.y; | + | </code> |
- | float z = position.z; | + | |
+ | Obținerea unui vector unitate pe direcția unui alt vector dat: | ||
+ | |||
+ | <code cpp> | ||
+ | glm::vec2 v = glm::vec2(4.0f, 3.0f); | ||
+ | |||
+ | glm::vec2 vu = glm::normalize(v); | ||
+ | </code> | ||
+ | |||
+ | Produsul scalar a doi vectori: | ||
+ | |||
+ | <code cpp> | ||
+ | glm::vec2 v1 = glm::vec2(2, 2); | ||
+ | glm::vec2 v2 = glm::vec2(6, 5); | ||
+ | |||
+ | float res = glm::dot(v1, v2); | ||
</code> | </code> | ||
==== Descrierea culorilor ==== | ==== Descrierea culorilor ==== | ||
+ | |||
+ | Conceptul de culoare este unul complex, care ar putea necesita conținutul unui curs în sine. În domeniul graficii pe calculator, se utilizează modele matematice, denumite //modele de culoare// pentru a prelucra o astfel de informație. În practică, API-urile grafice, precum și API-ul OpenGL, pe care îl utilizăm în cadrul framework-ului, utilizează modelul de culoare RGB, la care ne vom rezuma și noi până la finalul semestrului. | ||
+ | |||
+ | Modelul de culoare RGB descrie culorile prin descompunerea lor în 3 culori primare, respectiv: roșu, verde și albastru. Acronimul "RGB" provine de la numele lor în limba engleză: "**R**ed", "**G**reen" și "**B**lue". | ||
+ | |||
+ | În cadrul laboratorului, se poate utiliza o structură de tip ''glm::vec3'', ce conține 3 componente, analog structurii ''glm::vec2'', la care se mai adaugă componenta ''z''. Se utilizează această structură de date doar pentru a stoca un triplet de valori ce este interpretat sub formă de culoare în modelul RGB. API-ul grafic OpenGL interpretează valoarea fiecărei componente a tripletului între limitele 0 și 1. Mai jos sunt descrise cateva culori de baza formate din valorile tripletelor. | ||
+ | |||
+ | <code cpp> | ||
+ | glm::vec3 red_color = glm::vec3(1, 0, 0); | ||
+ | glm::vec3 green_color = glm::vec3(0, 1, 0); | ||
+ | glm::vec3 blue_color = glm::vec3(0, 0, 1); | ||
+ | |||
+ | glm::vec3 yellow_color = glm::vec3(1, 1, 0); | ||
+ | glm::vec3 cyan_color = glm::vec3(0, 1, 1); | ||
+ | </code> | ||
+ | |||
+ | <note tip> | ||
+ | Aprofundarea modelelor de culoare depășește conținutul acestui curs. Pentru a obține mai multe informatii despre acest subiect, puteți consulta următoarele cărți: | ||
+ | * Levkowitz, Haim, ed. Color theory and modeling for computer graphics, visualization, and multimedia applications. Boston, MA: Springer US, 1997. | ||
+ | * Fairchild, Mark D. Color appearance models. John Wiley & Sons, 2013. | ||
+ | </note> | ||
==== Metode utilitare ==== | ==== 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. | + | În cadrul acestui laborator, sunt oferite metode specifice pentru desenarea mai multor tipuri de primitive grafice. Semnăturile acestor metode sunt scrise mai jos. Consultați fișierul ''primitives_rendering_scene.h'' pentru o descriere mai detaliată a fiecărui parametru al metodelor. |
<code cpp> | <code cpp> | ||
- | void RenderVector(const glm::vec2 &v, const glm::vec3 &color, | + | void RenderVector(const glm::vec2 &v, const glm::vec3 &color, const std::string& label = std::string (), const glm::vec2 &p = glm::vec2(0.0f)); |
- | const std::string& label = std::string (), | + | void RenderPoint(const glm::vec2 &p, const glm::vec3 &color, const std::string &label = std::string()); |
- | const glm::vec2 &p = glm::vec2(0.0f)); | + | void RenderArc(float start_angle, float angle, const glm::vec3 &color, float radius = 3.0f, const glm::vec2 ¢er = glm::vec2(0.0f)); |
- | void RenderPoint(const glm::vec2 &p, const glm::vec3 &color, | + | void RenderTriangle(const glm::vec2 &p1, const glm::vec2 &p2, const glm::vec2 &p3, const glm::vec3 &color); |
- | const std::string &label = std::string()); | + | void RenderText(const glm::vec2 &p, const std::string &text, float size, const glm::vec3 &color); |
- | 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); | + | |
</code> | </code> | ||
==== Cerințe laborator ==== | ==== Cerințe laborator ==== | ||
- | <note tip> | + | <note important> |
- | 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. | + | În cadrul acestui laborator, veți avea de rezolvat 6 cerințe distincte. Pentru a schimba între panourile specifice cerințelor, apăsați tastele **1**, **2**, **3**, **4**, **5** și **6** de la tastatură. |
</note> | </note> | ||
- | Completați fisierul ''Lab01.cpp'' cu următoarele: | + | Completați fisierul ''lab01.cpp'' cu următoarele: |
- | - 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. {{ :ppbg:laboratoare:vectors-task-1.png?600 |}} | + | - 0.05p - Completați metoda ''Exercise1()'' astfel: |
- | - 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. {{ :ppbg:laboratoare:vectors-task-2.png?600 |}} | + | - Desenați vectorui rezultant în urma compunerii vectorilor $\vec{V_1}$ și $\vec{V_2}$ . |
- | - 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. {{ :ppbg:laboratoare:vectors-task-3.png?600 |}} | + | - Desenați vectorul $\vec{V_2}$ în continuarea lui $\vec{V_1}$ și vectorul $\vec{V_1}$ în continuarea lui $\vec{V_2}$ , conform procesului de compunere a doi vectori, descris mai sus. \\ Utilizați metoda ''RenderVector(...)'' pentru desenarea unui vector. După rezolvarea acestei cerințe, ar trebui să obțineți rezultatul următor: {{ :ppbg:laboratoare:vectors-task-1.png?600 |}} |
- | - 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. {{ :ppbg:laboratoare:vectors-task-4.png?600 |}} | + | - 0.05p - Completați metoda ''Exercise2()'' pentru desenarea următorilor vectori rezultanți în urma diferenței dintre două puncte: $\{\vec{V_{21}}, \vec{V_{43}}, \vec{V_{56}}, \vec{V_{87}}\}$ . \\ După rezolvarea acestei cerințe, ar trebui să obțineti rezultatul următor: {{ :ppbg:laboratoare:vectors-task-2.png?600 |}} |
- | - 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. {{ :ppbg:laboratoare:vectors-task-5.png?600 |}} | + | - 0.05p - Completati metoda ''Exercise3()'' astfel: |
- | - 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:vectors-task-5.png?600 |}} | + | - Desenați vectorii unitate aflați pe direcția celor 5 vectori prezenți în cadrul cerinței. |
+ | - Nu utilizați etichete pentru desenarea vectorilor unitate. \\ După rezolvare, ar trebui să obțineți rezultatul următor: {{ :ppbg:laboratoare:vectors-task-3.png?600 |}} | ||
+ | - 0.05p - Completați metoda ''Exercise4()'' pentru desenarea arcului de cerc dintre cei doi vectori. \\ Utilizați metoda ''RenderArc(...)'' pentru desenarea arcului de cerc, împreună cu produsul scalar și ''acos(radians)'' pentru calcularea unghiului dintre cei 2 vectori. După rezolvarea acestei cerințe, ar trebui să obțineți rezultatul următor: {{ :ppbg:laboratoare:vectors-task-4.png?600 |}} | ||
+ | - 0.05p - Completați metoda ''Exercise5()'' pentru desenarea valorii ariei fiecăruia dintre cele 3 triunghiuri. Textul trebuie afișat la poziția centrului de greutate al fiecărui triunghi. \\ Utilizați formula lui Heron pentru calcularea ariei. Folosiți metoda ''RenderText(...)'' pentru desenarea valorii ariei. După rezolvarea acestei cerințe, ar trebui să obțineți rezultatul următor: {{ :ppbg:laboratoare:vectors-task-5.png?600 |}} | ||
+ | - 0.05p - Completați metoda ''Exercise6()'' pentru desenarea punctelor din listă după următoarea regulă: | ||
+ | - Punctele ce se află în interiorul triunghiului se desenează în culoarea verde; | ||
+ | - Punctele ce se află în afara triunghiului se desenează în culoarea roșie. \\ 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: <code cpp> | ||
+ | const float EPSILON = 0.01f; | ||
+ | |||
+ | bool inside_triangle = abs(area_v1v2v3 - (area_pv1v3 + area_pv1v2 + area_pv2v3)) < EPSILON; | ||
+ | </code> \\ După rezolvarea acestei cerințe, ar trebui să obțineți rezultatul următor: {{ :ppbg:laboratoare:vectors-task-6.png?600 |}} | ||
- | <hidden> | ||
Bonus: | Bonus: | ||
- | - In cadrul exercitiului 4, desenati cu o culoare diferita arcul de cerc pentru unghiul mare dintre cei doi vectori. | + | În cadrul exercițiului 4, desenați cu o culoare diferită arcul de cerc pentru unghiul mare dintre cei doi vectori. După rezolvarea acestei cerințe, ar trebui să obțineți rezultatul următor: {{ :ppbg:laboratoare:vectors-task-bonus.png?600 |}} |
- | </hidden> | + | |