Advertisement
Guest User

Untitled

a guest
Jan 26th, 2020
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.97 KB | None | 0 0
  1. // Jajko.cpp : This file contains the 'main' function. Program execution begins and ends there.
  2. //
  3.  
  4. #include "pch.h"
  5. #include <iostream>
  6. #include <windows.h>
  7. #include <gl/gl.h>
  8. #include <gl/glut.h>
  9. #include <math.h>
  10.  
  11.  
  12. typedef float point3[3];
  13.  
  14. # define PI_NUMBER 3.14159265358979323846
  15.  
  16. // Wyliczenie współrzędnej X
  17. float getX(float u, float v)
  18. {
  19. float result =(-90 * pow(u, 5) + 225 * pow(u, 4) - 270 * pow(u, 3) + 180 * pow(u, 2) - 45 * u) * cos(PI_NUMBER * v);
  20. return result;
  21. }
  22.  
  23. // Wyliczenie współrzędnej Y
  24. float getY(float u, float v)
  25. {
  26. float result = 160 * pow(u, 4) - 320 * pow(u, 3) + 160 * pow(u, 2);
  27. //return result;
  28. return (result - 5);
  29. }
  30.  
  31. // Wyliczenie współrzędnej Z
  32. float getZ(float u, float v)
  33. {
  34. float result = (-90 * pow(u, 5) + 225 * pow(u, 4) - 270 * pow(u, 3) + 180 * pow(u, 2) - 45 * u) * sin(PI_NUMBER * v);
  35. return result;
  36. }
  37.  
  38. // Liczba na ile punktow dzielimy bok dziedziny
  39. int N = 50;
  40.  
  41. // Tablica punktów jajka
  42. float ***calculatedPoints;
  43. // Użyte kolory
  44. int ***usedColors;
  45.  
  46. int model = 1; // 1- punkty, 2- siatka, 3 - wypełnione trójkąty
  47.  
  48. static GLfloat theta[] = { 0.0, 0.0, 0.0 }; // trzy kąty obrotu
  49.  
  50.  
  51. // Obsługa klawiatury
  52. void keys(unsigned char key, int x, int y)
  53. {
  54. if (key == 'p') model = 1;
  55. if (key == 'w') model = 2;
  56. if (key == 's') model = 3;
  57. }
  58.  
  59.  
  60.  
  61. void spinEgg()
  62. {
  63. theta[0] -= 0.5;
  64. if (theta[0] > 360.0) theta[0] -= 360.0;
  65.  
  66. theta[1] -= 0.5;
  67. if (theta[1] > 360.0) theta[1] -= 360.0;
  68.  
  69. theta[2] -= 0.5;
  70. if (theta[2] > 360.0) theta[2] -= 360.0;
  71.  
  72. glutPostRedisplay(); //odświeżenie zawartości aktualnego okna
  73. }
  74.  
  75.  
  76. void EggPoints()
  77. {
  78. calculatedPoints = new float **[N];
  79.  
  80. // Pętla po pionie
  81. for (int i = 0; i < N; i++)
  82. {
  83. calculatedPoints[i] = new float *[N];
  84. float u = (float)i / (N - 1);
  85.  
  86. // Pętla po pozimie
  87. for (int k = 0; k < N; k++)
  88. {
  89. float v = (float) k / (N - 1);
  90.  
  91. float x = getX(u, v);
  92. float y = getY(u, v);
  93. float z = getZ(u, v);
  94.  
  95. // Zapis danych do tablicy
  96. calculatedPoints[i][k] = new float[3];
  97. calculatedPoints[i][k][0] = x;
  98. calculatedPoints[i][k][1] = y;
  99. calculatedPoints[i][k][2] = z;
  100. }
  101. }
  102. }
  103.  
  104. // Wyświetlenie jajka zrobionego z punktów
  105. void EggPointsDraw()
  106. {
  107. glColor3f(1.0f, 1.0f, 1.0f);
  108.  
  109. // Wyświetlenie jajka z punktów
  110. for (int i = 0; i < N; i++)
  111. {
  112. for (int k = 0; k < N; k++)
  113. {
  114. glBegin(GL_POINTS);
  115. glVertex3f(calculatedPoints[i][k][0], calculatedPoints[i][k][1], calculatedPoints[i][k][2]);
  116. glEnd();
  117. }
  118. }
  119. }
  120.  
  121.  
  122. void EggLinesDraw()
  123. {
  124. glColor3f(1.0f, 1.0f, 1.0f);
  125.  
  126. for (int i = 0; i < N; i++)
  127. {
  128. int NextI = i + 1;
  129.  
  130. for (int k = 0; k < N; k++)
  131. {
  132. int NextK = k + 1;
  133.  
  134. // Jeśli koniec zakresu
  135. if (NextK == N)
  136. {
  137. NextK = 0;
  138. }
  139. if (NextI == N)
  140. {
  141. NextI = 0;
  142. }
  143.  
  144. // Pierwszy punkt odcinka
  145. float *firstPoint = calculatedPoints[i][k];
  146. // Drugi punkt odcinka
  147. float *nextPoint = calculatedPoints[i][NextK];
  148.  
  149. // 1 prosta
  150. glBegin(GL_LINES);
  151. glVertex3f(firstPoint[0], firstPoint[1], firstPoint[2]);
  152. glVertex3f(nextPoint[0], nextPoint[1], nextPoint[2]);
  153. glEnd();
  154.  
  155. // 2 prosta
  156. nextPoint = calculatedPoints[NextI][k];
  157. glBegin(GL_LINES);
  158. glVertex3f(firstPoint[0], firstPoint[1], firstPoint[2]);
  159. glVertex3f(nextPoint[0], nextPoint[1], nextPoint[2]);
  160. glEnd();
  161.  
  162. // 3 prosta
  163. nextPoint = calculatedPoints[NextI][NextK];
  164. glBegin(GL_LINES);
  165. glVertex3f(firstPoint[0], firstPoint[1], firstPoint[2]);
  166. glVertex3f(nextPoint[0], nextPoint[1], nextPoint[2]);
  167. glEnd();
  168. }
  169. }
  170. }
  171.  
  172.  
  173.  
  174. void EggTrianglesDraw()
  175. {
  176. usedColors = new int **[N];
  177.  
  178. for (int i = 0; i < N; i++)
  179. {
  180. int NextI = i + 1;
  181.  
  182. usedColors[i] = new int *[N];
  183.  
  184. for (int k = 0; k < N; k++)
  185. {
  186. int NextK = k + 1;
  187.  
  188. // Jeśli koniec zakresu
  189. if (NextK == N)
  190. {
  191. NextK = 0;
  192. }
  193. if (NextI == N)
  194. {
  195. NextI = 0;
  196. }
  197.  
  198. // Losowy kolor
  199. int *color = new int[3];
  200. color[0] = rand() % 255;
  201. color[1] = rand() % 255;
  202. color[2] = rand() % 255;
  203.  
  204. usedColors[i][k] = color;
  205.  
  206. float *firstPoint = calculatedPoints[i][k];
  207. float *secondPoint = calculatedPoints[NextI][k];
  208. float *thirdPoint = calculatedPoints[i][NextK];
  209. float *fourthPoint = calculatedPoints[NextI][NextK];
  210.  
  211. // Pierwszy z trójkątów - dolny
  212. glBegin(GL_TRIANGLES);
  213. // Rysowanie trójkątów
  214. glColor3ub(color[0], color[1], color[2]);
  215. glVertex3f(firstPoint[0], firstPoint[1], firstPoint[2]);
  216. glColor3ub(color[0], color[2], color[1]);
  217. glVertex3f(secondPoint[0], secondPoint[1], secondPoint[2]);
  218. glColor3ub(color[1], color[0], color[2]);
  219. glVertex3f(thirdPoint[0], thirdPoint[1], thirdPoint[2]);
  220. glEnd();
  221.  
  222.  
  223. // Drugi z trójkątów - górny
  224. glBegin(GL_TRIANGLES);
  225. // Rysowanie trójkątów
  226. glColor3ub(color[0], color[1], color[2]);
  227. glVertex3f(secondPoint[0], secondPoint[1], secondPoint[2]);
  228. glColor3ub(color[0], color[2], color[1]);
  229. glVertex3f(thirdPoint[0], thirdPoint[1], thirdPoint[2]);
  230. glColor3ub(color[1], color[0], color[2]);
  231. glVertex3f(fourthPoint[0], fourthPoint[1], fourthPoint[2]);
  232. glEnd();
  233. }
  234. }
  235. }
  236.  
  237.  
  238.  
  239.  
  240.  
  241.  
  242. // Funkcja rysująca osie układu współrzędnych
  243. void Axes(void)
  244. {
  245.  
  246. point3 x_min = { -5.0, 0.0, 0.0 };
  247. point3 x_max = { 5.0, 0.0, 0.0 };
  248. // początek i koniec obrazu osi x
  249.  
  250. point3 y_min = { 0.0, -5.0, 0.0 };
  251. point3 y_max = { 0.0, 5.0, 0.0 };
  252. // początek i koniec obrazu osi y
  253.  
  254. point3 z_min = { 0.0, 0.0, -5.0 };
  255. point3 z_max = { 0.0, 0.0, 5.0 };
  256. // początek i koniec obrazu osi y
  257.  
  258. glColor3f(1.0f, 0.0f, 0.0f); // kolor rysowania osi - czerwony
  259. glBegin(GL_LINES); // rysowanie osi x
  260.  
  261. glVertex3fv(x_min);
  262. glVertex3fv(x_max);
  263.  
  264. glEnd();
  265.  
  266. glColor3f(0.0f, 1.0f, 0.0f); // kolor rysowania - zielony
  267. glBegin(GL_LINES); // rysowanie osi y
  268.  
  269. glVertex3fv(y_min);
  270. glVertex3fv(y_max);
  271.  
  272. glEnd();
  273.  
  274. glColor3f(0.0f, 0.0f, 1.0f); // kolor rysowania - niebieski
  275. glBegin(GL_LINES); // rysowanie osi z
  276.  
  277. glVertex3fv(z_min);
  278. glVertex3fv(z_max);
  279.  
  280. glEnd();
  281.  
  282. }
  283.  
  284. /*************************************************************************************/
  285.  
  286. // Funkcja określająca co ma być rysowane (zawsze wywoływana gdy trzeba
  287. // przerysować scenę)
  288.  
  289.  
  290.  
  291. void RenderScene(void)
  292. {
  293. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  294. // Czyszczenie okna aktualnym kolorem czyszczącym
  295. glLoadIdentity();
  296. // Czyszczenie macierzy bieżącej
  297. Axes();
  298. // Narysowanie osi przy pomocy funkcji zdefiniowanej wyżej
  299.  
  300. // Wyliczenie punktów jajka
  301. EggPoints();
  302.  
  303. glRotatef(theta[0], 1.0, 0.0, 0.0);
  304. glRotatef(theta[1], 0.0, 1.0, 0.0);
  305. glRotatef(theta[2], 0.0, 0.0, 1.0);
  306.  
  307. // Wybór pomiędzy rysowaniem punktów/linii/trójkątów
  308. //EggTrianglesDraw();
  309. //EggLinesDraw();
  310. EggPointsDraw();
  311.  
  312. glFlush();
  313. // Przekazanie poleceń rysujących do wykonania
  314. glutSwapBuffers();
  315. }
  316.  
  317. /*************************************************************************************/
  318.  
  319. // Funkcja ustalająca stan renderowania
  320.  
  321.  
  322.  
  323. void MyInit(void)
  324. {
  325.  
  326. glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  327. // Kolor czyszcący (wypełnienia okna) ustawiono na czarny
  328.  
  329. }
  330.  
  331. /*************************************************************************************/
  332.  
  333. // Funkcja ma za zadanie utrzymanie stałych proporcji rysowanych
  334. // w przypadku zmiany rozmiarów okna.
  335. // Parametry vertical i horizontal (wysokość i szerokość okna) są
  336. // przekazywane do funkcji za każdym razem gdy zmieni się rozmiar okna.
  337.  
  338.  
  339.  
  340. void ChangeSize(GLsizei horizontal, GLsizei vertical)
  341. {
  342.  
  343. GLfloat AspectRatio;
  344. // Deklaracja zmiennej AspectRatio określającej proporcję
  345. // wymiarów okna
  346.  
  347. if (vertical == 0) // Zabezpieczenie przed dzieleniem przez 0
  348.  
  349. vertical = 1;
  350.  
  351. glViewport(0, 0, horizontal, vertical);
  352. // Ustawienie wielkościokna okna widoku (viewport)
  353. // W tym przypadku od (0,0) do (horizontal, vertical)
  354.  
  355. glMatrixMode(GL_PROJECTION);
  356. // Przełączenie macierzy bieżącej na macierz projekcji
  357.  
  358. glLoadIdentity();
  359. // Czyszcznie macierzy bieżącej
  360.  
  361. AspectRatio = (GLfloat)horizontal / (GLfloat)vertical;
  362. // Wyznaczenie współczynnika proporcji okna
  363. // Gdy okno nie jest kwadratem wymagane jest określenie tak zwanej
  364. // przestrzeni ograniczającej pozwalającej zachować właściwe
  365. // proporcje rysowanego obiektu.
  366. // Do okreslenia przestrzeni ograniczjącej służy funkcja
  367. // glOrtho(...)
  368.  
  369. if (horizontal <= vertical)
  370.  
  371. glOrtho(-7.5, 7.5, -7.5 / AspectRatio, 7.5 / AspectRatio, 10.0, -10.0);
  372.  
  373. else
  374.  
  375. glOrtho(-7.5*AspectRatio, 7.5*AspectRatio, -7.5, 7.5, 10.0, -10.0);
  376.  
  377. glMatrixMode(GL_MODELVIEW);
  378. // Przełączenie macierzy bieżącej na macierz widoku modelu
  379.  
  380. glLoadIdentity();
  381. // Czyszcenie macierzy bieżącej
  382.  
  383. }
  384.  
  385. /*************************************************************************************/
  386.  
  387. // Główny punkt wejścia programu. Program działa w trybie konsoli
  388.  
  389.  
  390.  
  391. void main(void)
  392. {
  393.  
  394. glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  395.  
  396. glutInitWindowSize(300, 300);
  397.  
  398. glutCreateWindow("Układ współrzędnych 3-D");
  399.  
  400. glutDisplayFunc(RenderScene);
  401. // Określenie, że funkcja RenderScene będzie funkcją zwrotną
  402. // (callback function). Bedzie ona wywoływana za każdym razem
  403. // gdy zajdzie potrzba przeryswania okna
  404.  
  405. glutReshapeFunc(ChangeSize);
  406. // Dla aktualnego okna ustala funkcję zwrotną odpowiedzialną
  407. // zazmiany rozmiaru okna
  408.  
  409. // Włączenie obsługi klawiatury
  410. //glutKeyboardFunc(keys);
  411.  
  412. MyInit();
  413. // Funkcja MyInit() (zdefiniowana powyżej) wykonuje wszelkie
  414. // inicjalizacje konieczne przed przystąpieniem do renderowania
  415.  
  416. glEnable(GL_DEPTH_TEST);
  417. // Włączenie mechanizmu usuwania powierzchni niewidocznych
  418.  
  419.  
  420.  
  421.  
  422. glutIdleFunc(spinEgg);
  423.  
  424.  
  425.  
  426.  
  427. glutMainLoop();
  428. // Funkcja uruchamia szkielet biblioteki GLUT
  429.  
  430. }
  431.  
  432. /*************************************************************************************/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement