Advertisement
Guest User

Untitled

a guest
May 24th, 2016
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.82 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include <stdlib.h>
  3. #include "glut.h"
  4.  
  5. #include <cmath>
  6. #include <iostream>
  7.  
  8. #define PI 3.1415
  9. /////////////////////////
  10.  
  11. // stałe do obsługi menu podręcznego
  12.  
  13. enum
  14. {
  15. FULL_WINDOW, // aspekt obrazu - całe okno
  16. ASPECT_1_1, // aspekt obrazu 1:1
  17. WIRE_SPHERE, // kula
  18. WIRE_CONE, // stożek
  19. WIRE_CUBE, // sześcian
  20. WIRE_TORUS, // torus
  21. WIRE_DODECAHEDRON, // dwunastościan
  22. WIRE_TEAPOT, // czajnik
  23. WIRE_OCTAHEDRON, // ośmiościan
  24. WIRE_TETRAHEDRON, // czworościan
  25. WIRE_ICOSAHEDRON, // dwudziestościan
  26. EXIT // wyjście
  27. };
  28.  
  29. // aspekt obrazu
  30.  
  31. int aspect = FULL_WINDOW;
  32.  
  33. // rodzaj obiektu
  34.  
  35. int object = WIRE_SPHERE;
  36.  
  37. // rozmiary bryły obcinania
  38.  
  39. const GLdouble left = -10.0;
  40. const GLdouble right = 10.0;
  41. const GLdouble bottom = -10.0;
  42. const GLdouble top = 10.0;
  43. const GLdouble near = 50.0;
  44. const GLdouble far = 70.0;
  45.  
  46. // współczynnik skalowania
  47.  
  48. GLfloat scale = 1.0;
  49.  
  50. // kąty obrotu
  51.  
  52. GLfloat rotatex = 0.0;
  53. GLfloat rotatey = 0.0;
  54.  
  55. // przesunięcie
  56.  
  57. GLfloat translatex = 0.0;
  58. GLfloat translatey = 0.0;
  59.  
  60. // wskaźnik naciśnięcia lewego przycisku myszki
  61.  
  62. int button_state = GLUT_UP;
  63.  
  64. // położenie kursora myszki
  65.  
  66. int button_x, button_y;
  67.  
  68. // funkcja generująca scenę 3D
  69.  
  70. void Display()
  71. {
  72. // kolor tła - zawartość bufora koloru
  73. glClearColor(1.0, 1.0, 1.0, 1.0);
  74.  
  75. // czyszczenie bufora koloru
  76. glClear(GL_COLOR_BUFFER_BIT);
  77.  
  78. // wybór macierzy modelowania
  79. glMatrixMode(GL_MODELVIEW);
  80.  
  81. // macierz modelowania = macierz jednostkowa
  82. glLoadIdentity();
  83.  
  84. // przesunięcie układu współrzędnych obiektu do środka bryły odcinania
  85. glTranslatef(0, 0, -(near + far) / 2);
  86.  
  87. // przesunięcie obiektu - ruch myszką
  88. glTranslatef(translatex, translatey, 0.0);
  89.  
  90. // skalowanie obiektu - klawisze "+" i "-"
  91. glScalef(scale, scale, scale);
  92.  
  93. // obroty obiektu - klawisze kursora
  94. glRotatef(rotatex, 1.0, 0, 0);
  95. glRotatef(rotatey, 0, 1.0, 0);
  96.  
  97. // kolor krawędzi obiektu
  98. glColor3f(0.0, 0.0, 0.0);
  99.  
  100. // rysowanie obiektu
  101. switch (object)
  102. {
  103. // kula
  104. case WIRE_SPHERE:
  105. glutWireSphere(1.0, 10, 20);
  106. break;
  107.  
  108. // stożek
  109. case WIRE_CONE:
  110. glutWireCone(1.0, 2.0, 20, 10);
  111. break;
  112.  
  113. // sześcian
  114. case WIRE_CUBE:
  115. glutWireCube(1.0);
  116. break;
  117.  
  118. // torus
  119. case WIRE_TORUS:
  120. glutWireTorus(0.2, 1, 10, 20);
  121. break;
  122.  
  123. // dwunastościan
  124. case WIRE_DODECAHEDRON:
  125. glutWireDodecahedron();
  126. break;
  127.  
  128. // czajnik
  129. case WIRE_TEAPOT:
  130. glutWireTeapot(1.0);
  131. break;
  132.  
  133. // ośmiościan
  134. case WIRE_OCTAHEDRON:
  135. glutWireOctahedron();
  136. break;
  137.  
  138. // czworościan
  139. case WIRE_TETRAHEDRON:
  140. glutWireTetrahedron();
  141. break;
  142.  
  143. // dwudziestościan
  144. case WIRE_ICOSAHEDRON:
  145. glutWireIcosahedron();
  146. break;
  147. }
  148.  
  149. // skierowanie poleceń do wykonania
  150. glFlush();
  151.  
  152. // zamiana buforów koloru
  153. glutSwapBuffers();
  154. }
  155.  
  156. // zmiana wielkości okna
  157.  
  158. void Reshape(int width, int height)
  159. {
  160. // obszar renderingu - całe okno
  161. glViewport(0, 0, width, height);
  162.  
  163. // wybór macierzy rzutowania
  164. glMatrixMode(GL_PROJECTION);
  165.  
  166. // macierz rzutowania = macierz jednostkowa
  167. glLoadIdentity();
  168.  
  169. // parametry bryły obcinania
  170. if (aspect == ASPECT_1_1)
  171. {
  172. // wysokość okna większa od wysokości okna
  173. if (width < height && width > 0)
  174. glFrustum(left, right, bottom * height / width, top * height / width, near, far);
  175. else
  176.  
  177. // szerokość okna większa lub równa wysokości okna
  178. if (width >= height && height > 0)
  179. glFrustum(left * width / height, right * width / height, bottom, top, near, far);
  180.  
  181. }
  182. else
  183. glFrustum(left, right, bottom, top, near, far);
  184.  
  185. // generowanie sceny 3D
  186. Display();
  187. }
  188.  
  189. // obsługa klawiatury
  190.  
  191. void Keyboard(unsigned char key, int x, int y)
  192. {
  193. // klawisz +
  194. if (key == '+')
  195. scale += 0.05;
  196. else
  197.  
  198. // klawisz -
  199. if (key == '-' && scale > 0.05)
  200. scale -= 0.1;
  201.  
  202. // odrysowanie okna
  203. Reshape(glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));
  204. }
  205.  
  206. // obsługa klawiszy funkcyjnych i klawiszy kursora
  207.  
  208. void SpecialKeys(int key, int x, int y)
  209. {
  210. switch (key)
  211. {
  212. // kursor w lewo
  213. case GLUT_KEY_LEFT:
  214. rotatey -= 1;
  215. break;
  216.  
  217. // kursor w górę
  218. case GLUT_KEY_UP:
  219. rotatex -= 1;
  220. break;
  221.  
  222. // kursor w prawo
  223. case GLUT_KEY_RIGHT:
  224. rotatey += 1;
  225. break;
  226.  
  227. // kursor w dół
  228. case GLUT_KEY_DOWN:
  229. rotatex += 1;
  230. break;
  231. }
  232.  
  233. // odrysowanie okna
  234. Reshape(glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));
  235. }
  236.  
  237. // obsługa przycisków myszki
  238.  
  239. void MouseButton(int button, int state, int x, int y)
  240. {
  241. if (button == GLUT_LEFT_BUTTON)
  242. {
  243. // zapamiętanie stanu lewego przycisku myszki
  244. button_state = state;
  245.  
  246. // zapamiętanie położenia kursora myszki
  247. if (state == GLUT_DOWN)
  248. {
  249. button_x = x;
  250. button_y = y;
  251. }
  252. }
  253. }
  254.  
  255. // obsługa ruchu kursora myszki
  256.  
  257. void MouseMotion(int x, int y)
  258. {
  259. if (button_state == GLUT_DOWN)
  260. {
  261. translatex += 1.1 *(right - left) / glutGet(GLUT_WINDOW_WIDTH) *(x - button_x);
  262. button_x = x;
  263. translatey += 1.1 *(top - bottom) / glutGet(GLUT_WINDOW_HEIGHT) *(button_y - y);
  264. button_y = y;
  265. glutPostRedisplay();
  266. }
  267. }
  268.  
  269. // obsługa menu podręcznego
  270.  
  271. void Menu(int value)
  272. {
  273. switch (value)
  274. {
  275. // obszar renderingu - całe okno
  276. case FULL_WINDOW:
  277. aspect = FULL_WINDOW;
  278. Reshape(glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));
  279. break;
  280.  
  281. // obszar renderingu - aspekt 1:1
  282. case ASPECT_1_1:
  283. aspect = ASPECT_1_1;
  284. Reshape(glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));
  285. break;
  286.  
  287. // kula
  288. case WIRE_SPHERE:
  289. object = WIRE_SPHERE;
  290. Display();
  291. break;
  292.  
  293. // cylinder
  294. case WIRE_CONE:
  295. object = WIRE_CONE;
  296. Display();
  297. break;
  298.  
  299. // sześcian
  300. case WIRE_CUBE:
  301. object = WIRE_CUBE;
  302. Display();
  303. break;
  304.  
  305. // torus
  306. case WIRE_TORUS:
  307. object = WIRE_TORUS;
  308. Display();
  309. break;
  310.  
  311. // dwunastościan
  312. case WIRE_DODECAHEDRON:
  313. object = WIRE_DODECAHEDRON;
  314. Display();
  315. break;
  316.  
  317. // czajnik
  318. case WIRE_TEAPOT:
  319. object = WIRE_TEAPOT;
  320. Display();
  321. break;
  322.  
  323. // ośmiościan
  324. case WIRE_OCTAHEDRON:
  325. object = WIRE_OCTAHEDRON;
  326. Display();
  327. break;
  328.  
  329. // czworościan
  330. case WIRE_TETRAHEDRON:
  331. object = WIRE_TETRAHEDRON;
  332. Display();
  333. break;
  334.  
  335. // dwudziestościan
  336. case WIRE_ICOSAHEDRON:
  337. object = WIRE_ICOSAHEDRON;
  338. Display();
  339. break;
  340.  
  341. // wyjście
  342. case EXIT:
  343. exit(0);
  344. }
  345. }
  346.  
  347. int main(int argc, char * argv[])
  348. {
  349. // inicjalizacja biblioteki GLUT
  350. glutInit(&argc, argv);
  351.  
  352. // inicjalizacja bufora ramki
  353. glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
  354.  
  355. // rozmiary głównego okna programu
  356. glutInitWindowSize(400, 400);
  357.  
  358. // utworzenie głównego okna programu
  359. #ifdef WIN32
  360.  
  361. glutCreateWindow("Przekształcenia");
  362. #else
  363.  
  364. glutCreateWindow("Przeksztalcenia");
  365. #endif
  366.  
  367. // dołączenie funkcji generującej scenę 3D
  368. glutDisplayFunc(Display);
  369.  
  370. // dołączenie funkcji wywoływanej przy zmianie rozmiaru okna
  371. glutReshapeFunc(Reshape);
  372.  
  373. // dołączenie funkcji obsługi klawiatury
  374. glutKeyboardFunc(Keyboard);
  375.  
  376. // dołączenie funkcji obsługi klawiszy funkcyjnych i klawiszy kursora
  377. glutSpecialFunc(SpecialKeys);
  378.  
  379. // obsługa przycisków myszki
  380. glutMouseFunc(MouseButton);
  381.  
  382. // obsługa ruchu kursora myszki
  383. glutMotionFunc(MouseMotion);
  384.  
  385. // utworzenie podmenu - aspekt obrazu
  386. int MenuAspect = glutCreateMenu(Menu);
  387. #ifdef WIN32
  388.  
  389. glutAddMenuEntry("Aspekt obrazu - całe okno", FULL_WINDOW);
  390. #else
  391.  
  392. glutAddMenuEntry("Aspekt obrazu - cale okno", FULL_WINDOW);
  393. #endif
  394.  
  395. glutAddMenuEntry("Aspekt obrazu 1:1", ASPECT_1_1);
  396.  
  397. // utworzenie podmenu - obiekt
  398. int MenuObject = glutCreateMenu(Menu);
  399. glutAddMenuEntry("Kula", WIRE_SPHERE);
  400. #ifdef WIN32
  401.  
  402. glutAddMenuEntry("Stożek", WIRE_CONE);
  403. glutAddMenuEntry("Sześcian", WIRE_CUBE);
  404. glutAddMenuEntry("Torus", WIRE_TORUS);
  405. glutAddMenuEntry("Dwunastościan", WIRE_DODECAHEDRON);
  406. glutAddMenuEntry("Czajnik", WIRE_TEAPOT);
  407. glutAddMenuEntry("Ośmiościan", WIRE_OCTAHEDRON);
  408. glutAddMenuEntry("Czworościan", WIRE_TETRAHEDRON);
  409. glutAddMenuEntry("Dwudziestościan", WIRE_ICOSAHEDRON);
  410. #else
  411.  
  412. glutAddMenuEntry("Stozek", WIRE_CONE);
  413. glutAddMenuEntry("Szescian", WIRE_CUBE);
  414. glutAddMenuEntry("Torus", WIRE_TORUS);
  415. glutAddMenuEntry("Dwunastoscian", WIRE_DODECAHEDRON);
  416. glutAddMenuEntry("Czajnik", WIRE_TEAPOT);
  417. glutAddMenuEntry("Osmioscian", WIRE_OCTAHEDRON);
  418. glutAddMenuEntry("Czworoscian", WIRE_TETRAHEDRON);
  419. glutAddMenuEntry("Dwudziestoscian", WIRE_ICOSAHEDRON);
  420. #endif
  421.  
  422. // menu główne
  423. glutCreateMenu(Menu);
  424. glutAddSubMenu("Aspekt obrazu", MenuAspect);
  425. glutAddSubMenu("Obiekt", MenuObject);
  426. #ifdef WIN32
  427.  
  428. glutAddMenuEntry("Wyjście", EXIT);
  429. #else
  430.  
  431. glutAddMenuEntry("Wyjscie", EXIT);
  432. #endif
  433.  
  434. // określenie przycisku myszki obsługującego menu podręczne
  435. glutAttachMenu(GLUT_RIGHT_BUTTON);
  436.  
  437. // wprowadzenie programu do obsługi pętli komunikatów
  438. glutMainLoop();
  439. return 0;
  440. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement