Advertisement
Guest User

Untitled

a guest
Nov 21st, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.01 KB | None | 0 0
  1. /*************************************************************************************/
  2. // Szkielet programu do tworzenia modelu sceny 3-D z wizualizacją osi
  3. // układu współrzednych
  4. /*************************************************************************************/
  5. #define _USE_MATH_DEFINES
  6. #include "trojkat_sierpinskiego.h"
  7. #include <windows.h>
  8. #include <gl/gl.h>
  9. #include <glut.h>
  10. #include <cstdlib>
  11. #include <ctime>
  12. #include <cmath>
  13. #define M_PI 3.14
  14.  
  15. //Definicja typu point3 - punkt w przestrzeni 3D
  16. typedef float point3[3];
  17.  
  18. //Stala PI
  19. const float PI = 3.14159265;
  20. //Tablica na punkty
  21. point3 **pointsTab;
  22. //Tablica na kolory punktow
  23. point3 **pointsRGB;
  24.  
  25. static GLfloat viewer[] = { 0.0, 0.0, 10.0 };
  26. // inicjalizacja położenia obserwatora
  27. int S = 25; //zmienne to zageszczania wykresu lub rozredzania
  28.  
  29.  
  30. static GLfloat fi = 0.0; // kąty obrotu, elewacja i azymut
  31. static GLfloat pix2angle_x, // przelicznik pikseli na stopnie
  32. pix2angle_y;
  33. static GLint status = 0; // stan klawiszy myszy
  34. // 0 - nie naciśnięto żadnego klawisza
  35. // 1 - naciśnięty został lewy klawisz, 2 - prawy
  36. static int x_pos_old = 0, // poprzednia pozycja kursora myszy
  37. y_pos_old = 0;
  38. static int delta_x = 0, // różnica pomiędzy pozycją bieżącą
  39. delta_y = 0; // i poprzednią kursora myszy
  40. static GLfloat R = 30.0;
  41. typedef float point3[3];
  42. typedef float point2[2];
  43. point2 tab2D[10000];
  44. point3 tab[7][10000];
  45. int N = 20;
  46. static GLfloat zoom = 0.0;
  47. bool move = true;
  48. static GLfloat theta = 0;
  49. float verLength = 1.0; //Dlugosc boku kwadratu
  50. float viewerR = 10.0; //Promien sfery obserwatora
  51.  
  52. /*************************************************************************************/
  53. // Funkcja rysująca osie układu współrzędnych
  54.  
  55. void Axes(void) {
  56. // początek i koniec obrazu osi x
  57. point3 x_min = { -5.0, 0.0, 0.0 };
  58. point3 x_max = { 5.0, 0.0, 0.0 };
  59.  
  60. // początek i koniec obrazu osi y
  61. point3 y_min = { 0.0, -5.0, 0.0 };
  62. point3 y_max = { 0.0, 5.0, 0.0 };
  63.  
  64. // początek i koniec obrazu osi y
  65. point3 z_min = { 0.0, 0.0, -5.0 };
  66. point3 z_max = { 0.0, 0.0, 5.0 };
  67.  
  68. glColor3f(1.0f, 0.0f, 0.0f); // kolor rysowania osi - czerwony
  69. glBegin(GL_LINES); // rysowanie osi x
  70. glVertex3fv(x_min);
  71. glVertex3fv(x_max);
  72. glEnd();
  73.  
  74. glColor3f(0.0f, 1.0f, 0.0f); // kolor rysowania - zielony
  75. glBegin(GL_LINES); // rysowanie osi y
  76. glVertex3fv(y_min);
  77. glVertex3fv(y_max);
  78. glEnd();
  79.  
  80. glColor3f(0.0f, 0.0f, 1.0f); // kolor rysowania - niebieski
  81. glBegin(GL_LINES); // rysowanie osi z
  82. glVertex3fv(z_min);
  83. glVertex3fv(z_max);
  84. glEnd();
  85. }
  86.  
  87. //funkcja zwracająca wartość (y) funkcji weierstrassa w punkcie x
  88. float weierstrass(float a, float x)
  89. {
  90. float wynik = 0;
  91. for (int k = 1; k <= 20; k++)
  92. {
  93. wynik += sin(3.14*pow(k, a)*x) / (3.14*pow(k, a));
  94. }
  95. return wynik;
  96. }
  97.  
  98. // funkcja generująca współrzędne 2D (wykres funkcji weierstrassa)
  99. void generuj_tab2D(float a)
  100. {
  101. float x = 0;
  102. float s = 1.0/S;
  103. float mn = 10;
  104. for (int i = 0; i <S-1; i++)
  105. {
  106. tab2D[i][0] = x * mn;
  107. tab2D[i][1] = mn * weierstrass(a, x);
  108. x +=s ;
  109. }
  110. tab2D[S - 1][0] = x * mn;
  111. tab2D[S - 1][1] = 0;
  112. }
  113.  
  114. // funkcja obracająca wykres wokół OX (rzutowanie na 3D)
  115. void generuj_3D()
  116. {
  117. for (int j = 0; j < 7; j++)
  118. {
  119. for (int i = 0; i < S; i++)
  120. {
  121. tab[j][i][0] = tab2D[i][0];
  122. // generowanie współrzędnych dla kolejnych kątów obrotu
  123. // zaczynając od 0 skacząc co 30
  124. switch (j)
  125. {
  126. case 0:
  127. tab[j][i][1] = 0;
  128. tab[j][i][2] = (-1)*tab2D[i][1];
  129. break;
  130. case 1:
  131. tab[j][i][1] = tab2D[i][1] / 2;
  132. tab[j][i][2] = (-5)*tab2D[i][1] / 6;
  133. break;
  134. case 2:
  135. tab[j][i][1] = 5 * tab2D[i][1] / 6;
  136. tab[j][i][2] = (-1)*tab2D[i][1] / 2;
  137. break;
  138. case 3:
  139. tab[j][i][1] = tab2D[i][1];
  140. tab[j][i][2] = 0;
  141. break;
  142. case 4:
  143. tab[j][i][1] = 5 * tab2D[i][1] / 6;
  144. tab[j][i][2] = tab2D[i][1] / 2;
  145. break;
  146. case 5:
  147. tab[j][i][2] = 5 * tab2D[i][1] / 6;
  148. tab[j][i][1] = tab2D[i][1] / 2;
  149. break;
  150. case 6:
  151. tab[j][i][1] = 0;
  152. tab[j][i][2] = tab2D[i][1];
  153. break;
  154. }
  155. }
  156. }
  157. }
  158. //funckja tworzaca moedl gory
  159.  
  160. void drawMountain(float a)
  161. {
  162. generuj_tab2D(a);
  163. generuj_3D();
  164. for (int j = 0; j < 7; j++)
  165. {
  166. for (int i = 0; i < S-1; i++)
  167. {
  168. // rysowanie wykresu o konkretnym koncie (kąt zależny od j)
  169. glBegin(GL_LINES);
  170. glVertex3fv(tab[j][i]);
  171. glVertex3fv(tab[j][i + 1]);
  172. glEnd();
  173. //jeżeli nie jest to ostatni wykres to łączymy kolejne punkty (x) sąsiedniego (o większym koncie) wykresu
  174. if (j < 6)
  175. {
  176. glBegin(GL_LINES);
  177. glVertex3fv(tab[j][i]);
  178. glVertex3fv(tab[j + 1][i]);
  179. glEnd();
  180. }
  181. }
  182. }
  183. }
  184.  
  185.  
  186.  
  187. /*************************************************************************************/
  188. // Funkcja określająca co ma być rysowane (zawsze wywoływana gdy trzeba
  189. // przerysować scenę)
  190. void RenderScene(void)
  191. {
  192. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  193. // Czyszczenie okna aktualnym kolorem czyszczącym
  194. glLoadIdentity();
  195. // Czyszczenie macierzy bieżącej
  196.  
  197. if (status == 1) { // jeśli lewy klawisz myszy wciśnięty
  198. theta += delta_x * pix2angle_x; // modyfikacja kąta obrotu o kąt proporcjonalny
  199. fi += delta_y * pix2angle_y; // do różnicy położeń kursora myszy
  200.  
  201. if (theta >= 360.0)
  202. theta = 0.0;
  203. if (fi >= 360.0)
  204. fi = 0.0;
  205. }
  206. else if (status == 2) { // jeśli prawy klawisz myszy wciśnięty
  207. viewerR += 0.1* delta_y; // modyfikacja polozenia obserwatora(zoom)
  208. if (viewerR <= 6.0) { // ograniczenie zblizenia
  209. viewerR = 6.0;
  210. }
  211. if (viewerR >= 25.0) { // ograniczenie oddalenia
  212. viewerR = 25.0;
  213. }
  214. }
  215.  
  216. if (status == 2)
  217. {
  218. R += zoom;
  219. if (R<7)
  220. R = 7;
  221. if (R>30)
  222. R = 30;
  223. if (zoom>0)
  224. S -= 3;
  225. else
  226. S += 3;
  227. if (S > 100)
  228. S = 100;
  229. if (S < 25)
  230. S = 25;
  231. }
  232.  
  233. //Wspolrzedne obserwatora - wzor z ZSK
  234. viewer[0] = viewerR * cos(theta) * cos(fi);
  235. viewer[1] = viewerR * sin(fi);
  236. viewer[2] = viewerR * sin(theta) * cos(fi);
  237.  
  238. gluLookAt(viewer[0], viewer[1], viewer[2],
  239. 0.0, 0.0, 0.0, 0.0, cos(fi), 0.0);
  240. // Zdefiniowanie położenia obserwatora
  241.  
  242. Axes();
  243. // Narysowanie osi przy pomocy funkcji zdefiniowanej powyżej
  244.  
  245. // Tworzenie gory
  246. drawMountain(3);
  247.  
  248. glFlush();
  249. // Przekazanie poleceń rysujących do wykonania
  250.  
  251. glutSwapBuffers();
  252. }
  253. /*
  254. void RenderScene(void) {
  255. // Czyszczenie okna aktualnym kolorem czyszczącym
  256. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  257.  
  258. // Czyszczenie macierzy bieżącej
  259. glLoadIdentity();
  260.  
  261. // Narysowanie osi przy pomocy funkcji zdefiniowanej wyżej
  262. Axes();
  263.  
  264. // Rysowanie czajnika
  265. // leTeapot();
  266.  
  267. glRotatef(theta[0], 1.0, 0.0, 0.0);
  268. glRotatef(theta[1], 0.0, 1.0, 0.0);
  269. glRotatef(theta[2], 0.0, 0.0, 1.0);
  270.  
  271. // Tworzenie gory
  272. drawMountain(3);
  273.  
  274. // Przekazanie poleceń rysujących do wykonania
  275. glFlush();
  276.  
  277. glutSwapBuffers();
  278. }*/
  279.  
  280. /*************************************************************************************/
  281. // Funkcja ustalająca stan renderowania
  282. void MyInit(void) {
  283. // Kolor okna - czarny
  284. glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  285. }
  286.  
  287.  
  288. /*************************************************************************************/
  289. // Funkcja ma za zadanie utrzymanie stałych proporcji rysowanych
  290. // w przypadku zmiany rozmiarów okna.
  291. // Parametry vertical i horizontal (wysokość i szerokość okna) są
  292. // przekazywane do funkcji za każdym razem gdy zmieni się rozmiar okna.
  293. void ChangeSize(GLsizei horizontal, GLsizei vertical) {
  294. pix2angle_x = 360.0*0.1 / (float)horizontal; // przeliczenie pikseli na stopnie
  295. pix2angle_y = 360.0*0.1 / (float)vertical;
  296.  
  297. glMatrixMode(GL_PROJECTION);
  298. // Przełączenie macierzy bieżącej na macierz projekcji
  299.  
  300. glLoadIdentity();
  301. // Czyszcznie macierzy bieżącej
  302.  
  303. gluPerspective(70.0, 1.0, 1.0, 30.0);
  304. // Ustawienie parametrów dla rzutu perspektywicznego
  305.  
  306. if (horizontal <= vertical)
  307. glViewport(0, (vertical - horizontal) / 2, horizontal, horizontal);
  308. else
  309. glViewport((horizontal - vertical) / 2, 0, vertical, vertical);
  310. // Ustawienie wielkości okna okna widoku (viewport) w zależności
  311. // relacji pomiędzy wysokością i szerokością okna
  312.  
  313. glMatrixMode(GL_MODELVIEW);
  314. // Przełączenie macierzy bieżącej na macierz widoku modelu
  315.  
  316. glLoadIdentity();
  317. // Czyszczenie macierzy bieżącej
  318. }
  319.  
  320. // Funkcja "bada" stan myszy i ustawia wartosci odpowiednich zmiennych globalnych
  321. void Mouse(int btn, int state, int x, int y) {
  322. if (btn == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
  323. x_pos_old = x; // przypisanie aktualnie odczytanej pozycji kursora
  324. y_pos_old = y; // jako pozycji poprzedniej
  325. status = 1; // wciśnięty został lewy klawisz myszy
  326. }
  327. else if (btn == GLUT_RIGHT_BUTTON && state == GLUT_DOWN) {
  328. y_pos_old = y; // przypisanie aktualnie odczytanej pozycji kursora
  329. // jako pozycji poprzedniej
  330. status = 2; //wciśnięty został prawy klawisz myszy
  331. }
  332. else
  333. status = 0; // nie został wciśnięty żaden klawisz
  334. }
  335.  
  336. // Funkcja "monitoruje" polozenie kursora myszy i ustawia wartosci odpowiednich
  337. // zmiennych globalnych
  338. void Motion(GLsizei x, GLsizei y) {
  339. delta_x = x - x_pos_old; // obliczenie różnicy położenia kursora myszy
  340. x_pos_old = x; // podstawienie bieżacego położenia jako poprzednie
  341.  
  342. delta_y = y - y_pos_old; // obliczenie różnicy położenia kursora myszy
  343. y_pos_old = y; // podstawienie bieżacego położenia jako poprzednie
  344. if(status==2)
  345. S += 0.001;
  346. RenderScene(); // przerysowanie obrazu sceny
  347. }
  348.  
  349.  
  350. /*************************************************************************************/
  351. // Główny punkt wejścia programu. Program działa w trybie konsoli
  352. int main() {
  353. //Ziarno losowosci
  354. srand((unsigned)time(NULL));
  355.  
  356. //Dynamiczna alokacja tablicy punktow
  357. pointsTab = new point3*[N + 1];
  358. for (int i = 0; i < N + 1; i++) {
  359. pointsTab[i] = new point3[N + 1];
  360. }
  361.  
  362. glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  363.  
  364. glutInitWindowSize(300, 300);
  365.  
  366. glutCreateWindow("234938");
  367.  
  368. // Określenie, że funkcja RenderScene będzie funkcją zwrotną
  369. // (callback function). Bedzie ona wywoływana za każdym razem
  370. // gdy zajdzie potrzba przeryswania okna
  371. glutDisplayFunc(RenderScene);
  372.  
  373. // Dla aktualnego okna ustala funkcję zwrotną odpowiedzialną
  374. // zazmiany rozmiaru okna
  375. glutReshapeFunc(ChangeSize);
  376.  
  377. // Funkcja MyInit() (zdefiniowana powyżej) wykonuje wszelkie
  378. // inicjalizacje konieczne przed przystąpieniem do renderowania
  379. MyInit();
  380.  
  381. // Włączenie mechanizmu usuwania powierzchni niewidocznych
  382. glEnable(GL_DEPTH_TEST);
  383.  
  384. glutMouseFunc(Mouse);
  385. // Ustala funkcję zwrotną odpowiedzialną za badanie stanu myszy
  386.  
  387. glutMotionFunc(Motion);
  388. // Ustala funkcję zwrotną odpowiedzialną za badanie ruchu myszy
  389.  
  390.  
  391. // Funkcja uruchamia szkielet biblioteki GLUT
  392. glutMainLoop();
  393.  
  394. return 0;
  395. }
  396.  
  397. /*************************************************************************************/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement