Differences

This shows you the differences between two versions of the page.

Link to this comparison view

ppbg:laboratoare:01 [2024/09/24 13:42]
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>​ <​note>​
-Termenul de //vector// provine din limba latina si se traduce ​in limba romana ​prin "​transportator"​. ​Intelegerea ​aceasta 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 unui 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 ​proprietati+Un vector are asociate ​următoarele ​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 |}}
  
-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:+Un vector se definește ​printr-o ​mulțime ordonată ​de    $nelemente, 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:
  
 $$ $$
Line 31: Line 31:
 $$ $$
  
-Analog, pentru un vector ​in spatiul ​  $\mathbb{R}^3$ , el poate fi definit ​dupa cum urmeaza:+Analog, pentru un vector ​în spațiul ​  $\mathbb{R}^3$ , el poate fi definit ​după cum urmează:
  
 $$ $$
Line 38: 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 multimea ordonata ​de n elemente. Pentru ​aceasta ​reprezentare ​vizualaconsideram ​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.+Î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    $nelemente. 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-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. ​+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 56: 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 65: 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 inversain 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 78: 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 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.+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.
  
-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.+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 90: 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 ​vectorVectorul 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 rezultantAcesta 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 se descrie 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 ​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 ​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>​
  
Line 102: Line 102:
 //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 108: 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 115: 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 ===
  
-Aceasta operatie ​produce la finalul ei un scalar. ​Definitia algebrica ​a acestui produs este urmatoarea:+Această operație ​produce la finalul ei un scalar. ​Definiția algebrică ​a acestui produs este următoarea:
  
 $$ $$
Line 125: Line 125:
 $$ $$
  
-O interpretare ​importanta ​a produsului scalar este in context geometric. Formula de mai sus este echivalenta ​cu urmatoarea:+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.
  
 {{ :​ppbg:​laboratoare:​vector-6.png?​350 |}} {{ :​ppbg:​laboratoare:​vector-6.png?​350 |}}
  
 <​note>​ <​note>​
-Este important de observat faptul ​ca in urma constructiei ​a doi vectori, se pot forma 2 unghiuri ​intre cei doi:+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_1<​=180^\circ$ ​ ;
   *    $\theta_2=360^\circ-\theta_1>​=180^\circ$ ​ .   *    $\theta_2=360^\circ-\theta_1>​=180^\circ$ ​ .
  
-Datorita constructiei ​funcției trigonometrice cosinus, ​  ​$\cos\theta_1=\cos\theta_2$ ​ .+Datorită construcției ​funcției trigonometrice cosinus, ​  ​$\cos\theta_1=\cos\theta_2$ ​ .
 </​note>​ </​note>​
  
Line 149: Line 149:
  
 <note tip> <note tip>
-Pentru bibliografie ​suplimentara in legatura ​cu conceptul de vector, aplicat explicit ​in contextul graficii pe calculator, ​puteti ​accesa ​urmatorul ​articol:+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. ​   * Goldman, Ronald. (2002). On the algebraic and geometric foundations of computer graphics. ACM Trans. Graph.. 21. 52-86. 10.1145/​504789.504792. ​
 </​note>​ </​note>​
- 
  
 ==== Triunghiul ==== ==== Triunghiul ====
 +
 +//​**Triunghiul** este un poligon cu 3 colțuri și 3 laturi.// ​
  
 === Aria unui triunghi oarecare === === Aria unui triunghi oarecare ===
  
-Pentru calcularea ariei unui triunghi oarecare, se poate folosi formula lui Heron: +Pentru calcularea ariei unui triunghi oarecare, se poate folosi formula lui Heron, ce utilizează semiperimetrul triunghiului:
- +
  
 $$ $$
Line 172: Line 171:
 c=\lVert P_2-P_3 \rVert \\ c=\lVert P_2-P_3 \rVert \\
 $$ $$
 +
 +unde    $P_1$  ,    $P_2$ si    $P_3$   sunt punctele de la colțurile triunghiului,​ conform imaginii de mai jos:
 +
 +{{ :​ppbg:​laboratoare:​triangle.png?​350 |}}
 +
  
 === Punct în interiorul unui triunghi === === Punct în interiorul unui triunghi ===
Line 181: 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: 
  
-<code cpp> +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.
-const float EPSILON = 5.0f; +
- +
-bool inside_triangle = abs(area_v1v2v3 - (area_pv1v3 + area_pv1v2 + area_pv2v3)) < EPSILON; +
-</​code>​+
  
 +{{ :​ppbg:​laboratoare:​point-triangle.png?​350 |}}
  
 ===== Laborator ===== ===== Laborator =====
