Advertisement
Guest User

Untitled

a guest
Dec 11th, 2018
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.38 KB | None | 0 0
  1.  //
  2. //  main.cpp
  3. //  Jajko
  4. //
  5. //  Created by Karolina Madej on 29/10/2018.
  6. //  Copyright © 2018 Karolina Madej. All rights reserved.
  7. //
  8.  
  9. #include <iostream>
  10. #include <OpenGL/gl.h>
  11. #include <OpenGl/glu.h>
  12. #include <GLUT/glut.h>
  13. #include <cstdlib>
  14. #include<cmath>
  15.  
  16. using namespace std;
  17. typedef float point3[3];
  18.  
  19. // Gęstość wykonań algorytmu
  20. const int N = 100;
  21. // Struktura przechowująca współrzędne i kolory danego punktu
  22. struct point
  23. {
  24.     double x;
  25.     double y;
  26.     double z;
  27.     float r;
  28.     float g;
  29.     float b;
  30. };
  31. // Macierz punktów
  32. point matrix[N][N];
  33.  
  34. // Definicja osi obrotu
  35. static GLfloat theta[] = {0.0, 0.0, 0.0};
  36.  
  37. // Funkcja generująca losową wartość typu float
  38. float randomFloat()
  39. {
  40.     return static_cast<float>(rand()) / static_cast<float>(RAND_MAX);
  41. }
  42.  
  43. // Funkcja zmieniająca wartości osi w celu wykonania obrotu
  44. void rotate()
  45. {
  46.     // Modyfikacja wartości theta dla każdej z osi
  47.     for (int i = 0; i < 3; i++)
  48.     {
  49.         theta[i] = theta[i] - 0.001;
  50.         if (theta[i] > 360.0)
  51.             theta[i] -= 360.0;
  52.     }
  53.    
  54.     // Odświerzenie widoku
  55.     glutPostRedisplay();
  56. }
  57.  
  58. // Generowanie punktów do macierzy
  59. void generateTable()
  60. {
  61.     for (int i = 0; i < N; ++i)
  62.     {
  63.         for (int j = 0; j < N; ++j)
  64.         {
  65.             // Zmienne wykorzystywane w równaniach
  66.             double u = (double)i / ((double)N - 1);
  67.             double v = (double)j / ((double)N - 1);
  68.             // Implementacja równań podanych w instrukcji
  69.            matrix[i][j].x = (-(90 * pow(u, 5)) + (225 * pow(u, 4)) - (270 * pow(u, 3)) + (180 * pow(u, 2)) - 45 * u) * cos(M_PI * v);
  70.             matrix[i][j].y = (160 * pow(u, 4)) - (320 * pow(u, 3)) + (160 * pow(u, 2));
  71.             matrix[i][j].z = (-(90 * pow(u, 5)) + (225 * pow(u, 4)) - (270 * pow(u, 3)) + (180 * pow(u, 2)) - 45 * u) * sin(M_PI * v);
  72.             // Losowe kolory dla punktu
  73.             matrix[i][j].r = randomFloat();
  74.             matrix[i][j].b = randomFloat();
  75.             matrix[i][j].g = randomFloat();
  76.            
  77.         }
  78.     }
  79. };
  80.  
  81. // Funkcja rysująca jajko
  82. void drawEgg()
  83. {
  84.     for (int i = 0; i < N; ++i)
  85.     {
  86.         for (int j = 0; j < N; ++j)
  87.         {
  88.             // Pierwszy trójkąt
  89.             glBegin(GL_TRIANGLES);
  90.             glColor3f(matrix[i][j].r, matrix[i][j].g, matrix[i][j].b);
  91.             glVertex3f((float)matrix[i][j].x, (float)matrix[i][j].y - 5.0f, (float)matrix[i][j].z);
  92.             glColor3f(matrix[(i + 1) % N][j].r, matrix[(i + 1) % N][j].g, matrix[(i + 1) % N][j].b);
  93.             glVertex3f((float)matrix[(i + 1) % N][j].x, (float)matrix[(i + 1) % N][j].y - 5.0f, (float)matrix[(i + 1) % N][j].z);
  94.             glColor3f(matrix[(i + 1) % N][(j + 1) % N].r, matrix[(i + 1) % N][(j + 1) % N].g, matrix[(i + 1) % N][(j + 1) % N].b);
  95.             glVertex3f((float)matrix[(i + 1) % N][(j + 1) % N].x, (float)matrix[(i + 1) % N][(j + 1) % N].y - 5.0f, (float)matrix[(i + 1) % N][(j + 1) % N].z);
  96.             glEnd();
  97.             // Drugi trójkąt
  98.             glBegin(GL_TRIANGLES);
  99.             glColor3f(matrix[i][j].r, matrix[i][j].g, matrix[i][j].b);
  100.             glVertex3f((float)matrix[i][j].x, (float)matrix[i][j].y - 5.0f, (float)matrix[i][j].z);
  101.             glColor3f(matrix[i][(j + 1) % N].r, matrix[i][(j + 1) % N].g, matrix[i][(j + 1) % N].b);
  102.             glVertex3f((float)matrix[i][(j + 1) % N].x, (float)matrix[i][(j + 1) % N].y - 5.0f, (float)matrix[i][(j + 1) % N].z);
  103.             glColor3f(matrix[(i + 1) % N][(j + 1) % N].x, matrix[(i + 1) % N][(j + 1) % N].g, matrix[(i + 1) % N][(j + 1) % N].b);
  104.             glVertex3f((float)matrix[(i + 1) % N][(j + 1) % N].x, (float)matrix[(i + 1) % N][(j + 1) % N].y - 5.0f, (float)matrix[(i + 1) % N][(j + 1) % N].z);
  105.             glEnd();
  106.         }
  107.     }
  108. }
  109.  
  110. void RenderScene(void)
  111. {
  112.     // Czyszczenie ekranu
  113.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  114.    
  115.     // Definicja obrotu wg kolejnych osi
  116.     glRotatef(theta[0], 1.0, 0.0, 0.0);
  117.     glRotatef(theta[1], 0.0, 1.0, 0.0);
  118.     glRotatef(theta[2], 0.0, 0.0, 1.0);
  119.    
  120.     // Narysowanie jajka
  121.     drawEgg();
  122.    
  123.     // zakończenie renderowania
  124.     glFlush();
  125.     glutSwapBuffers();
  126. }
  127.  
  128. // Obsługa zmiany rozmiaru okna
  129. void ChangeSize(GLsizei horizontal, GLsizei vertical)
  130. {
  131.     GLfloat AspectRatio;
  132.     if (vertical == 0)
  133.         vertical = 1;
  134.     glViewport(0, 0, horizontal, vertical);
  135.     glMatrixMode(GL_PROJECTION);
  136.     glLoadIdentity();
  137.     AspectRatio = (GLfloat)horizontal / (GLfloat)vertical;
  138.    
  139.     if (horizontal <= vertical)
  140.     {
  141.         glOrtho(-7.5, 7.5, -7.5 / AspectRatio, 7.5 / AspectRatio, 10.0, -10.0);
  142.     }
  143.     else
  144.     {
  145.         glOrtho(-7.5 * AspectRatio, 7.5 * AspectRatio, -7.5, 7.5, 10.0, -10.0);
  146.     }
  147.     glMatrixMode(GL_MODELVIEW);
  148.     glLoadIdentity();
  149. }
  150.  
  151. int main(int argc, char **argv)
  152. {
  153.     srand(time(NULL));
  154.     glutInit(&argc, argv);
  155.     generateTable();
  156.     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  157.     glutInitWindowSize(800, 600);
  158.     glutCreateWindow("Laboratorium 3.2");
  159.     glutDisplayFunc(RenderScene);
  160.     glutReshapeFunc(ChangeSize);
  161.     glutIdleFunc(rotate);
  162.    
  163.     glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  164.     glEnable(GL_DEPTH_TEST);
  165.    
  166.     glutMainLoop();
  167.     return 0;
  168. }
  169.  
  170.  
  171. /*int main(int argc, const char * argv[]) {
  172.     // insert code here...
  173.     std::cout << "Hello, World!\n";
  174.     return 0;
  175. }*/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement