This is an old revision of the document!
Această activitate este introductivă și nu este dedicată direct programării graficii pe calculator. Aceasta este realizată cu scopul reluării/introducerii unui set din noțiunile de geometrie ce sunt fundamentale domeniului programării graficii și în sens mai larg, domeniului dezvoltării de jocuri în general.
În framework-ul de laborator, se utilizează biblioteca 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ă:
glm::vec2 v = glm::vec2(4.0f, 3.0f);
Accesarea componentelor individuale ale unui vector se realizează:
float x = v.x; float y = v.y;
Obținerea unui vector prin diferența a două 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;
Obținerea magnitudinii unui vector:
glm::vec2 v = glm::vec2(4.0f, 3.0f); float norm = glm::length(v);
Obținerea unui vector unitate pe direcția 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);
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ă: „Red”, „Green” și „Blue”.
Î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.
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);
Î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.
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:RenderVector(…) pentru desenarea unui vector. După rezolvarea acestei cerințe, ar trebui să obțineți rezultatul următor: 
Exercise3() astfel:Exercise4() pentru desenarea arcului de cerc dintre cei doi vectori. 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: 
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. RenderText(…) pentru desenarea valorii ariei. După rezolvarea acestei cerințe, ar trebui să obțineți rezultatul următor: 
Exercise6() pentru desenarea punctelor din listă după următoarea regulă:const float EPSILON = 0.01f; bool inside_triangle = abs(area_v1v2v3 - (area_pv1v3 + area_pv1v2 + area_pv2v3)) < EPSILON;
După rezolvarea acestei cerințe, ar trebui să obțineți rezultatul următor:
Bonus:
Î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: