SHARE
TWEET

Untitled

a guest Oct 10th, 2019 79 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // Lab1_1.cpp : This file contains the 'main' function. Program execution begins and ends there.
  2. //
  3.  
  4. /*************************************************************************************/
  5.  
  6. // Trochę bardziej skomplikowany program wykorzystujący funkcje biblioteki OpenGL
  7.  
  8. /*************************************************************************************/
  9. #include "pch.h"
  10.  
  11. #include <windows.h>
  12.  
  13. #include <gl/gl.h>
  14.  
  15. #include <gl/glut.h>
  16.  
  17. #include <cstdlib>
  18.  
  19. #include <ctime>
  20.  
  21. /*************************************************************************************/
  22.  
  23.  
  24. // Funkcaja określająca, co ma być rysowane
  25. // (zawsze wywoływana, gdy trzeba przerysować scenę)
  26.  
  27.  
  28.  
  29. typedef float point2[2];
  30.  
  31.  
  32. int carpet(point2 left_down, point2 right_down, int level) {
  33.  
  34.     if (level < 1) return 1;
  35.     float edge = right_down[0] - left_down[0];
  36.     float small_edge = edge / 3;
  37.     if (level == 1) {
  38.  
  39.         for (int i = 0; i < 3; i++) {
  40.  
  41.             for (int j = 0; j < 3; j++) {
  42.                 point2 new_left_down = { left_down[0] + (small_edge * i), left_down[1] + (small_edge * j) };
  43.                 point2 new_left_upper = { left_down[0] + (small_edge * i), left_down[1] + small_edge + (small_edge * j) };
  44.                 point2 new_right_upper = { left_down[0] + small_edge + (small_edge * i), left_down[1] + small_edge + (small_edge * j) };
  45.                 point2 new_right_down = { left_down[0] + small_edge + (small_edge * i), left_down[1] + (small_edge * j) };
  46.                 if ((i != 1) || (j != 1)) {
  47.                     glBegin(GL_POLYGON);
  48.                     glColor3f(static_cast <float>(rand()) / static_cast <float>(RAND_MAX), static_cast <float>(rand()) / static_cast <float>(RAND_MAX), static_cast <float>(rand()) / static_cast <float>(RAND_MAX));
  49.                     glVertex2fv(new_left_down);
  50.                     glColor3f(static_cast <float>(rand()) / static_cast <float>(RAND_MAX), static_cast <float>(rand()) / static_cast <float>(RAND_MAX), static_cast <float>(rand()) / static_cast <float>(RAND_MAX));
  51.                     glVertex2fv(new_left_upper);
  52.                     glColor3f(static_cast <float>(rand()) / static_cast <float>(RAND_MAX), static_cast <float>(rand()) / static_cast <float>(RAND_MAX), static_cast <float>(rand()) / static_cast <float>(RAND_MAX));
  53.                     glVertex2fv(new_right_upper);
  54.                     glColor3f(static_cast <float>(rand()) / static_cast <float>(RAND_MAX), static_cast <float>(rand()) / static_cast <float>(RAND_MAX), static_cast <float>(rand()) / static_cast <float>(RAND_MAX));
  55.                     glVertex2fv(new_right_down);
  56.                     glEnd();
  57.  
  58.                 }
  59.                 else {
  60.                     glBegin(GL_POLYGON);
  61.                     glVertex2fv(new_left_down);
  62.                     glVertex2fv(new_left_upper);
  63.                     glVertex2fv(new_right_upper);
  64.                     glVertex2fv(new_right_down);
  65.                     glEnd();
  66.                 }
  67.             }
  68.         }
  69.         return 0;
  70.     }
  71.     for (int i = 0; i < 3; i++) {
  72.  
  73.         for (int j = 0; j < 3; j++) {
  74.  
  75.             point2 new_left_down = { left_down[0] + (small_edge * i), left_down[1] + (small_edge * j) };
  76.             point2 new_left_upper = { left_down[0] + (small_edge * i), left_down[1] + small_edge + (small_edge * j) };
  77.             point2 new_right_upper = { left_down[0] + small_edge + (small_edge * i), left_down[1] + small_edge + (small_edge * j) };
  78.             point2 new_right_down = { left_down[0] + small_edge + (small_edge * i), left_down[1] + (small_edge * j) };
  79.  
  80.             if ((i != 1) || (j != 1)) {
  81.                 carpet(new_left_down, new_right_down, level - 1);
  82.             }
  83.             else {
  84.                 glBegin(GL_POLYGON);
  85.                 glColor3f(static_cast <float>(rand()) / static_cast <float>(RAND_MAX), static_cast <float>(rand()) / static_cast <float>(RAND_MAX), static_cast <float>(rand()) / static_cast <float>(RAND_MAX));
  86.                 glVertex2fv(new_left_down);
  87.                 glVertex2fv(new_left_upper);
  88.                 glVertex2fv(new_left_down);
  89.                 glVertex2fv(new_right_upper);
  90.                 glVertex2fv(new_left_down);
  91.                 glVertex2fv(new_right_down);
  92.                 glEnd();
  93.             }
  94.         }
  95.     }
  96.     return 0;
  97. }
  98.  
  99. void RenderScene(void)
  100.  
  101. {
  102.  
  103.     glClear(GL_COLOR_BUFFER_BIT);
  104.     // Czyszczenie okna aktualnym kolorem czyszczącym
  105.  
  106.  
  107.  
  108.     point2 left_down = { -70, -70 };
  109.     point2 right_down = { 70, -70 };
  110.  
  111.     int level = 5;
  112.  
  113.     carpet(left_down, right_down, level);
  114.  
  115.  
  116.     glFlush();
  117.     // Przekazanie poleceń rysujących do wykonania
  118.  
  119. }
  120.  
  121. /*************************************************************************************/
  122.  
  123. // Funkcja ustalająca stan renderowania
  124.  
  125.  
  126.  
  127. void MyInit(void)
  128.  
  129. {
  130.  
  131.     glClearColor(0.8f, 0.8f, 0.8f, 1.0f);
  132.  
  133. }
  134.  
  135. /*************************************************************************************/
  136.  
  137. // Funkcja służąca do kontroli zachowania proporcji rysowanych obiektów
  138. // niezależnie od rozmiarów okna graficznego
  139.  
  140.  
  141.  
  142. void ChangeSize(GLsizei horizontal, GLsizei vertical)
  143.  
  144. // Parametry horizontal i vertical (szerokość i wysokość okna) są
  145. // przekazywane do funkcji za każdym razem, gdy zmieni się rozmiar okna
  146.  
  147. {
  148.  
  149.     GLfloat AspectRatio;
  150.  
  151.     // Deklaracja zmiennej AspectRatio określającej proporcję wymiarów okna
  152.  
  153.  
  154.  
  155.     if (vertical == 0)
  156.         // Zabezpieczenie pzred dzieleniem przez 0
  157.  
  158.         vertical = 1;
  159.  
  160.     glViewport(0, 0, horizontal, vertical);
  161.     // Ustawienie wielkościokna okna urządzenia (Viewport)
  162.     // W tym przypadku od (0,0) do (horizontal, vertical)
  163.  
  164.     glMatrixMode(GL_PROJECTION);
  165.     // Określenie układu współrzędnych obserwatora
  166.  
  167.     glLoadIdentity();
  168.     // Określenie przestrzeni ograniczającej
  169.  
  170.     AspectRatio = (GLfloat)horizontal / (GLfloat)vertical;
  171.     // Wyznaczenie współczynnika proporcji okna
  172.  
  173.     // Gdy okno na ekranie nie jest kwadratem wymagane jest
  174.     // określenie okna obserwatora.
  175.     // Pozwala to zachować właściwe proporcje rysowanego obiektu
  176.     // Do określenia okna obserwatora służy funkcja glOrtho(...)
  177.  
  178.  
  179.  
  180.     if (horizontal <= vertical)
  181.  
  182.         glOrtho(-100.0, 100.0, -100.0 / AspectRatio, 100.0 / AspectRatio, 1.0, -1.0);
  183.  
  184.     else
  185.  
  186.         glOrtho(-100.0*AspectRatio, 100.0*AspectRatio, -100.0, 100.0, 1.0, -1.0);
  187.  
  188.     glMatrixMode(GL_MODELVIEW);
  189.     // Określenie układu współrzędnych    
  190.  
  191.     glLoadIdentity();
  192.  
  193. }
  194.  
  195. /*************************************************************************************/
  196.  
  197. // Główny right_uppernkt wejścia programu. Program działa w trybie konsoli
  198.  
  199.  
  200.  
  201. void main(void)
  202.  
  203. {
  204.  
  205.     srand(time(NULL));
  206.  
  207.     glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
  208.     // Ustawienie trybu wyświetlania
  209.     // GLUT_SINGLE - pojedynczy bufor wyświetlania
  210.     // GLUT_RGBA - model kolorów RGB
  211.  
  212.     glutInitWindowSize(729, 729);
  213.  
  214.     glutCreateWindow("Drugi program w OpenGL");
  215.     // Utworzenie okna i określenie treści napisu w nagłówku okna
  216.  
  217.     glutDisplayFunc(RenderScene);
  218.     // Określenie, że funkcja RenderScene będzie funkcją zwrotną (callback)
  219.     // Biblioteka GLUT będzie wywoływała tą funkcję za każdym razem, gdy
  220.     // trzeba będzie przerysować okno
  221.  
  222.  
  223.     glutReshapeFunc(ChangeSize);
  224.     // Dla aktualnego okna ustala funkcję zwrotną odpowiedzialną za
  225.     // zmiany rozmiaru okna
  226.  
  227.     MyInit();
  228.     // Funkcja MyInit (zdefiniowana powyżej) wykonuje wszelkie
  229.     // inicjalizacje konieczneprzed przystąpieniem do renderowania
  230.  
  231.  
  232.     glutMainLoop();
  233.     // Funkcja uruchamia szkielet biblioteki GLUT
  234.  
  235. }
  236.  
  237. /*************************************************************************************/
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