Documente Academic
Documente Profesional
Documente Cultură
RAPORT
Lucrare de laborator Nr.1
Disciplina: Programarea Pilotată de Evenimente
A efectuat gr.TI-182
A verificat lect.univ:
Rotaru Lilia
Ursu Adriana
Chișinău 2020
Definirea ¸si afi¸sarea obiectelor grafice
Parametrii ini¸tiali
Afi¸sarea unor obiecte geometrice sau primitive grafice se face prin parcurgerea
obliga- torie a unor etape prestabilite, precum managementul ferestrei grafice, definirea
culorilor fundalului ¸si a obiectului, a formei acestuia ¸si executarea instruc¸tiunilor
grafice pentru transferul imaginii rezultate ˆın bufferul grafic.
Alegerea unei culori. Trasarea unui obiect grafic se efectueaz˘a ˆın OpenGL
independent de alegerea culorii asociate obiectului. Odat˘a aleas˘a o anumit˘a
culoare, toate obiectele care vor fi trasate ulterior vor avea culoarea respectiv˘a, astfel
ˆıncˆat dac˘a se dore¸ste afi¸sarea unor obiecte ˆın culori diferite, de fiecare dat˘a este
necesar˘a modificarea culorii curente.
Alegerea unei culori curente se face ˆın cadrul func¸tiei display() cu ajutorul
instruc¸tiu- nii glColor(). ˆIn func¸tie de tipul argumentelor introduse, func¸tia cap˘at˘a
un sufix specific (ˆın cazul parametrilor de tip real, func¸tia devine glColor3f()).
Exemplul de mai jos permite alegerea unei culori curente ro¸sii.
void display (void){ glColor3f(1.0,
0.0, 0.0);
...
}
Parametrii de culoare specifici celor trei culori primare (RGB) iau valori reale
cuprinse ˆıntre 0 (lips˘a) ¸si 1 (maxim). Astfel, cele opt culori elementare pot fi
definite cu ajutorul urm˘atoarelor opt variante de instruc¸tiuni.
glColor3f(0.0, 0.0, 0.0); negru
glColor3f(1.0, 0.0, 0.0); rosu
glColor3f(0.0, 1.0, 0.0); verde
glColor3f(0.0, 0.0, 1.0); albastru
glColor3f(0.0, 1.0, 1.0); cyan
glColor3f(1.0, 0.0, 1.0); magenta
glColor3f(1.0, 1.0, 0.0); galben
glColor3f(1.0, 1.0, 1.0); alb
De remarcat faptul c˘a ˆın cazul instruc¸tiunii de ¸stergere a bufferului existau patru
para- metrii, ˆın timp ce ˆın cazul instruc¸tiunii de alegere a culorii curente num˘arul
parametri-lor este doar de trei, lipsind transparen¸ta (alpha).
Prima dintre ele asigur˘a ˆınceperea execu¸tiei instruc¸tiunilor precedente acesteia, ˆın
timp ce a doua for¸teaz˘a execu¸tia tuturor instruc¸tiunilor anterioare. Doar ˆın cazul
ˆın care, pen- tru o aplica¸tie dat˘a, simpla utilizare a lui glFlush() nu este
suficient˘a, se recomand˘a includerea lui glFinish().
Instruc¸tiunea glFlush() se utilizeaz˘a doar ˆın cazul alegerii ˆın cadrul func¸tiei principale
main() a unor buffere simple.
ˆIn interiorul ferestrei, ini¸tial sistemul de coordonate de vizualizare este centrat ˆın
punc- tul de coordonate (0, 0, 0) ¸si ia valori pe axele orizontale ¸si verticale cuprinse
ˆıntre -1 ¸si 1. De remarcat faptul c˘a axa corespunz˘atoare adˆancimii nu este vizibil˘a.
ˆIn acest moment singurele obiecte care pot fi vizualizate sunt obiectele din plan (2D).
Punctele reprezint˘a numere reale, denumite ¸si vertex-uri, definite fie ˆın plan, prin spe-
cificarea coordonatelor x ¸si y, fie ˆın spa¸tiu, prin specificarea celor trei coordonate x, y ¸si
z. ˆIn cazul coordonatelor omogene poate exista o a patra coordonat˘a, notat˘a w. Dac˘a w
este nenul, coordonatele punctului ˆın spa¸tiul tridimensional sunt (x/w, y/w, z/w).
ˆIn OpenGL un punct (sau vertex) este specificat cu ajutorul instruc¸tiunii glVertex(). ˆIn
func¸tie de num˘arul de coordonate ¸si de tipul de date, func¸tia cap˘at˘a sufixe, dup˘a cum
urmeaz˘a.
glVertex[234][sifd][v](x,y,[z],[w]);
Sufixul [234] reprezint˘a num˘arul de coordonate utilizate pentru definirea punctului, iar
[sifd] define¸ste tipul datelor utilizate. ˆIn cazul ˆın care se utilizeaz˘a vectori de coordo- nate
predefini¸ti, apare ¸si sufixul [v]. ˆIn exemplele urm˘atoare se prezint˘a diferite moduri
de definire a unor puncte.
glVertex2s(2, 1);
#include <GL/glut.h>
void init(void) {
glClearColor(0.0, 0.0, 0.0, 0.0);
}
void display(void) {
glClear(GL_COLOR_BUFFER_BIT);
glPolygonMode(GL_FRONT, GL_FILL); // fateta exterioara umpluta glPolygonMode(GL_BACK, GL_LINE);
// fateta interioara goala glFrontFace(GL_CW); // sens orar = fateta interioara
glBegin(GL_POLYGON); // poligonul 1, sens orar
glVertex3f(0.8, -0.8, 0.0);
glVertex3f(0.2, -0.8, 0.0);
glVertex3f(0.2, -0.2, 0.0);
glVertex3f(0.8, -0.2, 0.0);
glEnd();
glBegin(GL_POLYGON); // poligonul 2, sens invers orar glVertex3f(0.2, 0.2, 0.0);
glVertex3f(0.8, 0.2, 0.0);
glVertex3f(0.8, 0.8, 0.0);
glVertex3f(0.2, 0.8, 0.0); glEnd();
glFrontFace(GL_CCW); // sens orar = fateta exterioara
glBegin(GL_POLYGON); // poligonul 3, sens orar glVertex3f(-0.2, -0.8, 0.0);
glVertex3f(-0.8, -0.8, 0.0);
glVertex3f(-0.8, -0.2, 0.0);
glVertex3f(-0.2, -0.2, 0.0); glEnd();
glBegin(GL_POLYGON); // poligonul 4, sens invers orar glVertex3f(-0.2, 0.8, 0.0);
glVertex3f(-0.8, 0.8, 0.0);
glVertex3f(-0.8, 0.2, 0.0);
glVertex3f(-0.2, 0.2, 0.0); glEnd();
glFlush();
}
Rezultatul:
Concluzie:
În acest laborator s-a creat o aplicație Windows în care sunt desenate 2 triunghiuri și 2 pătrate. În laboratorul dat sa
folosit OpenGL (Open Graphics Library) care reprezint˘a o specifica¸tie standardizat˘a a unei interfe-te de
programare a aplica¸tiilor (API) portabil˘a pe diferite platforme, destinat˘a cre˘arii aplica¸tiilor de grafic˘a
computerizat˘a 2D ¸si 3D.
Bibliografie: