Advertisement
Guest User

Untitled

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