SHARE
TWEET

Untitled

a guest Jan 14th, 2020 83 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
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top