Advertisement
CzarnyBarszcz

zadanie4

Mar 17th, 2021
920
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.68 KB | None | 0 0
  1. #include <windows.h>
  2. #include <iostream>
  3. #include <GL/glut.h>
  4. #include <stdlib.h>
  5. #include <math.h>
  6. #define GL_PI 3.1415f
  7. #include <GL/glut.h>
  8. #include <stdlib.h>
  9.  
  10. using namespace std;
  11.  
  12.  
  13.  
  14. // sta³a do obs³ugi menu podrêcznego
  15.  
  16. enum
  17. {
  18.     FULL_WINDOW,
  19.     ASPECT_1_1,
  20.     ORTO,
  21.     FRUST,
  22.     PERSP,
  23.     POWIERZCHNIA,
  24.     GLEBIA,
  25.     SZKIELET,
  26.     WYPELNIENIE,
  27.     EXIT // wyjœcie
  28. };
  29.  
  30.  
  31.  
  32. GLfloat x,y,angle; // Przechowują wartości współrzędnych i kąta
  33. int iPivot = 1;
  34. int rzut,skala,wybierz;
  35. bool iCull=false,iDepth=false,iOutline=false,iFill=false,iClock=false;
  36. double xx,xy,zx,yx,obrot_x=0.0,obrot_y=0.0,yy,zy;
  37. double dx=0.0,dy=0.0,dz=0.0;
  38. GLdouble fovy =90,eyex=1.0,eyey=1.0,eyez=1.0;
  39.  
  40.  
  41.  
  42.  
  43. // funkcja generuj¹ca scenê 3D
  44.  
  45.  
  46. void Display()
  47.  
  48. {
  49.     glClear(GL_COLOR_BUFFER_BIT);
  50.     glClearColor(0.0,0.0,0.0,0.0);
  51.     glMatrixMode( GL_MODELVIEW );
  52.     glLoadIdentity();
  53.     //gluLookAt(dx, dy, dz, eyex, eyey, eyez, 0.0, 1.0, 0.0);
  54.     gluLookAt(eyex, eyey, eyez, 0, 0, 0, 0.0, 1.0, 0.0);
  55.     glRotatef(obrot_x,xx,xy,zx);
  56.     glRotatef(obrot_y,xy,yy,zy);
  57.     glTranslatef (0.0f,0.0f,dx);
  58.     glColor3f(1.0,0.0,0.0);
  59.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  60.     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  61.  
  62.  
  63.  
  64.     // pocz¹tek definicji krawêdzi szeœcianu
  65.     glBegin(GL_TRIANGLE_FAN); // Rysowanie ściany bocznej stożka
  66.     glVertex3f(0.0f, 0.0f, 0.75f); // Czubek stożka jest wspólnym wierzchołkiem wszystkich trójkątów z wachlarza.
  67.     for(angle = 0.0f; angle < (2.0f*M_PI); angle += (M_PI/8.0f))
  68.         {
  69.             x = 0.5f*sin(angle); // Wyliczenie współrzędnych x i y kolejnego wierzchołka
  70.             y = 0.5f*cos(angle);
  71.             if((iPivot %2) == 0) // Wybieranie koloru - zielony lub czerwony
  72.                 glColor3f(0.0f, 1.0f, 0.0f);
  73.             else
  74.                 glColor3f(1.0f, 0.0f, 0.0f);
  75.             iPivot++; // Inkrementacja zmiennej określającej rodzaj koloru
  76.             // Definiowanie kolejnego wierzchołka w wachlarzu trójkątów
  77.             glVertex2f(x, y);
  78.         }
  79.     glEnd();
  80.  
  81.     glBegin(GL_TRIANGLE_FAN); // Rozpoczęcie rysowania kolejnego wachlarza trójkątów zakrywającego podstawę stożka
  82.     glVertex2f(0.0f, 0.0f); // Środek wachlarza znajduje się na początku układu współrzędnych
  83.     for(angle = 0.0f; angle < (2.0f*GL_PI); angle += (GL_PI/8.0f))
  84.         {
  85.             x = 0.50f*sin(angle); // Wyliczenie współrzędnych x i y kolejnego wierzchołka
  86.             y = 0.50f*cos(angle);
  87.             if((iPivot %2) == 0) // Wybieranie koloru - zielony lub czerwony
  88.                 glColor3f(0.1f, 0.1f, 0.1f);
  89.             else
  90.                 glColor4f(1.0f, 1.0f, 0.0f, 0.0f);
  91.             iPivot++; // Inkrementacja zmiennej określającej rodzaj koloru
  92.             glVertex2f(x, y); // Definiowanie kolejnego wierzchołka w wachlarzu trójkątów
  93.         }
  94.     glEnd(); // Zakończenie rysowania trójkątów podstawy stożka
  95.  
  96.     glBegin(GL_TRIANGLE_STRIP);
  97.         for(angle = 0.0f; angle < (2.0f*GL_PI); angle += (GL_PI/8.0f))
  98.         {
  99.             x = 0.10f*sin(angle); // Wyliczenie współrzędnych x i y kolejnego wierzchołka
  100.             y = 0.10f*cos(angle);
  101.             if((iPivot %2) == 0) // Wybieranie koloru - zielony lub czerwony
  102.                 glColor3f(0.1f, 0.1f, 0.1f);
  103.             else
  104.                 glColor4f(1.0f, 1.0f, 0.0f, 0.0f);
  105.             iPivot++; // Inkrementacja zmiennej określającej rodzaj koloru
  106.             glVertex3f(x, y,-0.5); // Definiowanie kolejnego wierzchołka w wachlarzu trójkątów
  107.             glVertex3f(x, y,0.2);
  108.         }
  109.     glEnd();
  110.     glBegin(GL_TRIANGLE_FAN); // Rozpoczęcie rysowania kolejnego wachlarza trójkątów zakrywającego podstawę stożka
  111.     glVertex3f(0.0f, 0.0f,0.2); // Środek wachlarza znajduje się na początku układu współrzędnych
  112.     for(angle = 0.0f; angle < (2.0f*GL_PI); angle += (GL_PI/8.0f))
  113.         {
  114.             x = 0.10f*sin(angle); // Wyliczenie współrzędnych x i y kolejnego wierzchołka
  115.             y = 0.10f*cos(angle);
  116.             if((iPivot %2) == 0) // Wybieranie koloru - zielony lub czerwony
  117.                 glColor3f(0.1f, 0.1f, 0.1f);
  118.             else
  119.                 glColor4f(1.0f, 1.0f, 0.0f, 0.0f);
  120.             iPivot++; // Inkrementacja zmiennej określającej rodzaj koloru
  121.             glVertex3f(x, y,0.2); // Definiowanie kolejnego wierzchołka w wachlarzu trójkątów
  122.         }
  123.     glEnd();
  124.      glBegin(GL_TRIANGLE_FAN); // Rozpoczęcie rysowania kolejnego wachlarza trójkątów zakrywającego podstawę stożka
  125.     glVertex3f(0.0f, 0.0f,-0.5); // Środek wachlarza znajduje się na początku układu współrzędnych
  126.     for(angle = 0.0f; angle < (2.0f*GL_PI); angle += (GL_PI/8.0f))
  127.         {
  128.             x = 0.10f*sin(angle); // Wyliczenie współrzędnych x i y kolejnego wierzchołka
  129.             y = 0.10f*cos(angle);
  130.             if((iPivot %2) == 0) // Wybieranie koloru - zielony lub czerwony
  131.                 glColor3f(0.1f, 0.1f, 0.1f);
  132.             else
  133.                 glColor4f(1.0f, 1.0f, 0.0f, 0.0f);
  134.             iPivot++; // Inkrementacja zmiennej określającej rodzaj koloru
  135.             glVertex3f(x, y,-0.5); // Definiowanie kolejnego wierzchołka w wachlarzu trójkątów
  136.         }
  137.     glEnd();
  138.     // skierowanie poleceñ do wykonania
  139.     glFlush();
  140.  
  141.     // zamiana buforów koloru
  142.     glutSwapBuffers();
  143. }
  144.  
  145. // zmiana wielkoœci okna
  146.  
  147. void Reshape(int width, int height)
  148. {
  149.     // obszar renderingu - ca³e okno
  150.     glViewport (0,0,width,height);
  151.     // wybór macierzy rzutowania
  152.     glMatrixMode (GL_PROJECTION);
  153.     // macierz rzutowania = macierz jednostkowa
  154.     glLoadIdentity ();
  155.     // ustawienie parametrów zakresu rzutni
  156.     GLdouble aspect = 1;
  157.     GLfloat zakres = 3.0f;
  158.     GLfloat blisko = 1.0f;
  159.     GLfloat daleko = 5.0;
  160.  
  161.     if (rzut==ORTO)
  162.     {
  163.         if (skala==ASPECT_1_1)
  164.         {
  165.             if (width < height && width > 0)
  166.                 glOrtho (-zakres,zakres,-zakres*height/width,zakres*height/width,-zakres,zakres);
  167.             else if (width >= height && height > 0)
  168.                 glOrtho (-zakres*width/height,zakres*width/height,-zakres,zakres,-zakres,zakres);
  169.         }
  170.         else
  171.             glOrtho (-zakres,zakres,-zakres,zakres,-zakres,zakres);
  172.     }
  173.  
  174.     if (rzut==FRUST)
  175.     {
  176.         if (skala==ASPECT_1_1)
  177.         {
  178.             if (width < height && width > 0)
  179.                 glFrustum (-zakres,zakres,-zakres*height/width,zakres*height/width,blisko,daleko);
  180.             else if (width >= height && height > 0)
  181.                 glFrustum (-zakres*width/height,zakres*width/height,-zakres,zakres,blisko,daleko);
  182.         }
  183.         else
  184.             glFrustum (-zakres,zakres,-zakres,zakres,blisko,daleko);
  185.     }
  186.     if (rzut==PERSP)
  187.     {
  188.         if (height > 0)
  189.             aspect = width/(GLdouble)height;
  190.         gluPerspective (45,aspect,blisko,daleko);
  191.     }
  192.     if (wybierz==POWIERZCHNIA)
  193.     {
  194.         if(iCull==true)
  195.         glEnable(GL_CULL_FACE);
  196.         else
  197.         glDisable(GL_CULL_FACE);
  198.     }
  199.  
  200.     if (wybierz==GLEBIA)
  201.     {
  202.         if(iDepth==true)
  203.         glEnable(GL_DEPTH_TEST);
  204.         else
  205.         glDisable(GL_DEPTH_TEST);
  206.     }
  207.     if (wybierz==SZKIELET)
  208.     {
  209.         if(iOutline==true)
  210.         glPolygonMode(GL_BACK,GL_LINE);
  211.         else
  212.         glPolygonMode(GL_BACK,GL_FILL);
  213.     }
  214.      if (wybierz==WYPELNIENIE)
  215.     {
  216.         if(iClock==true)
  217.         glShadeModel(GL_FLAT);
  218.         else
  219.         glShadeModel(GL_SMOOTH);
  220.     }
  221.  
  222.  
  223.  
  224.     Display ();
  225. }
  226.  
  227.  
  228.  
  229. // obs³uga menu podrêcznego
  230.  
  231. void Menu (int value)
  232. {
  233.     switch (value)
  234.     {
  235. // wyjœcie
  236.     case EXIT:
  237.         exit (0);
  238.     case POWIERZCHNIA:
  239.         wybierz=POWIERZCHNIA;
  240.         if(iCull==false)
  241.         {
  242.             iCull=true;
  243.             cout<<"iCull = TRUE"<<endl;
  244.         }
  245.         else
  246.         {
  247.           iCull=false;
  248.             cout<<"iCull = False"<<endl;
  249.         }
  250.  
  251.     break;
  252.     case GLEBIA:
  253.         wybierz=GLEBIA;
  254.         if(iDepth==false)
  255.         {
  256.             iDepth=true;
  257.             cout<<"iDepth = TRUE"<<endl;
  258.         }
  259.         else
  260.         {
  261.           iDepth=false;
  262.             cout<<"iDepth = False"<<endl;
  263.         }
  264.         break;
  265.     case SZKIELET:
  266.         wybierz=SZKIELET;
  267.         if(iOutline==false)
  268.         {
  269.             iOutline=true;
  270.             cout<<"iOutline = TRUE"<<endl;
  271.         }
  272.         else
  273.         {
  274.           iOutline=false;
  275.             cout<<"iOutline = False"<<endl;
  276.         }
  277.         break;
  278.     case WYPELNIENIE:
  279.         wybierz=WYPELNIENIE;
  280.         if(iClock==false)
  281.         {
  282.             iClock=true;
  283.             cout<<"iClock = TRUE"<<endl;
  284.         }
  285.         else
  286.         {
  287.           iClock=false;
  288.             cout<<"iClock = False"<<endl;
  289.         }
  290.     break;
  291.     }
  292. }
  293. void skal(int value)
  294. {
  295.     switch (value)
  296.     {
  297.         case FULL_WINDOW:
  298.         skala=FULL_WINDOW;
  299.         Reshape (glutGet (GLUT_WINDOW_WIDTH),glutGet (GLUT_WINDOW_HEIGHT));
  300.         break;
  301.         case ASPECT_1_1:
  302.         skala=ASPECT_1_1;
  303.         Reshape (glutGet (GLUT_WINDOW_WIDTH),glutGet (GLUT_WINDOW_HEIGHT));
  304.         break;
  305.     }
  306. }
  307.  
  308. void resh(int value)
  309. {
  310.     switch (value)
  311.     {
  312.     case ORTO:
  313.         rzut=ORTO;
  314.         Reshape (glutGet (GLUT_WINDOW_WIDTH),glutGet (GLUT_WINDOW_HEIGHT));
  315.         break;
  316.     case FRUST:
  317.         rzut=FRUST;
  318.         Reshape (glutGet (GLUT_WINDOW_WIDTH),glutGet (GLUT_WINDOW_HEIGHT));
  319.         break;
  320.     case PERSP:
  321.         rzut=PERSP;
  322.         Reshape (glutGet (GLUT_WINDOW_WIDTH),glutGet (GLUT_WINDOW_HEIGHT));
  323.         break;
  324.     }
  325. }
  326. void Funkcja_klawiatury (unsigned char key, int x, int y)
  327. {
  328.     if (key == 'a')
  329.     {
  330.         xx=0;
  331.         yx=1;
  332.         zx=0;
  333.         obrot_x=obrot_x+5;
  334.         cout<<"obrot_x= "<<obrot_x<<endl;
  335.     }
  336.     if (key == 'd')
  337.     {
  338.         xx=0;
  339.         yx=1;
  340.         zx=0;
  341.         obrot_x=obrot_x-5;
  342.         cout<<"obrot_x= "<<obrot_x<<endl;
  343.     }
  344.     if (key == 'w')
  345.     {
  346.         xy=1;
  347.         yy=0;
  348.         zy=0;
  349.         obrot_y=obrot_y+5;
  350.         cout<<"obrot_y= "<<obrot_y<<endl;
  351.     }
  352.     if (key == 's')
  353.     {
  354.         xy=1;
  355.         yy=0;
  356.         zy=0;
  357.         obrot_y=obrot_y-5;
  358.         cout<<"obrot_y= "<<obrot_y<<endl;
  359.     }
  360.  
  361.     Reshape (glutGet (GLUT_WINDOW_WIDTH),glutGet (GLUT_WINDOW_HEIGHT));
  362. }
  363. void specialKey(int klawisz, int x, int y)
  364. {
  365. cout << " klawisz" << klawisz << endl;
  366. if(klawisz == 101)
  367. {
  368. //dx+=0.1;
  369. eyey-=0.1;
  370. cout<<"dx="<<eyex<<endl;
  371. }
  372. if(klawisz == 103)
  373. {
  374. //dx-=0.1;
  375. eyey+=0.1;
  376. cout<<"dx="<<eyex<<endl;
  377. }
  378. if(klawisz == 100)
  379. {
  380. //dx+=0.1;
  381. eyex-=0.1;
  382. cout<<"dx="<<eyex<<endl;
  383. }
  384. if(klawisz == 102)
  385. {
  386. //dx-=0.1;
  387. eyex+=0.1;
  388. cout<<"dx="<<eyex<<endl;
  389. }
  390.  
  391. Reshape (glutGet (GLUT_WINDOW_WIDTH),glutGet (GLUT_WINDOW_HEIGHT));
  392. }
  393.  
  394.  
  395.     int main(int argc, char *argv[])
  396. {
  397.     rzut=ORTO;
  398.     cout<<"STROWANIE"<<endl;
  399.     cout<<"********************************************************"<<endl;
  400.     cout<<"ZMIANA POLOZENIA X - strzałka w lewo lub w prawo"<<endl;
  401.     cout<<"ZMIANA POLOZENIA Y - strzałka w dół lub gore"<<endl;
  402.     cout<<"********************************************************"<<endl;
  403.     cout<<"OBROT W OSI X - przyciski a i d"<<endl;
  404.     cout<<"OBROT W OSI Y - przyciski w i s"<<endl;
  405.     cout<<"********************************************************"<<endl;
  406.     cout<<"Po wybraniu opcji z menu wcisnij klawisz"<<endl;
  407.     cout<<"Klawisz 'D' jest zbugowany, przed jego wcisnieciem nalezy wcisnac klawisz 'W','S' lub 'A' "<<endl;
  408.  
  409.  
  410.  
  411.  
  412.     glutInit(&argc, argv);
  413.     glutInitWindowSize(640,480);
  414.     glutInitWindowPosition(10,10);
  415.     glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
  416.  
  417.     glutCreateWindow("Zadanie 4");
  418.  
  419.     glutReshapeFunc(Reshape);
  420.     glutDisplayFunc(Display);
  421.  
  422.     int sub1=glutCreateMenu(skal);
  423.         glutAddMenuEntry ("Rodzaj skalowania - cale okno",FULL_WINDOW);
  424.         glutAddMenuEntry ("Rodzaj skalowania - skala 1:1",ASPECT_1_1);
  425.     int sub2=glutCreateMenu(resh);
  426.     glutAddMenuEntry ("Rzutowanie ortogonalne", ORTO);
  427.     glutAddMenuEntry ("Rzutowanie frustum", FRUST);
  428.     glutAddMenuEntry ("Rzutowanie perspective", PERSP);
  429.     int mainmenu =glutCreateMenu(Menu);
  430.     glutAddSubMenu("Skalowanie",sub1);
  431.     glutAddSubMenu("Rzutowanie", sub2);
  432.     glutAddMenuEntry ("Ukrywanie powierzchni niewidocznych", POWIERZCHNIA);
  433.     glutAddMenuEntry ("Testowanie glebi", GLEBIA);
  434.     glutAddMenuEntry ("Rysowanie szkieletu", SZKIELET);
  435.     glutAddMenuEntry ("Wypelnienie obiektow", WYPELNIENIE);
  436.     glutAddMenuEntry ("Wyjscie",EXIT);
  437.     glutAttachMenu (GLUT_RIGHT_BUTTON);
  438.  
  439.     glutKeyboardFunc(Funkcja_klawiatury);
  440.     glutSpecialFunc(specialKey);
  441.     glutMainLoop();
  442.  
  443.     return EXIT_SUCCESS;
  444. }
  445.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement