Advertisement
Guest User

Untitled

a guest
Oct 18th, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.35 KB | None | 0 0
  1. /*************************************************************************************/
  2.  
  3. // Trochę bardziej skomplikowany program wykorzystujący funkcje biblioteki OpenGL
  4.  
  5. /*************************************************************************************/
  6. #include "pch.h"
  7. #include <windows.h>
  8. #include <time.h>
  9. #include <cstdlib>
  10. #include <ctime>
  11. #include <iostream>
  12.  
  13. #include <gl/gl.h>
  14.  
  15. #include <gl/glut.h>
  16.  
  17. /*************************************************************************************/
  18.  
  19.  
  20. // Funkcaja określająca, co ma być rysowane
  21. // (zawsze wywoływana, gdy trzeba przerysować scenę)
  22.  
  23. GLfloat width = 150.f;
  24. GLfloat disturb = 3.f;
  25. int deepLevel = 4;
  26.  
  27. //KWADRAT
  28. // 3 || 2 || 1
  29. //============
  30. // 4 ||   || 8
  31. //============
  32. // 5 || 6 || 7
  33.  
  34. void sierpinski(GLfloat x, GLfloat y, GLshort deep, GLfloat width)
  35. {
  36.     if (deep > 0)
  37.     {
  38.         width = width / 3; // Podzial kwadratu na 9 mniejszych
  39.         sierpinski(x, y, deep - 1, width); // POZ 1
  40.         sierpinski(x - width, y, deep - 1, width); // POZ 2
  41.         sierpinski(x - 2 * width, y, deep - 1, width); // POZ 3
  42.         sierpinski(x - 2 * width, y - width, deep - 1, width); // POZ 4
  43.         sierpinski(x - 2 * width, y - 2 * width, deep - 1, width); // POZ 5
  44.         sierpinski(x - width, y - 2 * width, deep - 1, width); // POZ 6
  45.         sierpinski(x, y - 2 * width, deep - 1, width); // POZ 7
  46.         sierpinski(x, y - width, deep - 1, width); // POZ 8
  47.        
  48.     }
  49.     else
  50.     {
  51.         glBegin(GL_POLYGON);
  52.         glColor3ub(std::rand() % 255 , std::rand() % 255 , std::rand() % 255 ); // losowy kolor (255,255,255) uByte
  53.         glVertex2f(x + (std::rand() % (int)disturb ) / (width), y + (std::rand() % (int)disturb ) / (width));
  54.         glColor3ub(std::rand() % 255 , std::rand() % 255 , std::rand() % 255 );  // losowy kolor
  55.         glVertex2f(x - width + (std::rand() % (int)disturb ) / (width), y + (std::rand() % (int)disturb ) / (width));
  56.         glColor3ub(std::rand() % 255 , std::rand() % 255 , std::rand() % 255 );  // losowy kolor
  57.         glVertex2f(x - width + (std::rand() % (int)disturb ) / (width), y - width + (std::rand() % (int)disturb ) / (width));
  58.         glColor3ub(std::rand() % 255 , std::rand() % 255 , std::rand() % 255 );  // losowy kolor
  59.         glVertex2f(x + (std::rand() % (int)disturb ) / (width), y - width + (std::rand() % (int)disturb ) / (width));
  60.         glEnd();
  61.     }
  62. }
  63.  
  64.  
  65. void RenderScene(void)
  66.  
  67. {
  68.     glClear(GL_COLOR_BUFFER_BIT);
  69.    
  70.     sierpinski(width / 2, width / 2, deepLevel, width);
  71.  
  72.     glFlush();
  73. }
  74.  
  75. /*************************************************************************************/
  76.  
  77. // Funkcja ustalająca stan renderowania
  78.  
  79.  
  80.  
  81. void MyInit(void)
  82.  
  83. {
  84.  
  85.     glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
  86.     // Kolor okna wnętrza okna - ustawiono na szary
  87.  
  88. }
  89.  
  90. /*************************************************************************************/
  91.  
  92. // Funkcja służąca do kontroli zachowania proporcji rysowanych obiektów
  93. // niezależnie od rozmiarów okna graficznego
  94.  
  95.  
  96.  
  97. void ChangeSize(GLsizei horizontal, GLsizei vertical)
  98.  
  99. // Parametry horizontal i vertical (szerokość i wysokość okna) są
  100. // przekazywane do funkcji za każdym razem, gdy zmieni się rozmiar okna
  101.  
  102. {
  103.  
  104.     GLfloat AspectRatio;
  105.  
  106.     // Deklaracja zmiennej AspectRatio określającej proporcję wymiarów okna
  107.  
  108.  
  109.  
  110.     if (vertical == 0)
  111.         // Zabezpieczenie pzred dzieleniem przez 0
  112.  
  113.         vertical = 1;
  114.  
  115.  
  116.     glViewport(0, 0, horizontal, vertical);
  117.     // Ustawienie wielkościokna okna urządzenia (Viewport)
  118.     // W tym przypadku od (0,0) do (horizontal, vertical)
  119.  
  120.  
  121.     glMatrixMode(GL_PROJECTION);
  122.     // Określenie układu współrzędnych obserwatora
  123.  
  124.     glLoadIdentity();
  125.     // Określenie przestrzeni ograniczającej
  126.  
  127.     AspectRatio = (GLfloat)horizontal / (GLfloat)vertical;
  128.     // Wyznaczenie współczynnika proporcji okna
  129.  
  130.     // Gdy okno na ekranie nie jest kwadratem wymagane jest
  131.     // określenie okna obserwatora.
  132.     // Pozwala to zachować właściwe proporcje rysowanego obiektu
  133.     // Do określenia okna obserwatora służy funkcja glOrtho(...)
  134.  
  135.  
  136.  
  137.     if (horizontal <= vertical)
  138.  
  139.         glOrtho(-100.0, 100.0, -100.0 / AspectRatio, 100.0 / AspectRatio, 1.0, -1.0);
  140.  
  141.     else
  142.  
  143.         glOrtho(-100.0*AspectRatio, 100.0*AspectRatio, -100.0, 100.0, 1.0, -1.0);
  144.  
  145.     glMatrixMode(GL_MODELVIEW);
  146.     // Określenie układu współrzędnych    
  147.  
  148.     glLoadIdentity();
  149.  
  150. }
  151.  
  152. /*************************************************************************************/
  153.  
  154. // Główny punkt wejścia programu. Program działa w trybie konsoli
  155.  
  156.  
  157.  
  158. void main(void)
  159.  
  160. {
  161.  
  162.     glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
  163.     // Ustawienie trybu wyświetlania
  164.     // GLUT_SINGLE - pojedynczy bufor wyświetlania
  165.     // GLUT_RGBA - model kolorów RGB
  166.  
  167.  
  168.  
  169.     glutCreateWindow("Drugi program w OpenGL");
  170.     // Utworzenie okna i określenie treści napisu w nagłówku okna
  171.  
  172.  
  173.     glutDisplayFunc(RenderScene);
  174.     // Określenie, że funkcja RenderScene będzie funkcją zwrotną (callback)
  175.     // Biblioteka GLUT będzie wywoływała tą funkcję za każdym razem, gdy
  176.     // trzeba będzie przerysować okno
  177.  
  178.  
  179.     glutReshapeFunc(ChangeSize);
  180.     // Dla aktualnego okna ustala funkcję zwrotną odpowiedzialną za
  181.     // zmiany rozmiaru okna
  182.  
  183.     MyInit();
  184.     // Funkcja MyInit (zdefiniowana powyżej) wykonuje wszelkie  
  185.     // inicjalizacje konieczneprzed przystąpieniem do renderowania
  186.  
  187.  
  188.     glutMainLoop();
  189.     // Funkcja uruchamia szkielet biblioteki GLUT
  190.  
  191. }
  192.  
  193. /*************************************************************************************/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement