Advertisement
Guest User

grafika

a guest
Oct 23rd, 2019
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.35 KB | None | 0 0
  1. #include <windows.h>
  2. #include <gl/gl.h>
  3. #include <gl/glut.h>
  4. #include <math.h>
  5. #include <cmath>
  6. #include <time.h>
  7. #include <vector>
  8.  
  9. using namespace std;
  10. typedef float point3[3];
  11.  const int N = 100;
  12. static int model = 0;
  13. static GLfloat theta[] = { 0.0, 0.0, 0.0 };
  14. static float colors_tab[N][N][3];
  15.  
  16. #define M_PI 3.14159265358979323846
  17.  
  18. //funkcja obracaj¹ca model, pobrana ze strony zsk
  19. void spinEgg()
  20. {
  21.  
  22.     theta[0] -= 0.5;
  23.     if (theta[0] > 360.0) theta[0] -= 360.0;
  24.  
  25.     theta[1] -= 0.5;
  26.     if (theta[1] > 360.0) theta[1] -= 360.0;
  27.  
  28.     theta[2] -= 0.5;
  29.     if (theta[2] > 360.0) theta[2] -= 360.0;
  30.  
  31.     glutPostRedisplay(); //odswiezenie zawartosci aktualnego okna
  32. }
  33.  
  34.  
  35. // Funkcja rysujaca osie ukladu wspólrzednych
  36. void Axes(void)
  37. {
  38.  
  39.     point3  x_min = { -5.0, 0.0, 0.0 };
  40.     point3  x_max = { 5.0, 0.0, 0.0 };
  41.     // poczatek i koniec obrazu osi x
  42.  
  43.     point3  y_min = { 0.0, -5.0, 0.0 };
  44.     point3  y_max = { 0.0, 5.0, 0.0 };
  45.     // poczatek i koniec obrazu osi y
  46.  
  47.     point3  z_min = { 0.0, 0.0, -5.0 };
  48.     point3  z_max = { 0.0, 0.0, 5.0 };
  49.     //  poczatek i koniec obrazu osi y
  50.  
  51.     glColor3f(1.0f, 0.0f, 0.0f);  // kolor rysowania osi - czerwony
  52.     glBegin(GL_LINES); // rysowanie osi x
  53.  
  54.     glVertex3fv(x_min);
  55.     glVertex3fv(x_max);
  56.  
  57.     glEnd();
  58.  
  59.     glColor3f(0.0f, 1.0f, 0.0f);  // kolor rysowania - zielony
  60.     glBegin(GL_LINES);  // rysowanie osi y
  61.  
  62.     glVertex3fv(y_min);
  63.     glVertex3fv(y_max);
  64.  
  65.     glEnd();
  66.  
  67.     glColor3f(0.0f, 0.0f, 1.0f);  // kolor rysowania - niebieski
  68.     glBegin(GL_LINES); // rysowanie osi z
  69.  
  70.     glVertex3fv(z_min);
  71.     glVertex3fv(z_max);
  72.  
  73.     glEnd();
  74.  
  75. }
  76.  
  77.  
  78.  
  79. void Egg() {
  80.     float tab[100][100][3];
  81.    
  82.     float u = 0.0;
  83.     float v = 0.0;
  84.  
  85.     for (int i = 0; i<N; i++)
  86.         for (int j = 0; j<N; j++)
  87.         {
  88.             //float u = (rand()%100)/100;
  89.             u = (float)i / (N - 1);
  90.             v = (float)j / (N - 1);
  91.        
  92.             tab[i][j][0] = (-90 * pow(u, 5) + 225 * pow(u, 4) - 270 * pow(u, 3) + 180 *pow(u, 2) - 45 * u)*cos(M_PI * v); // X(u,v)
  93.             tab[i][j][1] = 160 * pow(u, 4) - 320 * pow(u, 3) + 160 * pow(u, 2) - 5; //Y(u,v)
  94.             tab[i][j][2] = (-90 * pow(u, 5) + 225 * pow(u, 4) - 270 * pow(u, 3) + 180 * pow(u, 2) - 45 * u)*sin(M_PI * v); //Z(u,v)
  95.         }
  96.  
  97.  
  98.  
  99.     glColor3f(0.0f, 1.0f, 0.0f);  //zielony kolor jajka
  100.  
  101.  
  102.                            
  103.     if (model == 0)
  104.     {
  105.         glBegin(GL_POINTS);
  106.         for (int i = 0; i < N - 1; ++i) {
  107.             for (int j = 0; j < N - 1; ++j)
  108.             {
  109.                 glVertex3fv(tab[i][j]);
  110.             }
  111.         }
  112.         glEnd();
  113.     }
  114.  
  115.     //rysowanie linii
  116.     if (model == 1)
  117.     {
  118.        
  119.         for (int i = 0; i < N-1 ; i++) {
  120.             for (int j = 0; j < N-1 ; j++)//N-1 bo wychodzi poza ramy
  121.             {
  122.                 glBegin(GL_LINES);
  123.                 glVertex3fv(tab[i][j]);//x y z 3 wierzcholki
  124.                 glVertex3fv(tab[i][j + 1]);
  125.  
  126.                 glVertex3fv(tab[i][j]);
  127.                 glVertex3fv(tab[i + 1][j]);
  128.  
  129.                 glVertex3fv(tab[i + 1][j]);
  130.                 glVertex3fv(tab[i][j + 1]);
  131.  
  132.                 glVertex3fv(tab[i+1][j ]);
  133.                 glVertex3fv(tab[i + 1][j+1]);
  134.             }
  135.         }
  136.         glEnd();
  137.     }
  138.     //rysowanie kolorowych trójk¹tów
  139.     if (model == 2)
  140.     {
  141.         for (int i = 0; i < N-1 ; i++) {
  142.             for (int j = 0; j < N-1 ; j++)
  143.             {
  144.  
  145.                 glBegin(GL_TRIANGLES);
  146.  
  147.                 glColor3fv(colors_tab[i][j+1]);
  148.                 glVertex3fv(tab[i][j + 1]);
  149.  
  150.                 glColor3fv(colors_tab[i+1][j]);
  151.                 glVertex3fv(tab[i + 1][j]);
  152.  
  153.                 glColor3fv(colors_tab[i+1][j+1]);
  154.                 glVertex3fv(tab[i + 1][j + 1]);
  155.  
  156.  
  157.  
  158.                 glColor3fv(colors_tab[i+1][j]);
  159.                 glVertex3fv(tab[i + 1][j]);
  160.  
  161.  
  162.                 glColor3fv(colors_tab[i][j+1]);
  163.                 glVertex3fv(tab[i][j + 1]);
  164.  
  165.  
  166.                 glColor3fv(colors_tab[i][j]);
  167.                 glVertex3fv(tab[i][j]);
  168.  
  169.                 glEnd();
  170.                
  171.             }
  172.         }
  173.     }
  174.  
  175. }
  176.  
  177.  
  178. // Funkcja okreslajaca co ma byc rysowane (zawsze wywolywana gdy trzeba
  179. // przerysowac scene)
  180. void RenderScene(void)
  181. {
  182.  
  183.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  184.     // Czyszczenie okna aktualnym kolorem czyszczacym
  185.  
  186.     glLoadIdentity();
  187.     // Czyszczenie macierzy biezacej
  188.  
  189.     Axes();
  190.     // Narysowanie osi przy pomocy funkcji zdefiniowanej wyzej
  191.  
  192.     glRotatef(theta[0], 1.0, 0.0, 0.0);
  193.  
  194.     glRotatef(theta[1], 0.0, 1.0, 0.0);
  195.  
  196.     glRotatef(theta[2], 0.0, 0.0, 1.0);
  197.  
  198.     glRotated(45.0, 1.0, 0.0, 0.0);
  199.  
  200.  
  201.  
  202.     Egg();
  203.  
  204.     glFlush();
  205.     // Przekazanie polecen rysujacych do wykonania
  206.  
  207.  
  208.  
  209.     glutSwapBuffers();
  210.     //
  211.  
  212. }
  213.  
  214. //funkcja zwrotna do wyboru rodzaju modelu, pobrana ze strony zsk
  215. void keys(unsigned char key, int x, int y)
  216. {
  217.     if (key == 'p') model = 0;
  218.     if (key == 'w') model = 1;
  219.     if (key == 's') model = 2;
  220.  
  221.     RenderScene(); // przerysowanie obrazu sceny
  222. }
  223.  
  224.  
  225. // Funkcja ustalajaca stan renderowania
  226. void MyInit(void)
  227. {
  228.  
  229.     glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  230.     // Kolor czyszcacy (wypelnienia okna) ustawiono na czarny
  231.  
  232. }
  233.  
  234.  
  235. // Funkcja ma za zadanie utrzymanie stalych proporcji rysowanych
  236. // w przypadku zmiany rozmiarów okna.
  237. // Parametry vertical i horizontal (wysokosc i szerokosc okna) sa
  238. // przekazywane do funkcji za kazdym razem gdy zmieni sie rozmiar okna.
  239. void ChangeSize(GLsizei horizontal, GLsizei vertical)
  240. {
  241.  
  242.     GLfloat AspectRatio;
  243.     // Deklaracja zmiennej AspectRatio  okreslajacej proporcje
  244.     // wymiarów okna
  245.  
  246.     if (vertical == 0)  // Zabezpieczenie przed dzieleniem przez 0
  247.  
  248.         vertical = 1;
  249.  
  250.     glViewport(0, 0, horizontal, vertical);
  251.     // Ustawienie wielkosciokna okna widoku (viewport)
  252.     // W tym przypadku od (0,0) do (horizontal, vertical)  
  253.  
  254.     glMatrixMode(GL_PROJECTION);
  255.     // Przelaczenie macierzy biezacej na macierz projekcji
  256.  
  257.     glLoadIdentity();
  258.     // Czyszcznie macierzy biezacej            
  259.  
  260.     AspectRatio = (GLfloat)horizontal / (GLfloat)vertical;
  261.     // Wyznaczenie wspólczynnika  proporcji okna
  262.     // Gdy okno nie jest kwadratem wymagane jest okreslenie tak zwanej
  263.     // przestrzeni ograniczajacej pozwalajacej zachowac wlasciwe
  264.     // proporcje rysowanego obiektu.
  265.     // Do okreslenia przestrzeni ograniczjacej sluzy funkcja
  266.     // glOrtho(...)            
  267.  
  268.     if (horizontal <= vertical)
  269.  
  270.         glOrtho(-7.5, 7.5, -7.5 / AspectRatio, 7.5 / AspectRatio, 10.0, -10.0);
  271.  
  272.     else
  273.  
  274.         glOrtho(-7.5*AspectRatio, 7.5*AspectRatio, -7.5, 7.5, 10.0, -10.0);
  275.  
  276.     glMatrixMode(GL_MODELVIEW);
  277.     // Przelaczenie macierzy biezacej na macierz widoku modelu                                    
  278.  
  279.     glLoadIdentity();
  280.     // Czyszcenie macierzy biezacej
  281.  
  282. }
  283.  
  284. /*************************************************************************************/
  285.  
  286. float createRandomNumber()
  287. {
  288.     float randomNumber;
  289.     double const generateRandom = rand() % 10;
  290.  
  291.     randomNumber = generateRandom / 10;
  292.  
  293.     return randomNumber;
  294. }
  295. void createRandomColors() {
  296.     for (int i = 0; i < N; i++)
  297.     {
  298.         for (int j = 0; j < N; j++)
  299.         {
  300.    
  301.             for (int l = 0; l < 3; l++)
  302.             {
  303.                 colors_tab[i][j][l] = createRandomNumber();
  304.  
  305.             }
  306.  
  307.         }
  308.     }
  309. }
  310. void main(void)
  311. {
  312.     createRandomColors();
  313.  
  314.     glutIdleFunc(spinEgg);
  315.  
  316.     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  317.  
  318.     glutInitWindowSize(300, 300);
  319.  
  320.     glutCreateWindow("JAJO");
  321.  
  322.     glutDisplayFunc(RenderScene);
  323.  
  324.     glutKeyboardFunc(keys);
  325.     // Okreslenie, ze funkcja RenderScene bedzie funkcja zwrotna
  326.     // (callback function).  Bedzie ona wywolywana za kazdym razem
  327.     // gdy zajdzie potrzba przeryswania okna
  328.  
  329.     glutReshapeFunc(ChangeSize);
  330.     // Dla aktualnego okna ustala funkcje zwrotna odpowiedzialna
  331.     // zazmiany rozmiaru okna      
  332.  
  333.     MyInit();
  334.     // Funkcja MyInit() (zdefiniowana powyzej) wykonuje wszelkie
  335.     // inicjalizacje konieczne  przed przystapieniem do renderowania
  336.  
  337.     glEnable(GL_DEPTH_TEST);
  338.     // Wlaczenie mechanizmu usuwania powierzchni niewidocznych
  339.  
  340.     glutMainLoop();
  341.     // Funkcja uruchamia szkielet biblioteki GLUT
  342.  
  343.  
  344. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement