Advertisement
Guest User

Untitled

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