- 
- 
 ==== Biblioteca glm ==== ==== Biblioteca glm ====
  
-În framework-ul de laborator, se utilizeaza ​biblioteca [[ https://​glm.g-truc.net/​0.9.9/​ | glm ]], ce pune la dispozitie ​structuri de date pentru puncte ​si vectori ​si operatii specifice ​de lucru cu aceste elemente.+Î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 ​in spatiul ​  $\mathbb{R}^2$ se realizeaza dupa cum urmeaza:+Definirea unui obiect de tip vector ​în spațiul ​  $\mathbb{R}^2$ se realizează după cum urmează:
  
 <code cpp> <code cpp>
Line 206: Line 204:
 </​code>​ </​code>​
  
-Accesarea componentelor individuale ale unui vector se realizeaza:+Accesarea componentelor individuale ale unui vector se realizează:
  
 <code cpp> <code cpp>
-float x = position.x; +float x = v.x; 
-float y = position.y;+float y = v.y;
 </​code>​ </​code>​
  
-Obtinerea ​unui vector prin diferenta ​doua puncte:+Obținerea ​unui vector prin diferența două puncte:
  
 <code cpp> <code cpp>
Line 231: Line 229:
 </​code>​ </​code>​
  
-Obtinerea ​magnitudinii unui vector:+Obținerea ​magnitudinii unui vector:
  
 <code cpp> <code cpp>
 glm::vec2 v = glm::​vec2(4.0f,​ 3.0f); glm::vec2 v = glm::​vec2(4.0f,​ 3.0f);
  
-float magnitude ​= glm::​length(v);​+float norm = glm::​length(v);​
 </​code>​ </​code>​
  
-Obtinerea ​unui vector unitate pe directia ​unui alt vector dat:+Obținerea ​unui vector unitate pe direcția ​unui alt vector dat:
  
 <code cpp> <code cpp>
Line 258: Line 256:
 ==== Descrierea culorilor ==== ==== Descrierea culorilor ====
  
-TBA+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 tipuri de primitive grafice. ​Semnaturile ​acestor metode sunt scrise mai jos. Consultati fisierul ​''​primitives_rendering_scene.h''​ pentru o descriere mai detaliata ​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ă ​fiecărui ​parametru al metodelor.
  
 <code cpp> <code cpp>
Line 274: Line 291:
 ==== 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 ​cerintelorapasati ​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țelorapă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()''​ astfel: +  - 0.05p - Completați ​metoda ''​Exercise1()''​ astfel: 
-    - Desenati ​vectorui rezultant ​in urma compunerii vectorilor ​  ​$\vec{V_1}$ ​si   $\vec{V_2}$ . +    - Desenați ​vectorui rezultant ​în urma compunerii vectorilor ​  ​$\vec{V_1}$ ​și   $\vec{V_2}$ . 
-    - 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. +    - 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 |}} 
-    - 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 ''​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 ''​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 |}} +  - 0.05p - Completati metoda ''​Exercise3()'' ​astfel: 
-  - 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 vectorii ​unitate ​aflați ​pe direcția ​celor 5 vectori ​prezenți în cadrul ​cerinței. 
-  - 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 |}} +    - 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 - Completati ​metoda ''​Exercise5()''​ pentru desenarea ariei fiecareia ​dintre cele 3 triunghiuri. +  - 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 |}} 
-    - Utilizati ​formula lui Heron pentru calcularea ariei. +  - 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 |}} 
-    - Utilizati ​metoda ''​RenderText(...)''​ pentru desenarea valorii ariei. +  - 0.05p - Completați ​metoda ''​Exercise6()''​ pentru desenarea punctelor din listă după următoarea regulă
-    - 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 |}} +    - Punctele ce se află în interiorul triunghiului se desenează în culoarea verde; 
-  - 0.05p - Completati ​metoda ''​Exercise6()''​ pentru desenarea punctelor din lista dupa urmatoarea regula+    - 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> 
-    - Punctele ce se afla in interiorul triunghiului se deseneaza in culoarea verde; +const float EPSILON = 0.01f; 
-    - Punctele ce se afla in afara triunghiului se deseneaza in culoarea ​rosie. \\ Dupa rezolvarea acestei ​cerinte, ar trebui ​sa obtineti ​rezultatul ​urmator. ​{{ :​ppbg:​laboratoare:​vectors-task-6.png?​600 |}}+ 
 +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>​+
  
  
ppbg/laboratoare/01.1727174532.txt.gz · Last modified: 2024/09/24 13:42 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