Advertisement
Guest User

Untitled

a guest
Feb 22nd, 2018
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.54 KB | None | 0 0
  1. // Daca se doreste utilizarea bibliotecii GLUT trebuie
  2. // inclus fisierul header GL/glut.h (acesta va include
  3. // la GL/gl.h si GL/glu.h, fisierele header pentru
  4. // utilizarea bibliotecii OpenGL). Functiile din biblioteca
  5. // OpenGL sunt prefixate cu gl, cele din GLU cu glu si
  6. // cele din GLUT cu glut.
  7.  
  8. // #include <GL/glut.h>
  9.  
  10.  
  11. #include <stdlib.h>
  12. #include <stdio.h>
  13. #include "glut.h"
  14. #include <math.h>
  15.  
  16. unsigned char prevKey;
  17.  
  18. void Display1() {
  19. glColor3f(0.2, 0.15, 0.88); // albastru
  20. glBegin(GL_LINES); // trasarea unei linii
  21. glVertex2i(1, 1); // coordonatele unui varf
  22. glVertex2i(-1, -1);
  23. glEnd();
  24.  
  25. glColor3f(1, 0.1, 0.1); // rosu
  26. glBegin(GL_LINES);
  27. glVertex2i(-1, 1);
  28. glVertex2i(1, -1);
  29. glEnd();
  30.  
  31. glBegin(GL_LINES);
  32. glVertex2d(-0.5, 0);
  33. glVertex2d(0.5, 0);
  34. glEnd();
  35. }
  36.  
  37. void Display2() {
  38. glColor3f(1, 0.1, 0.1); // rosu
  39. glBegin(GL_LINES);
  40. glVertex2f(-0.5, -0.5);
  41. glVertex2f(-1.0, -1.0);
  42. glVertex2f(1.0, 1.0);
  43. glVertex2f(0.9, 0.9);
  44. glVertex2f(0.8, 0.8);
  45. glVertex2f(0.7, 0.7);
  46. glVertex2f(0.6, 0.6);
  47. glVertex2f(0.5, 0.5);
  48. glEnd();
  49. }
  50.  
  51. void Display3() {
  52. // trasare puncte GL_POINTS : deseneaza n puncte
  53. glColor3f(1, 0.1, 0.1); // rosu
  54. glBegin(GL_POINTS);
  55. glVertex2f(0.5, 0.5);
  56. glVertex2f(-0.5, 0.5);
  57. glVertex2f(-0.5, -0.5);
  58. glVertex2f(0.5, -0.5);
  59. glEnd();
  60. }
  61.  
  62. void Display4() {
  63. glColor3f(1, 0.1, 0.1); // rosu
  64. // trasare linie poligonala GL_LINE_STRIP : (v0,v1), (v1,v2), (v_{n-2},v_{n-1})
  65. glBegin(GL_LINE_STRIP);
  66. glVertex2f(1, 1);
  67. glVertex2f(1, 0.85);
  68. glVertex2f(0.6, 0.6);
  69. glVertex2f(0.6, 0.45);
  70. // de completat ...
  71. glEnd();
  72. }
  73.  
  74. void Display5() {
  75. glColor3f(1, 0.1, 0.1); // rosu
  76. // trasare linie poligonala inchisa GL_LINE_LOOP : (v0,v1), (v1,v2), (v_{n-1},v0)
  77. glBegin(GL_LINE_LOOP);
  78. glVertex2f(1, 1);
  79. glVertex2f(1, 0.85);
  80. glVertex2f(0.6, 0.6);
  81. glVertex2f(0.6, 0.45);
  82. glVertex2f(1, 1);
  83. glEnd();
  84. }
  85.  
  86. void Display6() {
  87. glColor3f(1, 0.1, 0.1); // rosu
  88. // trasare triunghiuri GL_TRIANGLES : (v0,v1,v2), (v3,v4,v5), ...
  89. glBegin(GL_TRIANGLES);
  90. glVertex2f(1, 1);
  91. glVertex2f(1,0.85);
  92. glVertex2f(0.85, 0.85);
  93.  
  94. glVertex2f(-1, -1);
  95. glVertex2f(-1, -0.85);
  96. glVertex2f(-0.85, -0.85);
  97. glEnd();
  98. }
  99.  
  100. void Display7() {
  101. // trasare patrulatere GL_QUADS : (v0,v1,v2,v3), (v4,v5,v6,v7), ...
  102. glBegin(GL_QUADS);
  103. glVertex2f(1, 1);
  104. glVertex2f(1, 0.5);
  105. glVertex2f(0.5, 0.5);
  106. glVertex2f(0.35,0.7);
  107.  
  108. glEnd();
  109. }
  110.  
  111. void Display8() {
  112. // trasare poligon convex GL_QUADS : (v0,v1,v2, ..., v_{n-1})
  113. // trasare poligon convex GL_QUADS : (v0,v1,v2, ..., v_{n-1})
  114. glColor3f(0.2, 0.15, 0.88); // albastru
  115.  
  116. glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
  117. glBegin(GL_POLYGON);
  118. glVertex2f(0.7, 0.0);
  119. glVertex2f(0.35, 0.60);
  120. glVertex2f(-0.35, 0.60);
  121. glVertex2f(-0.7, 0.0);
  122. glVertex2f(-0.35, -0.60);
  123. glVertex2f(0.35, -0.60);
  124. glEnd();
  125.  
  126. glColor3f(1, 0.1, 0.1); // rosu
  127. glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  128. glBegin(GL_POLYGON);
  129. glVertex2f(0.5, 0.0);
  130. glVertex2f(0.25, 0.45);
  131. glVertex2f(-0.25, 0.45);
  132. glVertex2f(-0.5, 0.0);
  133. glVertex2f(-0.25, -0.45);
  134. glVertex2f(0.25, -0.45);
  135. glEnd();
  136.  
  137. glColor3f(1.0, 1.0, 1.0); // alb
  138. glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  139. glBegin(GL_POLYGON);
  140. glVertex2f(0.45, 0.0);
  141. glVertex2f(0.20, 0.40);
  142. glVertex2f(-0.20, 0.40);
  143. glVertex2f(-0.45, 0.0);
  144. glVertex2f(-0.20, -0.40);
  145. glVertex2f(0.20, -0.40);
  146. glEnd();
  147. // de completat ...
  148. }
  149.  
  150. void Init(void) {
  151. // specifica culoarea unui buffer dupa ce acesta
  152. // a fost sters utilizand functia glClear. Ultimul
  153. // argument reprezinta transparenta (1 - opacitate
  154. // completa, 0 - transparenta totala)
  155. glClearColor(1.0, 1.0, 1.0, 1.0);
  156.  
  157. // grosimea liniilor
  158. glLineWidth(3);
  159.  
  160. // dimensiunea punctelor
  161. glPointSize(4);
  162.  
  163. // functia void glPolygonMode (GLenum face, GLenum mode)
  164. // controleaza modul de desenare al unui poligon
  165. // mode : GL_POINT (numai vf. primitivei) GL_LINE (numai
  166. // muchiile) GL_FILL (poligonul plin)
  167. // face : tipul primitivei geometrice dpdv. al orientarii
  168. // GL_FRONT - primitive orientate direct
  169. // GL_BACK - primitive orientate invers
  170. // GL_FRONT_AND_BACK - ambele tipuri
  171. glPolygonMode(GL_FRONT, GL_LINE);
  172. }
  173.  
  174. void Display(void) {
  175. printf("Call Display\n");
  176.  
  177. // sterge buffer-ul indicat
  178. glClear(GL_COLOR_BUFFER_BIT);
  179.  
  180. switch (prevKey) {
  181. case '1':
  182. Display1();
  183. break;
  184. case '2':
  185. Display2();
  186. break;
  187. case '3':
  188. Display3();
  189. break;
  190. case '4':
  191. Display4();
  192. break;
  193. case '5':
  194. Display5();
  195. break;
  196. case '6':
  197. Display6();
  198. break;
  199. case '7':
  200. Display7();
  201. break;
  202. case '8':
  203. Display8();
  204. break;
  205. default:
  206. break;
  207. }
  208.  
  209. // forteaza redesenarea imaginii
  210. glFlush();
  211. }
  212.  
  213. /*
  214. Parametrii w(latime) si h(inaltime) reprezinta noile
  215. dimensiuni ale ferestrei
  216. */
  217. void Reshape(int w, int h) {
  218. printf("Call Reshape : latime = %d, inaltime = %d\n", w, h);
  219.  
  220. // functia void glViewport (GLint x, GLint y,
  221. // GLsizei width, GLsizei height)
  222. // defineste poarta de afisare : acea suprafata dreptunghiulara
  223. // din fereastra de afisare folosita pentru vizualizare.
  224. // x, y sunt coordonatele pct. din stg. jos iar
  225. // width si height sunt latimea si inaltimea in pixeli.
  226. // In cazul de mai jos poarta de afisare si fereastra coincid
  227. glViewport(0, 0, (GLsizei)w, (GLsizei)h);
  228. }
  229.  
  230. /*
  231. Parametrul key indica codul tastei iar x, y pozitia
  232. cursorului de mouse
  233. */
  234. void KeyboardFunc(unsigned char key, int x, int y) {
  235. printf("Ati tastat <%c>. Mouse-ul este in pozitia %d, %d.\n",
  236. key, x, y);
  237. // tasta apasata va fi utilizata in Display ptr.
  238. // afisarea unor imagini
  239. prevKey = key;
  240. if (key == 27) // escape
  241. exit(0);
  242. glutPostRedisplay();
  243. }
  244.  
  245. /*
  246. Codul butonului poate fi :
  247. GLUT_LEFT_BUTTON, GLUT_MIDDLE_BUTTON, GLUT_RIGHT_BUTTON
  248. Parametrul state indica starea: "apasat" GLUT_DOWN sau
  249. "eliberat" GLUT_UP
  250. Parametrii x, y : coordonatele cursorului de mouse
  251. */
  252. void MouseFunc(int button, int state, int x, int y) {
  253. printf("Call MouseFunc : ati %s butonul %s in pozitia %d %d\n",
  254. (state == GLUT_DOWN) ? "apasat" : "eliberat",
  255. (button == GLUT_LEFT_BUTTON) ?
  256. "stang" :
  257. ((button == GLUT_RIGHT_BUTTON) ? "drept" : "mijlociu"),
  258. x, y);
  259. }
  260.  
  261. int main(int argc, char** argv) {
  262. // Initializarea bibliotecii GLUT. Argumentele argc
  263. // si argv sunt argumentele din linia de comanda si nu
  264. // trebuie modificate inainte de apelul functiei
  265. // void glutInit(int *argcp, char **argv)
  266. // Se recomanda ca apelul oricarei functii din biblioteca
  267. // GLUT sa se faca dupa apelul acestei functii.
  268. glutInit(&argc, argv);
  269.  
  270. // Argumentele functiei
  271. // void glutInitWindowSize (int latime, int latime)
  272. // reprezinta latimea, respectiv inaltimea ferestrei
  273. // exprimate in pixeli. Valorile predefinite sunt 300, 300.
  274. glutInitWindowSize(300, 300);
  275.  
  276. // Argumentele functiei
  277. // void glutInitWindowPosition (int x, int y)
  278. // reprezinta coordonatele varfului din stanga sus
  279. // al ferestrei, exprimate in pixeli.
  280. // Valorile predefinite sunt -1, -1.
  281. glutInitWindowPosition(100, 100);
  282.  
  283. // Functia void glutInitDisplayMode (unsigned int mode)
  284. // seteaza modul initial de afisare. Acesta se obtine
  285. // printr-un SAU pe biti intre diverse masti de display
  286. // (constante ale bibliotecii GLUT) :
  287. // 1. GLUT_SINGLE : un singur buffer de imagine. Reprezinta
  288. // optiunea implicita ptr. nr. de buffere de
  289. // de imagine.
  290. // 2. GLUT_DOUBLE : 2 buffere de imagine.
  291. // 3. GLUT_RGB sau GLUT_RGBA : culorile vor fi afisate in
  292. // modul RGB.
  293. // 4. GLUT_INDEX : modul indexat de selectare al culorii.
  294. // etc. (vezi specificatia bibliotecii GLUT)
  295. glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
  296.  
  297. // Functia int glutCreateWindow (char *name)
  298. // creeaza o fereastra cu denumirea data de argumentul
  299. // name si intoarce un identificator de fereastra.
  300. glutCreateWindow(argv[0]);
  301.  
  302. Init();
  303.  
  304. // Functii callback : functii definite in program si
  305. // inregistrate in sistem prin intermediul unor functii
  306. // GLUT. Ele sunt apelate de catre sistemul de operare
  307. // in functie de evenimentul aparut
  308.  
  309. // Functia
  310. // void glutReshapeFunc (void (*Reshape)(int width, int height))
  311. // inregistreaza functia callback Reshape care este apelata
  312. // oridecate ori fereastra de afisare isi modifica forma.
  313. glutReshapeFunc(Reshape);
  314.  
  315. // Functia
  316. // void glutKeyboardFunc (void (*KeyboardFunc)(unsigned char,int,int))
  317. // inregistreaza functia callback KeyboardFunc care este apelata
  318. // la actionarea unei taste.
  319. glutKeyboardFunc(KeyboardFunc);
  320.  
  321. // Functia
  322. // void glutMouseFunc (void (*MouseFunc)(int,int,int,int))
  323. // inregistreaza functia callback MouseFunc care este apelata
  324. // la apasarea sau la eliberarea unui buton al mouse-ului.
  325. glutMouseFunc(MouseFunc);
  326.  
  327. // Functia
  328. // void glutDisplayFunc (void (*Display)(void))
  329. // inregistreaza functia callback Display care este apelata
  330. // oridecate ori este necesara desenarea ferestrei: la
  331. // initializare, la modificarea dimensiunilor ferestrei
  332. // sau la apelul functiei
  333. // void glutPostRedisplay (void).
  334. glutDisplayFunc(Display);
  335.  
  336. // Functia void glutMainLoop() lanseaza bucla de procesare
  337. // a evenimentelor GLUT. Din bucla se poate iesi doar prin
  338. // inchiderea ferestrei aplicatiei. Aceasta functie trebuie
  339. // apelata cel mult o singura data in program. Functiile
  340. // callback trebuie inregistrate inainte de apelul acestei
  341. // functii.
  342. // Cand coada de evenimente este vida atunci este executata
  343. // functia callback IdleFunc inregistrata prin apelul functiei
  344. // void glutIdleFunc (void (*IdleFunc) (void))
  345. glutMainLoop();
  346.  
  347. return 0;
  348. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement