Guest User

Untitled

a guest
Jan 14th, 2020
97
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //////////////////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Program wyswietlajacy szescian w rzucie perspektywicznym. Dlugosc boku szescianu
  4. // moze byc interaktywnie zmieniana za pomoca klwiszy '+' i '-'.
  5. //
  6. //////////////////////////////////////////////////////////////////////////////////////////
  7.  
  8.  
  9. //ZESTAW 4, ZADANIE 4 - Indywidualne
  10. #include <GL/glut.h>
  11. #include <math.h>
  12.  
  13. // Definicja stalych
  14. #define DLUGOSC_BOKU 10.0
  15. #define OBSERWATOR_ODLEGLOSC 20.0
  16. #define OBSERWATOR_OBROT_X 20.0
  17. #define OBSERWATOR_OBROT_Y 20.0
  18. #define OBSERWATOR_FOV_Y 30.0
  19.  
  20. int zmienna = 5;
  21. int zmienna2 = 5;
  22.  
  23. // Zmienne globalne
  24. double bok = DLUGOSC_BOKU; // Dlugosc boku szescianu
  25. int szerokoscOkna = 800;
  26. int wysokoscOkna = 600;
  27. GLfloat minOdl = -10.0;
  28. GLfloat maxOdl = -200.0;
  29. GLfloat obsOdl = -100.0;
  30. GLfloat rotObsY = 40.0;
  31. GLfloat rotObsX = 40.0;
  32. GLfloat rotObsZ = 0.0;
  33.  
  34. // Prototypy funkcji
  35. void RysujSzescian(int N);
  36. void UstawParametryWidoku(int szer, int wys);
  37. void WyswietlObraz(void);
  38. void ObslugaKlawiatury(unsigned char klawisz, int x, int y);
  39. void ObslugaKlawiszySpecjalnych(int klawisz, int x, int y);
  40.  
  41. //////////////////////////////////////////////////////////////////////////////////////////
  42. // Funkcja rysujaca szescian o boku "a" w trybie GL_QUAD_STRIP.
  43. // Srodek szescianu znajduje się w punkcie (0,0,0).
  44. void stozek(float R, float r, float y, float h, int n)
  45. {
  46. float alfa;
  47. int i;
  48. float x;
  49. float z;
  50.  
  51. glBegin(GL_QUAD_STRIP);
  52.  
  53. alfa = 360.0/n;
  54. for(i=0;i<=n;i++)
  55. {
  56. x = cos(0.0174532925f*i*alfa);
  57. z = sin(0.0174532925f*i*alfa);
  58.  
  59. glVertex3f(x*R,y+0,z*R);
  60. glVertex3f(x*r,y+h,z*r);
  61. }
  62.  
  63.  
  64. x = cos(0.0);
  65. z = sin(0.0);
  66.  
  67. glVertex3f(x*R,y+0,z*R);
  68. glVertex3f(x*r,y+h,z*r);
  69.  
  70. glEnd();
  71. }
  72.  
  73. void powBocznaWalca(float R, float r, float y, float h, int n)
  74. {
  75. float alfa;
  76. int i;
  77. float x;
  78. float z;
  79. glColor3f(0,1,1);
  80. glBegin(GL_QUAD_STRIP);
  81.  
  82. alfa = 360.0/n;
  83. for(i=0;i<=n;i++)
  84. {
  85. x = cos(0.0174532925f*i*alfa);
  86. z = sin(0.0174532925f*i*alfa);
  87.  
  88. glVertex3f(x*R,y+0,z*R);
  89. glVertex3f(x*r,y+h,z*r);
  90. }
  91.  
  92.  
  93. x = cos(0.0);
  94. z = sin(0.0);
  95.  
  96. glVertex3f(x*R,y+0,z*R);
  97. glVertex3f(x*r,y+h,z*r);
  98.  
  99. glEnd();
  100. }
  101.  
  102. void RysujKolo(float R, float y, int n)
  103. {
  104. float alfa;
  105. int i;
  106. float x;
  107. float z;
  108.  
  109. glBegin(GL_TRIANGLE_FAN);
  110. glColor3f(1,0.4,1);
  111. glVertex3f(0,y,0);
  112.  
  113. alfa = 360.0f/n;
  114. for(i=0;i<=n;i++)
  115. {
  116. x = cos(0.0174532925f*i*alfa);
  117. z = sin(0.0174532925f*i*alfa);
  118.  
  119. glVertex3f(x*R,y+0,z*R);
  120. }
  121.  
  122.  
  123. x = cos(0.0);
  124. z = sin(0.0);
  125.  
  126. glVertex3f(x*R,y+0,z*R);
  127.  
  128. glEnd();
  129. }
  130.  
  131. void RysujStozekZPodzialami(float R, float r, float h, int n, int m)
  132. {
  133. int i;
  134. float dR,dr,dh, y, tmp1, tmp2;
  135. dh = h/m;
  136. for(i=0;i<m;i++)
  137. {
  138. y = dh*i;
  139. tmp1 = y/h;
  140. tmp2 = (y+dh)/h;
  141. dR = R + (r-R)*tmp1;
  142. dr = R + (r-R)*tmp2;
  143. stozek(dR, dr, y, dh, n);
  144. }
  145. RysujKolo(R, 0, n);
  146. RysujKolo(r, h, n);
  147. }
  148.  
  149. void rysowanieWalca(float R, float r, float h, int n, int m){
  150. int i;
  151. float dR,dr,dh, y, tmp1, tmp2;
  152. dh = h/m;
  153. for(i=0;i<m;i++)
  154. {
  155. y = dh*i;
  156. tmp1 = y/h;
  157. tmp2 = (y+dh)/h;
  158. dR = R + (r-R)*tmp1;
  159. dr = R + (r-R)*tmp2;
  160. powBocznaWalca(dR, dr, y, dh, n);
  161. }
  162. RysujKolo(R, 0, n);
  163. RysujKolo(r, h, n);
  164.  
  165. }
  166.  
  167. void RysujSzescian()
  168. {
  169.  
  170. // Pocztaek tworzenia ukladu wspolrzednych
  171. glBegin(GL_LINES);
  172.  
  173. // Os X
  174. glColor3f(1.0, 0.0, 0.0);
  175.  
  176. glVertex3f(-25.0, 0.0, 0.0);
  177. glVertex3f(25.0, 0.0, 0.0);
  178.  
  179. // Os Y
  180. glColor3f(0.0,1.0,0.0);
  181. glVertex3f(0.0, -25.0, 0.0);
  182. glVertex3f(0.0, 25.0, 0.0);
  183.  
  184. // Os Z
  185. glColor3f(0.0,0.0,1.0);
  186. glVertex3f(0.0, 0.0, -25.0);
  187. glVertex3f(0.0, 0.0, 25.0);
  188.  
  189. // Koniec tworzenia ukladu wspolrzednych
  190. glEnd();
  191.  
  192.  
  193.  
  194. }
  195.  
  196. //////////////////////////////////////////////////////////////////////////////////////////
  197. // Funkcja ustawiajaca parametry rzutu perspektywicznego i rozmiary viewportu. Powinna
  198. // być wywolywana kazdorazowo po zmianie rozmiarow okna programu.
  199. void UstawParametryWidoku(int szer, int wys)
  200. {
  201. // Zapamietanie wielkosci widoku
  202. szerokoscOkna = szer;
  203. wysokoscOkna = wys;
  204.  
  205. // Ustawienie parametrow viewportu
  206. glViewport(0, 0, szerokoscOkna, wysokoscOkna);
  207.  
  208. // Przejscie w tryb modyfikacji macierzy rzutowania
  209. glMatrixMode(GL_PROJECTION);
  210. glLoadIdentity();
  211. gluPerspective(OBSERWATOR_FOV_Y, (float)szerokoscOkna/(float)wysokoscOkna, 1.0, 1000.0);
  212. }
  213.  
  214.  
  215. //////////////////////////////////////////////////////////////////////////////////////////
  216. // Funkcja wyswietlajaca pojedyncza klatke animacji
  217. void WyswietlObraz(void)
  218. {
  219. // Wyczyszczenie bufora koloru i bufora glebokosci
  220. glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  221.  
  222. // Przejscie w tryb modyfikacji macierzy przeksztalcen geometrycznych
  223. glMatrixMode(GL_MODELVIEW);
  224.  
  225. // Zastapienie aktywnej macierzy macierza jednostkowa
  226. glLoadIdentity();
  227.  
  228. // Ustalenie polozenia obserwatora
  229. glTranslatef(0, 0, obsOdl);
  230. glRotatef(rotObsX, 1, 0, 0);
  231. glRotatef(rotObsY,0,1,0);
  232. glRotatef(rotObsZ, 0, 0, 1);
  233. // Narysowanie szescianu
  234. RysujSzescian();
  235. glColor3f(1.0, 1.0, 1.0);
  236. //stozek(20, 5, 20, zmienna, zmienna2);
  237. rysowanieWalca(1,1,3,zmienna, zmienna2);
  238. // Przelaczenie buforow ramki
  239. glutSwapBuffers();
  240. }
  241.  
  242.  
  243. //////////////////////////////////////////////////////////////////////////////////////////
  244. // Funkcja obslugi klawiatury
  245. void ObslugaKlawiatury(unsigned char klawisz, int x, int y)
  246. {
  247. switch(klawisz)
  248. {
  249.  
  250. case '+':
  251. case '=':
  252. if (obsOdl < minOdl)
  253. obsOdl++;
  254. break;
  255.  
  256. case '-':
  257. case '_':
  258. if (obsOdl > maxOdl)
  259. obsOdl--;
  260. break;
  261.  
  262. case 'z':
  263. rotObsZ++;
  264. break;
  265.  
  266. case 'x':
  267. rotObsZ--;
  268. break;
  269.  
  270. case '1':
  271. zmienna = (zmienna>4) ? zmienna-1 : zmienna;
  272. break;
  273. case '2':
  274. zmienna = (zmienna<64) ? zmienna+1 : zmienna;
  275. break;
  276. case '3':
  277. zmienna2 = (zmienna2>4) ? zmienna2-1 : zmienna2;
  278. break;
  279. case '4':
  280. zmienna2 = (zmienna2<64) ? zmienna2+1 : zmienna2;
  281. break;
  282. }
  283. }
  284.  
  285. void ObslugaKlawiszySpecjalnych(int klawisz, int x, int y)
  286. {
  287. switch(klawisz)
  288. {
  289. case GLUT_KEY_UP:
  290. rotObsX--;
  291. break;
  292.  
  293. case GLUT_KEY_DOWN:
  294. rotObsX++;
  295. break;
  296.  
  297. case GLUT_KEY_LEFT:
  298. rotObsY--;
  299. break;
  300.  
  301. case GLUT_KEY_RIGHT:
  302. rotObsY++;
  303. break;
  304.  
  305.  
  306. }
  307. }
  308.  
  309. //////////////////////////////////////////////////////////////////////////////////////////
  310. // Glowna funkcja programu
  311. int main(int argc, char **argv)
  312. {
  313.  
  314. // Zainicjowanie biblioteki GLUT
  315. glutInit(&argc, argv);
  316.  
  317. // Ustawienie trybu wyswietlania
  318. glutInitDisplayMode (GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
  319.  
  320. // Ustawienie polozenia dolenego lewego rogu okna
  321. glutInitWindowPosition(100, 100);
  322.  
  323. // Ustawienie rozmiarow okna
  324. glutInitWindowSize(szerokoscOkna, wysokoscOkna);
  325.  
  326. // Utworzenie okna
  327. glutCreateWindow("Walec");
  328.  
  329. // Odblokowanie bufora glebokosci
  330. glEnable(GL_DEPTH_TEST);
  331.  
  332. // Ustawienie wartosci czyszczacej zawartosc bufora glebokosci
  333. glClearDepth(1000.0);
  334.  
  335. // Ustawienie koloru czyszczenia bufora ramki
  336. glClearColor (0.0f, 0.0f, 0.3f, 0.0f);
  337.  
  338. // Wlaczenie wyswietlania wielokatow w postaci obrysow (przydatne w celach diagnostycznych).
  339. glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  340.  
  341. // Zarejestrowanie funkcji (callback) odpowiedzialnej za
  342. glutDisplayFunc(WyswietlObraz);
  343.  
  344. // Zarejestrowanie funkcji (callback) wywolywanej za kazdym razem kiedy
  345. // zmieniane sa rozmiary okna
  346. glutReshapeFunc(UstawParametryWidoku);
  347.  
  348. // Zarejestrowanie funkcji wykonywanej gdy okno nie obsluguje
  349. // zadnych zadan
  350. glutIdleFunc(WyswietlObraz);
  351.  
  352. // Zarejestrowanie funkcji obslugi klawiatury
  353. glutKeyboardFunc(ObslugaKlawiatury);
  354.  
  355. //DOPISANE
  356. glutSpecialFunc(ObslugaKlawiszySpecjalnych);
  357.  
  358. // Obsluga glownej petli programu (wywolywanie zarejestrowanych callbackow
  359. // w odpowiedzi na odbierane zdarzenia lub obsluga stanu bezczynnosci)
  360. glutMainLoop();
  361.  
  362. return 0;
  363. }
RAW Paste Data