Advertisement
Guest User

Untitled

a guest
Dec 12th, 2019
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.33 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. // Definicja stalych
  11. #define DLUGOSC_BOKU 5.0
  12. #define OBSERWATOR_ODLEGLOSC 20.0
  13. #define OBSERWATOR_OBROT_X 20.0
  14. #define OBSERWATOR_OBROT_Y 20.0
  15. #define OBSERWATOR_FOV_Y 30.0
  16. #define minOdl 10.0
  17. #define maxOdl 300.0
  18. #define M_PI 3.1415926535
  19. #define DEG2RAD(x) ((float)(x)*M_PI/180.0)
  20.  
  21. int h = 5;
  22. int R = 6;
  23. int r = 8;
  24. int n = 32;
  25. int nMin = 4;
  26. int nMax = 64;
  27. double dAlfa;
  28. int i = 0;
  29.  
  30. GLfloat rotObsY = 40.0;
  31. GLfloat rotObsX = 40.0;
  32. GLfloat rotObsZ = 0.0;
  33. GLfloat odl = 100.0;
  34.  
  35. // Zmienne globalne
  36. double bok = DLUGOSC_BOKU; // Dlugosc boku szescianu
  37. int szerokoscOkna = 800;
  38. int wysokoscOkna = 600;
  39.  
  40.  
  41. // Prototypy funkcji
  42. void RysujSzescian(double a);
  43. void UstawParametryWidoku(int szer, int wys);
  44. void WyswietlObraz(void);
  45. void ObslugaKlawiatury(unsigned char klawisz, int x, int y);
  46.  
  47.  
  48. //////////////////////////////////////////////////////////////////////////////////////////
  49. // Funkcja rysujaca szescian o boku "a" w trybie GL_QUAD_STRIP.
  50. // Srodek szescianu znajduje się w punkcie (0,0,0).
  51. void RysujSzescian(double a)
  52. {
  53. // Pocztaek tworzenia ukladu wspolrzednych
  54. glBegin(GL_LINES);
  55.  
  56. // Os X
  57. glColor3f(1.0, 0.0, 0.0);
  58. glVertex3f(-50.0, 0.0, 0.0);
  59. glVertex3f(50.0, 0.0, 0.0);
  60.  
  61. // Os Y
  62. glColor3f(0.0, 1.0, 0.0);
  63. glVertex3f(0.0, -50.0, 0.0);
  64. glVertex3f(0.0, 50.0, 0.0);
  65.  
  66. // Os Z
  67. glColor3f(0.0, 0.0, 1.0);
  68. glVertex3f(0.0, 0.0, -50.0);
  69. glVertex3f(0.0, 0.0, 50.0);
  70.  
  71. // Koniec tworzenia ukladu wspolrzednych
  72. glEnd();
  73. //szescian:
  74. {/*// Sciany boczne
  75. glBegin(GL_QUAD_STRIP);
  76. glVertex3f(a / 2.0, a / 2.0, a / 2.0);
  77. glVertex3f(a / 2.0, -a / 2.0, a / 2.0);
  78. glVertex3f(a / 2.0, a / 2.0, -a / 2.0);
  79. glVertex3f(a / 2.0, -a / 2.0, -a / 2.0);
  80.  
  81. glVertex3f(-a / 2.0, a / 2.0, -a / 2.0);
  82. glVertex3f(-a / 2.0, -a / 2.0, -a / 2.0);
  83.  
  84. glVertex3f(-a / 2.0, a / 2.0, a / 2.0);
  85. glVertex3f(-a / 2.0, -a / 2.0, a / 2.0);
  86.  
  87. glVertex3f(a / 2.0, a / 2.0, a / 2.0);
  88. glVertex3f(a / 2.0, -a / 2.0, a / 2.0);
  89. glEnd();
  90.  
  91. // Gorna sciana
  92. glBegin(GL_QUAD_STRIP);
  93. glVertex3f(-a / 2.0, a / 2.0, a / 2.0);
  94. glVertex3f(a / 2.0, a / 2.0, a / 2.0);
  95. glVertex3f(-a / 2.0, a / 2.0, -a / 2.0);
  96. glVertex3f(a / 2.0, a / 2.0, -a / 2.0);
  97. glEnd();
  98.  
  99. // Dolna sciana
  100. glBegin(GL_QUAD_STRIP);
  101. glVertex3f(-a / 2.0, -a / 2.0, a / 2.0);
  102. glVertex3f(a / 2.0, -a / 2.0, a / 2.0);
  103. glVertex3f(-a / 2.0, -a / 2.0, -a / 2.0);
  104. glVertex3f(a / 2.0, -a / 2.0, -a / 2.0);
  105. glEnd();
  106. */}
  107. //////////
  108.  
  109. glColor3f(1.0, 0.0,0.0);
  110. //górna podstawa
  111. glBegin(GL_TRIANGLE_FAN);
  112. glVertex3f(0, h, 0);
  113. for (i = 0; i * 360 / n <= 360; i++) {
  114. glVertex3f(r * cos((float)(i * 360 / n) * 3.1415926535 / 180.0), h, r * sin((float)(i * 360 / n) * 3.1415926535 / 180.0));
  115. }
  116. glEnd();
  117. glBegin(GL_TRIANGLE_FAN);
  118. glVertex3f(0, 0, 0);
  119. for (i = 0; i * 360 / n <= 360; i++) {
  120. glVertex3f(R * cos((float)(i * 360 / n) * 3.1415926535 / 180.0), 0, R * sin((float)(i * 360 / n) * 3.1415926535 / 180.0));
  121. }
  122. glEnd();
  123.  
  124. glBegin(GL_QUAD_STRIP);
  125. for (i = 0; i * 360.0 / n <= 360.0; i++)
  126. {
  127. glVertex3f(R * cos((float)(i * 360 / n) * 3.1415926535 / 180.0), 0, R * sin((float)(i * 360 / n) * 3.1415926535 / 180.0));
  128. glVertex3f(r * cos((float)((i+1) * 360 / n) * 3.1415926535 / 180.0), h, r * sin((float)((i+1) * 360 / n) * 3.1415926535 / 180.0));
  129.  
  130.  
  131. }
  132. glEnd();
  133.  
  134. }
  135.  
  136. //////////////////////////////////////////////////////////////////////////////////////////
  137. // Funkcja ustawiajaca parametry rzutu perspektywicznego i rozmiary viewportu. Powinna
  138. // być wywolywana kazdorazowo po zmianie rozmiarow okna programu.
  139. void UstawParametryWidoku(int szer, int wys)
  140. {
  141. // Zapamietanie wielkosci widoku
  142. szerokoscOkna = szer;
  143. wysokoscOkna = wys;
  144.  
  145. // Ustawienie parametrow viewportu
  146. glViewport(0, 0, szerokoscOkna, wysokoscOkna);
  147.  
  148. // Przejscie w tryb modyfikacji macierzy rzutowania
  149. glMatrixMode(GL_PROJECTION);
  150. glLoadIdentity();
  151. gluPerspective(OBSERWATOR_FOV_Y, (float)szerokoscOkna/(float)wysokoscOkna, 1.0, 1000.0);
  152. }
  153.  
  154.  
  155. //////////////////////////////////////////////////////////////////////////////////////////
  156. // Funkcja wyswietlajaca pojedyncza klatke animacji
  157. void WyswietlObraz(void)
  158. {
  159. // Wyczyszczenie bufora koloru i bufora glebokosci
  160. glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  161.  
  162. // Przejscie w tryb modyfikacji macierzy przeksztalcen geometrycznych
  163. glMatrixMode(GL_MODELVIEW);
  164.  
  165. // Zastapienie aktywnej macierzy macierza jednostkowa
  166. glLoadIdentity();
  167.  
  168. // Ustalenie polozenia obserwatora
  169. glTranslatef(0, 0, -odl);
  170. glRotatef(rotObsX, 1, 0, 0);
  171. glRotatef(rotObsY, 0, 1, 0);
  172. glRotatef(rotObsZ, 0, 0, 1);
  173.  
  174. // Narysowanie szescianu
  175. RysujSzescian(bok);
  176.  
  177. // Przelaczenie buforow ramki
  178. glutSwapBuffers();
  179. }
  180.  
  181.  
  182. //////////////////////////////////////////////////////////////////////////////////////////
  183. // Funkcja obslugi klawiatury
  184. void ObslugaKlawiatury(unsigned char klawisz, int x, int y)
  185. {
  186. if (klawisz == '+')
  187. bok *= 1.2;
  188. else if (klawisz == '-')
  189. bok /= 1.2;
  190. else if (klawisz == 27)
  191. exit(0);
  192. else if ((klawisz == 'a' || klawisz == 'A')&&(n<nMax))
  193. n++;
  194. else if ((klawisz == 'z' || klawisz == 'Z')&&(n>nMin))
  195. n--;
  196. }
  197. void ObslugaKlawiszySpecjalnych(int klawisz, int x, int y)
  198. {
  199. switch (klawisz)
  200. {
  201. case GLUT_KEY_UP:
  202. rotObsX = rotObsX + 1.0;
  203. break;
  204.  
  205. case GLUT_KEY_DOWN:
  206. rotObsX = rotObsX - 1.0;
  207. break;
  208.  
  209. case GLUT_KEY_LEFT:
  210. rotObsY = rotObsY - 1.0;
  211. break;
  212.  
  213. case GLUT_KEY_RIGHT:
  214. rotObsY = rotObsY + 1.0;
  215. break;
  216. //rotacja OZ
  217. case GLUT_KEY_HOME:
  218. rotObsZ++;
  219. break;
  220. case GLUT_KEY_END:
  221. rotObsZ--;
  222. break;
  223. //Przybliżanie i oddalanie
  224. case GLUT_KEY_PAGE_UP:
  225. odl = odl < maxOdl ? odl + 1.0 : odl;
  226. break;
  227.  
  228. case GLUT_KEY_PAGE_DOWN:
  229. odl = odl > minOdl ? odl - 1.0 : odl;
  230. break;
  231. }
  232. }
  233.  
  234.  
  235. //////////////////////////////////////////////////////////////////////////////////////////
  236. // Glowna funkcja programu
  237. int main(int argc, char **argv)
  238. {
  239. // Zainicjowanie biblioteki GLUT
  240. glutInit(&argc, argv);
  241.  
  242. // Ustawienie trybu wyswietlania
  243. glutInitDisplayMode (GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
  244.  
  245. // Ustawienie polozenia dolenego lewego rogu okna
  246. glutInitWindowPosition(100, 100);
  247.  
  248. // Ustawienie rozmiarow okna
  249. glutInitWindowSize(szerokoscOkna, wysokoscOkna);
  250.  
  251. // Utworzenie okna
  252. glutCreateWindow("Stożek ścięty");
  253.  
  254. // Odblokowanie bufora glebokosci
  255. glEnable(GL_DEPTH_TEST);
  256.  
  257. // Ustawienie wartosci czyszczacej zawartosc bufora glebokosci
  258. glClearDepth(1000.0);
  259.  
  260. // Ustawienie koloru czyszczenia bufora ramki
  261. glClearColor (0.3f, 0.3f, 0.3f, 0.0f);
  262.  
  263. // Wlaczenie wyswietlania wielokatow w postaci obrysow (przydatne w celach diagnostycznych).
  264. glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  265.  
  266. // Zarejestrowanie funkcji (callback) odpowiedzialnej za
  267. glutDisplayFunc(WyswietlObraz);
  268.  
  269. // Zarejestrowanie funkcji (callback) wywolywanej za kazdym razem kiedy
  270. // zmieniane sa rozmiary okna
  271. glutReshapeFunc(UstawParametryWidoku);
  272.  
  273. // Zarejestrowanie funkcji wykonywanej gdy okno nie obsluguje
  274. // zadnych zadan
  275. glutIdleFunc(WyswietlObraz);
  276.  
  277. // Zarejestrowanie funkcji obslugi klawiatury
  278. glutKeyboardFunc(ObslugaKlawiatury);
  279.  
  280. // Zarejestrowanie funkcji obslugi klawiszy specjalnych
  281. glutSpecialFunc(ObslugaKlawiszySpecjalnych);
  282.  
  283. // Obsluga glownej petli programu (wywolywanie zarejestrowanych callbackow
  284. // w odpowiedzi na odbierane zdarzenia lub obsluga stanu bezczynnosci)
  285. glutMainLoop();
  286.  
  287. return 0;
  288. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement