Guest User

Untitled

a guest
Oct 10th, 2019
81
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