SHARE
TWEET

jprdl

a guest Jan 21st, 2020 60 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. #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. }
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