Advertisement
Guest User

jprdl

a guest
Jan 21st, 2020
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.42 KB | None | 0 0
  1. //////////////////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Program wyswietlajacy szescian w rzucie perspektywicznym. Dlugosc boku szescianu
  4. // moze byc interaktywnie zmieniana za pomoca klwiszy '+' i '-'.
  5. //
  6. //////////////////////////////////////////////////////////////////////////////////////////
  7. #include <glut.h>
  8. #include <math.h>
  9.  
  10.  
  11. // Definicja stalych
  12. #define DLUGOSC_BOKU 5.0
  13. #define OBSERWATOR_ODLEGLOSC 20.0
  14. #define OBSERWATOR_OBROT_X 20.0
  15. #define OBSERWATOR_OBROT_Y 20.0
  16. #define OBSERWATOR_OBROT_Z 0.0
  17. #define OBSERWATOR_FOV_Y 30.0
  18.  
  19.  
  20. // Zmienne globalne
  21. double bok = DLUGOSC_BOKU; // Dlugosc boku szescianu
  22. int szerokoscOkna = 800;
  23. int wysokoscOkna = 600;
  24. GLfloat rotObsY = 40.0;
  25. GLfloat rotObsX = 40.0;
  26. GLfloat rotObsZ = 0.0;
  27. int odleglosc = 40, i, j;
  28. int N = 5;
  29. int M = 5;
  30.  
  31.  
  32. // Prototypy funkcji
  33. void RysujSzescian(double a);
  34. void UstawParametryWidoku(int szer, int wys);
  35. void WyswietlObraz(void);
  36. void ObslugaKlawiatury(unsigned char klawisz, int x, int y);
  37.  
  38.  
  39. //////////////////////////////////////////////////////////////////////////////////////////
  40. // Funkcja rysujaca szescian o boku "a" w trybie GL_QUAD_STRIP.
  41. // Srodek szescianu znajduje się w punkcie (0,0,0).
  42. void RysujSzescian(double a)
  43. {
  44. // Pocztaek tworzenia ukladu wspolrzednych
  45. glBegin(GL_LINES);
  46.  
  47. // Os X
  48. glColor3f(1.0, 0.0, 0.0);
  49. glVertex3f(-200.0, 0.0, 0.0);
  50. glVertex3f(200.0, 0.0, 0.0);
  51.  
  52. // Os Y
  53. glColor3f(0.0, 1.0, 0.0);
  54. glVertex3f(0.0, -200.0, 0.0);
  55. glVertex3f(0.0, 200.0, 0.0);
  56.  
  57. // Os Z
  58. glColor3f(0.0, 0, 1);
  59. glVertex3f(0.0, 0.0, -200.0);
  60. glVertex3f(0.0, 0.0, 200.0);
  61.  
  62. // Koniec tworzenia ukladu wspolrzednych
  63. glEnd();
  64.  
  65.  
  66.  
  67.  
  68.  
  69. /*
  70. glColor3f(1.0, 1, 1);
  71.  
  72. glBegin(GL_TRIANGLE_FAN); // gorna podstawa
  73. glVertex3f(0,25, 0);
  74. for(i=0;i*360/N<=360;i++)
  75. {
  76. glVertex3f(25*cos((float)(i*360/N)*3.1415926535/180.0),25,25*sin((float)(i*360/N)*3.1415926535/180.0));
  77. }
  78. glEnd();
  79.  
  80. glColor3f(1, 0, 0);
  81. glBegin(GL_TRIANGLE_FAN); //dolna podstawa
  82. glVertex3f(0,0, 0);
  83. for(i=0;i*360/N<=360;i++)
  84. {
  85. glVertex3f(5*cos((float)(i*360/N)*3.1415926535/180.0),0,5*sin((float)(i*360/N)*3.1415926535/180.0));
  86. }
  87. glEnd();
  88.  
  89.  
  90. glBegin(GL_TRIANGLES);
  91. for (i = 0; i*360.0/N <= 360.0; i++)
  92. {
  93. glVertex3f(5 * cos((float)(i * 360 / N)*3.1415926535 / 180.0), 0, 5 * sin((float)(i * 360 / N)*3.1415926535 / 180.0));
  94. glVertex3f(25 * cos((float)(i * 360 / N)*3.1415926535 / 180.0), 25, 25 * sin((float)(i * 360 / N)*3.1415926535 / 180.0));
  95. glVertex3f(25 * cos((float)((i+1) * 360 / N)*3.1415926535 / 180.0), 25, 25 * sin((float)((i+1) * 360 / N)*3.1415926535 / 180.0));
  96.  
  97. glVertex3f(5 * cos((float)(i * 360 / N)*3.1415926535 / 180.0), 0, 5 * sin((float)(i * 360 / N)*3.1415926535 / 180.0));
  98. glVertex3f(5 * cos((float)((i+1) * 360 / N)*3.1415926535 / 180.0), 0, 5 * sin((float)((i+1) * 360 / N)*3.1415926535 / 180.0));
  99. //glVertex3f(25 * cos((float)(i * 360 / N)*3.1415926535 / 180.0), 25, 25 * sin((float)(i * 360 / N)*3.1415926535 / 180.0));
  100. glVertex3f(25 * cos((float)((i+1) * 360 / N)*3.1415926535 / 180.0), 25, 25 * sin((float)((i+1) * 360 / N)*3.1415926535 / 180.0));
  101.  
  102.  
  103.  
  104.  
  105. }
  106. glEnd();
  107.  
  108.  
  109.  
  110.  
  111.  
  112. // Sciany boczne
  113. glBegin(GL_QUAD_STRIP);
  114. glVertex3f(a/2.0, a/2.0, a/2.0);
  115. glVertex3f(a/2.0, -a/2.0, a/2.0);
  116. glVertex3f(a/2.0, a/2.0, -a/2.0);
  117. glVertex3f(a/2.0, -a/2.0, -a/2.0);
  118.  
  119. glVertex3f(-a/2.0, a/2.0, -a/2.0);
  120. glVertex3f(-a/2.0, -a/2.0, -a/2.0);
  121.  
  122. glVertex3f(-a/2.0, a/2.0, a/2.0);
  123. glVertex3f(-a/2.0, -a/2.0, a/2.0);
  124.  
  125. glVertex3f(a/2.0, a/2.0, a/2.0);
  126. glVertex3f(a/2.0, -a/2.0, a/2.0);
  127. glEnd();
  128.  
  129. // Gorna sciana
  130. glBegin(GL_QUAD_STRIP);
  131. glVertex3f(-a/2.0, a/2.0, a/2.0);
  132. glVertex3f(a/2.0, a/2.0, a/2.0);
  133. glVertex3f(-a/2.0, a/2.0, -a/2.0);
  134. glVertex3f(a/2.0, a/2.0, -a/2.0);
  135. glEnd();
  136.  
  137. // Dolna sciana
  138. glBegin(GL_QUAD_STRIP);
  139. glVertex3f(-a/2.0, -a/2.0, a/2.0);
  140. glVertex3f(a/2.0, -a/2.0, a/2.0);
  141. glVertex3f(-a/2.0, -a/2.0, -a/2.0);
  142. glVertex3f(a/2.0, -a/2.0, -a/2.0);
  143. glEnd();
  144. */
  145.  
  146. //16.(X1) ¼ walca w trybie GL_QUAD o promieniu podstawy 3 i jej środku w punkcie (0, 0, 0), wysokości 5
  147.  
  148.  
  149. //GÓRNA PODSTAWA
  150.  
  151. /* glColor3f(1.0, 1, 1);
  152.  
  153. glBegin(GL_TRIANGLE_FAN);
  154. glVertex3f(0,25, 0);
  155. for(i=0;i*360/N<=360;i++)
  156. {
  157. glVertex3f(25*cos((float)(i*360/N)*3.1415926535/180.0),25,25*sin((float)(i*360/N)*3.1415926535/180.0));
  158. }
  159. glEnd(); */
  160.  
  161. //DOLNA PODSTAWA
  162.  
  163. /*
  164.  
  165. glColor3f(1.0, 1, 1);
  166.  
  167. glBegin(GL_QUADS);
  168.  
  169. for (i = 0; i * 360 / N < 90; i++)
  170. {
  171. glVertex3f(0, 0, 0);
  172. glVertex3f(0, 0, 0);
  173. glVertex3f(3 * cos((float)(i * 360 / N) * 3.1415926535 / 180.0), 0, 3 * sin((float)(i * 360 / N) * 3.1415926535 / 180.0));
  174. glVertex3f(3 * cos((float)((i + 1) * 360 / N) * 3.1415926535 / 180.0), 0, 3 * sin((float)((i + 1) * 360 / N) * 3.1415926535 / 180.0));
  175. }
  176. glEnd();
  177.  
  178. //GORNA PODSTAWA
  179.  
  180. glBegin(GL_QUADS);
  181.  
  182. for (i = 0; i * 360 / N < 90; i++)
  183. {
  184. glVertex3f(0, 5, 0);
  185. glVertex3f(0, 5, 0);
  186. glVertex3f(3 * cos((float)(i * 360 / N) * 3.1415926535 / 180.0), 5, 3 * sin((float)(i * 360 / N) * 3.1415926535 / 180.0));
  187. glVertex3f(3 * cos((float)((i + 1) * 360 / N) * 3.1415926535 / 180.5), 5, 3 * sin((float)((i + 1) * 360 / N) * 3.1415926535 / 180.0));
  188. }
  189. glEnd();
  190.  
  191. //POWIERZCHNIA BOCZNA WALCA
  192.  
  193. glColor3f(1.0, 1.0, 0.0);
  194. glBegin(GL_QUADS);
  195. for (i = 0; i * (360 / N) < (90.0); i++)
  196. {
  197.  
  198. glVertex3f(3 * cos((float)(i * 360 / N) * 3.1415926535 / 180.0), 0, 3 * sin((float)(i * 360 / N) * 3.1415926535 / 180.0));
  199. glVertex3f(3 * cos((float)(i * 360 / N) * 3.1415926535 / 180.0), 5, 3 * sin((float)(i * 360 / N) * 3.1415926535 / 180.0));
  200.  
  201. glVertex3f(3 * cos((float)((i + 1) * 360 / N) * 3.1415926535 / 180.0), 5, 3 * sin((float)((i + 1) * 360 / N) * 3.1415926535 / 180.0));
  202. glVertex3f(3 * cos((float)((i + 1) * 360 / N) * 3.1415926535 / 180.0), 0, 3 * sin((float)((i + 1) * 360 / N) * 3.1415926535 / 180.0));
  203.  
  204. }
  205.  
  206.  
  207.  
  208.  
  209.  
  210.  
  211. glEnd();
  212.  
  213. glBegin(GL_QUADS);
  214.  
  215.  
  216.  
  217.  
  218. glVertex3f(0, 0, 0);
  219. glVertex3f((3), 0, 0);
  220.  
  221. glVertex3f((3), 5, 0);
  222. glVertex3f(0, 5, 0);
  223.  
  224.  
  225.  
  226.  
  227.  
  228.  
  229.  
  230. glEnd();
  231.  
  232.  
  233. glBegin(GL_QUADS);
  234.  
  235.  
  236.  
  237.  
  238. glVertex3f(0, 0, 0);
  239. glVertex3f(0, 0, 3);
  240. glVertex3f(0, 5, 3);
  241. glVertex3f(0, 5, 0);
  242.  
  243.  
  244.  
  245.  
  246.  
  247.  
  248.  
  249. glEnd();
  250.  
  251. */
  252.  
  253. //glVertex3f(3 * cos((float)((i + 1) * 360 / N) * 3.1415926535 / 180.5), 5, 3 * sin((float)((i + 1) * 360 / N) * 3.1415926535 / 180.0));
  254.  
  255.  
  256. double r = 2.0;
  257. double h = 3.0;
  258. double hPodzial = h / M ;
  259. double dAlfa = 90.0 / N;
  260.  
  261. glColor3f(1, 0, 1);
  262. for (int j = 0; j * hPodzial < h; j++) {
  263. glBegin(GL_QUADS);
  264. for (int i = 0; i * dAlfa <= 90.0; i++) {
  265. if (j % 2 == 0)glColor3f(1, 0, 1);
  266. else glColor3f(0, 1, 0);
  267. if (i * dAlfa != 90.0) {
  268. glVertex3f(r * cos(DEG2RAD(i * dAlfa)), (j + 1) * hPodzial, r * sin(DEG2RAD(i * dAlfa)));
  269. glVertex3f(r * cos(DEG2RAD(i * dAlfa)), j * hPodzial, r * sin(DEG2RAD(i * dAlfa)));
  270. glVertex3f(r * cos(DEG2RAD(((i + 1) % (N + 1)) * dAlfa)), j * hPodzial, r * sin(DEG2RAD(((i + 1) % (N + 1)) * dAlfa)));
  271. glVertex3f(r * cos(DEG2RAD(((i + 1) % (N + 1)) * dAlfa)), (j + 1) * hPodzial, r * sin(DEG2RAD(((i + 1) % (N + 1)) * dAlfa)));
  272. }
  273. if (i * dAlfa == 90) {
  274. glVertex3f(0, j * hPodzial, 2);
  275. glVertex3f(0, (j + 1) * hPodzial, 2);
  276. glVertex3f(0, (j + 1) * hPodzial, 0);
  277. glVertex3f(0, j * hPodzial, 0);
  278. glVertex3f(0, j * hPodzial, 0);
  279. glVertex3f(0, (j + 1) * hPodzial, 0);
  280. glVertex3f(2, (j + 1) * hPodzial, 0);
  281. glVertex3f(2, j * hPodzial, 0);
  282.  
  283. }
  284. }
  285. glEnd();
  286. }
  287.  
  288. glColor3f(0, 0, 1);
  289. glBegin(GL_TRIANGLE_FAN);
  290. glVertex3f(0, 0, 0);
  291. for (int i = 0; i * dAlfa <= 90.0; i++) {
  292. glVertex3f(r * cos(DEG2RAD(i * dAlfa)), 0, r * sin(DEG2RAD(i * dAlfa)));
  293. }
  294. glEnd();
  295.  
  296. glColor3f(1, 0, 0);
  297. glBegin(GL_TRIANGLE_FAN);
  298. glVertex3f(0, h, 0);
  299. for (int i = 0; i * dAlfa <= 90.0; i++) {
  300. glVertex3f(r * cos(DEG2RAD(i * dAlfa)), h, r * sin(DEG2RAD(i * dAlfa)));
  301. }
  302. glEnd();
  303.  
  304.  
  305.  
  306. }
  307.  
  308.  
  309.  
  310.  
  311.  
  312.  
  313.  
  314.  
  315. //////////////////////////////////////////////////////////////////////////////////////////
  316. // Funkcja ustawiajaca parametry rzutu perspektywicznego i rozmiary viewportu. Powinna
  317. // być wywolywana kazdorazowo po zmianie rozmiarow okna programu.
  318. void UstawParametryWidoku(int szer, int wys)
  319. {
  320. // Zapamietanie wielkosci widoku
  321. szerokoscOkna = szer;
  322. wysokoscOkna = wys;
  323.  
  324. // Ustawienie parametrow viewportu
  325. glViewport(0, 0, szerokoscOkna, wysokoscOkna);
  326.  
  327. // Przejscie w tryb modyfikacji macierzy rzutowania
  328. glMatrixMode(GL_PROJECTION);
  329. glLoadIdentity();
  330. gluPerspective(OBSERWATOR_FOV_Y, (float)szerokoscOkna / (float)wysokoscOkna, 1.0, 1000.0);
  331. }
  332.  
  333.  
  334. //////////////////////////////////////////////////////////////////////////////////////////
  335. // Funkcja wyswietlajaca pojedyncza klatke animacji
  336. void WyswietlObraz(void)
  337. {
  338. // Wyczyszczenie bufora koloru i bufora glebokosci
  339. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  340.  
  341. // Przejscie w tryb modyfikacji macierzy przeksztalcen geometrycznych
  342. glMatrixMode(GL_MODELVIEW);
  343.  
  344. // Zastapienie aktywnej macierzy macierza jednostkowa
  345. glLoadIdentity();
  346.  
  347. // Ustalenie polozenia obserwatora
  348. glTranslatef(0, 0, -odleglosc);
  349. glRotatef(rotObsX, 1, 0, 0);
  350. glRotatef(rotObsY, 0, 1, 0);
  351. glRotatef(rotObsZ, 0, 0, 1);
  352.  
  353.  
  354. // Narysowanie szescianu
  355. RysujSzescian(bok);
  356.  
  357. // Przelaczenie buforow ramki
  358. glutSwapBuffers();
  359. }
  360. // Funkcja klawiszy specjalnych
  361. void ObslugaKlawiszySpecjalnych(int klawisz, int x, int y)
  362. {
  363. switch (klawisz)
  364. {
  365. case GLUT_KEY_UP:
  366. rotObsX = rotObsX + 1.0;
  367. break;
  368.  
  369. case GLUT_KEY_DOWN:
  370. rotObsX = rotObsX - 1.0;
  371. break;
  372.  
  373. case GLUT_KEY_LEFT:
  374. rotObsY = rotObsY - 1.0;
  375. break;
  376.  
  377. case GLUT_KEY_RIGHT:
  378. rotObsY = rotObsY + 1.0;
  379. break;
  380. }
  381. }
  382.  
  383.  
  384. //////////////////////////////////////////////////////////////////////////////////////////
  385. // Funkcja obslugi klawiatury
  386. void ObslugaKlawiatury(unsigned char klawisz, int x, int y)
  387. {/*
  388. if(klawisz == '+')
  389. bok *= 1.1;
  390. else if (klawisz == '-')
  391. bok /= 1.1;
  392. else if (klawisz == 27)
  393. exit(0); */
  394. switch (klawisz)
  395. {
  396. case 'X':
  397. rotObsX = rotObsX + 1.0;
  398. break;
  399.  
  400. case 'x':
  401. rotObsX = rotObsX - 1.0;
  402. break;
  403.  
  404. case 'y':
  405. rotObsY = rotObsY - 1.0;
  406. break;
  407.  
  408. case 'Y':
  409. rotObsY = rotObsY + 1.0;
  410. break;
  411.  
  412. case 'z':
  413. rotObsZ = rotObsZ - 1.0;
  414. break;
  415.  
  416. case 'Z':
  417. rotObsZ = rotObsZ + 1.0;
  418. break;
  419.  
  420. case '-':
  421. odleglosc = (odleglosc < 200) ? odleglosc + 1 : odleglosc;
  422. break;
  423.  
  424. case '+':
  425. odleglosc = (odleglosc > 20) ? odleglosc - 1 : odleglosc;
  426. break;
  427.  
  428. case 'M':
  429. N = (N < 64) ? N + 1 : N;
  430. break;
  431.  
  432. case 'P':
  433. N = (N > 4) ? N - 1 : N;
  434. break;
  435.  
  436. case 'm':
  437. M = (M < 64) ? M + 1 : M;
  438. break;
  439.  
  440. case 'p':
  441. M = (M > 4) ? M - 1 : M;
  442. break;
  443.  
  444. if (klawisz == 27)
  445. exit(0);
  446.  
  447.  
  448. }
  449. }
  450.  
  451.  
  452. //////////////////////////////////////////////////////////////////////////////////////////
  453. // Glowna funkcja programu
  454. int main(int argc, char** argv)
  455. {
  456. // Zainicjowanie biblioteki GLUT
  457. glutInit(&argc, argv);
  458.  
  459. // Ustawienie trybu wyswietlania
  460. glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  461.  
  462. // Ustawienie polozenia dolenego lewego rogu okna
  463. glutInitWindowPosition(100, 100);
  464.  
  465. // Ustawienie rozmiarow okna
  466. glutInitWindowSize(szerokoscOkna, wysokoscOkna);
  467.  
  468. // Utworzenie okna
  469. glutCreateWindow("Szescian");
  470.  
  471. // Odblokowanie bufora glebokosci
  472. glEnable(GL_DEPTH_TEST);
  473.  
  474. // Ustawienie wartosci czyszczacej zawartosc bufora glebokosci
  475. glClearDepth(1000.0);
  476.  
  477. // Ustawienie koloru czyszczenia bufora ramki
  478. glClearColor(0.0f, 0.0f, 0.3f, 0.0f);
  479.  
  480. // Wlaczenie wyswietlania wielokatow w postaci obrysow (przydatne w celach diagnostycznych).
  481. glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  482.  
  483. // Zarejestrowanie funkcji (callback) odpowiedzialnej za
  484. glutDisplayFunc(WyswietlObraz);
  485.  
  486. // Zarejestrowanie funkcji (callback) wywolywanej za kazdym razem kiedy
  487. // zmieniane sa rozmiary okna
  488. glutReshapeFunc(UstawParametryWidoku);
  489.  
  490. // Zarejestrowanie funkcji wykonywanej gdy okno nie obsluguje
  491. // zadnych zadan
  492. glutIdleFunc(WyswietlObraz);
  493.  
  494. // Zarejestrowanie funkcji obslugi klawiatury
  495. glutKeyboardFunc(ObslugaKlawiatury);
  496.  
  497. // Obsluga glownej petli programu (wywolywanie zarejestrowanych callbackow
  498. // w odpowiedzi na odbierane zdarzenia lub obsluga stanu bezczynnosci)
  499. glutMainLoop();
  500.  
  501. // Zarejestrowanie funkcji obslugi klawiszy specjalnych
  502. glutSpecialFunc(ObslugaKlawiszySpecjalnych);
  503.  
  504. return 0;
  505. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement