Advertisement
Guest User

Untitled

a guest
Nov 13th, 2019
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.16 KB | None | 0 0
  1. // new_jajo.cpp : This file contains the 'main' function. Program execution begins and ends there.
  2. //
  3.  
  4. #define _USE_MATH_DEFINES
  5. #include <iostream>
  6. #include <windows.h>
  7. #include <conio.h>
  8. #include <iostream>
  9. #include <gl/gl.h>
  10. #include <gl/glut.h>
  11. #include <math.h>
  12. #include <conio.h>
  13. #include <ctime>
  14. #include <cstdlib>
  15. using namespace std;
  16.  
  17. int model = 1;
  18. static GLfloat theta[] = { 0.0, 0.0, 0.0 }; // trzy kąty obrotu
  19. typedef float point3[3];
  20. const int N = 25; // ustalenie stałej N
  21. point3 tab[N][N];
  22.  
  23.  
  24. double getx(double u, double v)
  25. {
  26. return ((-90 * pow(u, 5)) + (225 * pow(u, 4)) - (270 * pow(u, 3)) + (180 * pow(u, 2)) - 45 * u) * cos(M_PI * v);
  27. }
  28.  
  29. double gety(double u, double v)
  30. {
  31. return (160 * pow(u, 4)) - (320 * pow(u, 3)) + (160 * pow(u, 2));
  32. }
  33.  
  34. double getz(double u, double v)
  35. {
  36. return ((-90 * pow(u, 5)) + (225 * pow(u, 4)) - (270 * pow(u, 3)) + (180 * pow(u, 2)) - 45 * u) * sin(M_PI * v);
  37. }
  38.  
  39. void spinEgg()
  40. {
  41.  
  42. theta[0] -= 0.5;
  43. if (theta[0] > 360.0) theta[0] -= 360.0;
  44.  
  45. theta[1] -= 0.5;
  46. if (theta[1] > 360.0) theta[1] -= 360.0;
  47.  
  48. theta[2] -= 0.5;
  49. if (theta[2] > 360.0) theta[2] -= 360.0;
  50.  
  51. glutPostRedisplay(); //odświeżenie zawartości aktualnego okna
  52. }
  53.  
  54.  
  55.  
  56. void egg() {
  57.  
  58. for (int i = 0; i < N; i++)
  59. for (int j = 0; j < N; j++)
  60. {
  61. double u = double(i) / double(N-1);
  62. double v = float(j) / double(N-1);
  63.  
  64. tab[i][j][0] = getx(u, v);
  65. tab[i][j][1] = gety(u, v);
  66. tab[i][j][2] = getz(u, v);
  67.  
  68. }
  69.  
  70.  
  71. glTranslated(0, -5, 0);
  72.  
  73. /*
  74. glBegin(GL_POINTS);
  75. for (int i = 0; i < N; i++)
  76. for (int j = 0; j < N; j++)
  77. glVertex3fv(tab[i][j]);
  78.  
  79. glEnd();
  80. }
  81.  
  82. glBegin(GL_LINES);
  83. for (int i = 0; i < N - 1; i++)
  84. for (int j = 0; j < N - 1; j++) {
  85. float a = static_cast <float> (rand()) / static_cast <float> (RAND_MAX);
  86. float b = static_cast <float> (rand()) / static_cast <float> (RAND_MAX);
  87. float c = static_cast <float> (rand()) / static_cast <float> (RAND_MAX);
  88. glColor3f(a, b, c);
  89. glVertex3fv(tab[i][j]);
  90. glVertex3fv(tab[i][j + 1]);
  91. glVertex3fv(tab[i][j]);
  92. glVertex3fv(tab[i + 1][j]);
  93. }
  94. glEnd();
  95. }
  96. */
  97. int help = (N - 1) - 1;
  98. for (int i = 0; i < (N - 1); i++) {
  99. for (int j = 0; j < (N - 1); j++) {
  100. glBegin(GL_TRIANGLES);
  101. glColor3f(1.0f, 0.0f, 0.0f);
  102. glVertex3f(tab[i][j][0], tab[i][j][1], tab[i][j][2]);
  103. glColor3f(0.0f, 1.0f, 0.0f);
  104. glVertex3f(tab[i][j + 1][0], tab[i][j + 1][1], tab[i][j + 1][2]);
  105. glColor3f(0.0f, 0.0f, 1.0f);
  106. glVertex3f(tab[i + 1][j][0], tab[i + 1][j][1], tab[i + 1][j][2]);
  107. glEnd();
  108.  
  109. glBegin(GL_TRIANGLES);
  110. glColor3f(1.0f, 0.0f, 0.0f);
  111. glVertex3f(tab[i][j + 1][0], tab[i][j + 1][1], tab[i][j + 1][2]);
  112. glColor3f(0.0f, 1.0f, 0.0f);
  113. glVertex3f(tab[i + 1][j + 1][0], tab[i + 1][j + 1][1], tab[i + 1][j + 1][2]);
  114. glColor3f(0.0f, 0.0f, 1.0f);
  115. glVertex3f(tab[i + 1][j][0], tab[i + 1][j][1], tab[i + 1][j][2]);
  116. glEnd();
  117.  
  118.  
  119. }
  120. }
  121.  
  122. }
  123.  
  124.  
  125.  
  126. // Funkcja określająca co ma być rysowane (zawsze wywoływana gdy trzeba
  127. // przerysować scenę)
  128.  
  129. void RenderScene(void)
  130. {
  131.  
  132. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  133. // Czyszczenie okna aktualnym kolorem czyszczącym
  134.  
  135. glLoadIdentity();
  136. // Czyszczenie macierzy bieżącej
  137. srand(static_cast <unsigned> (time(0)));
  138.  
  139.  
  140. glRotatef(theta[0], 1.0, 0.0, 0.0);
  141.  
  142. glRotatef(theta[1], 0.0, 1.0, 0.0);
  143.  
  144. glRotatef(theta[2], 0.0, 0.0, 1.0);
  145. spinEgg();
  146. glRotated(30.0, 1.0, 0.0, 0.0);
  147. egg();
  148.  
  149.  
  150. glFlush();
  151. glutSwapBuffers();
  152. //
  153.  
  154. }
  155.  
  156. /*************************************************************************************/
  157.  
  158.  
  159. void MyInit(void)
  160. {
  161. glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  162. }
  163.  
  164. /*************************************************************************************/
  165. void ChangeSize(GLsizei horizontal, GLsizei vertical)
  166. {
  167.  
  168.  
  169. GLfloat AspectRatio;
  170. // Deklaracja zmiennej AspectRatio określającej proporcję
  171. // wymiarów okna
  172.  
  173. if (vertical == 0) // Zabezpieczenie przed dzieleniem przez 0
  174.  
  175. vertical = 1;
  176.  
  177. glViewport(0, 0, horizontal, vertical);
  178. // Ustawienie wielkościokna okna widoku (viewport)
  179. // W tym przypadku od (0,0) do (horizontal, vertical)
  180.  
  181. glMatrixMode(GL_PROJECTION);
  182. // Przełączenie macierzy bieżącej na macierz projekcji
  183.  
  184. glLoadIdentity();
  185. // Czyszcznie macierzy bieżącej
  186.  
  187. AspectRatio = (GLfloat)horizontal / (GLfloat)vertical;
  188. // Wyznaczenie współczynnika proporcji okna
  189. // Gdy okno nie jest kwadratem wymagane jest określenie tak zwanej
  190. // przestrzeni ograniczającej pozwalającej zachować właściwe
  191. // proporcje rysowanego obiektu.
  192. // Do okreslenia przestrzeni ograniczjącej służy funkcja
  193. // glOrtho(...)
  194.  
  195. if (horizontal <= vertical)
  196.  
  197. glOrtho(-7.5, 7.5, -7.5 / AspectRatio, 7.5 / AspectRatio, 10.0, -10.0);
  198.  
  199. else
  200.  
  201. glOrtho(-7.5 * AspectRatio, 7.5 * AspectRatio, -7.5, 7.5, 10.0, -10.0);
  202.  
  203. glMatrixMode(GL_MODELVIEW);
  204. // Przełączenie macierzy bieżącej na macierz widoku modelu
  205.  
  206. glLoadIdentity();
  207. // Czyszcenie macierzy bieżącej
  208.  
  209. }
  210.  
  211. /*************************************************************************************/
  212.  
  213. // Główny punkt wejścia programu. Program działa w trybie konsoli
  214.  
  215.  
  216.  
  217. void main(void)
  218. {
  219.  
  220.  
  221. glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  222.  
  223. glutInitWindowSize(600, 600);
  224. glutCreateWindow("Układ współrzędnych 3-D");
  225. //glutIdleFunc(spinEgg);
  226. glutDisplayFunc(RenderScene);
  227. // Określenie, że funkcja RenderScene będzie funkcją zwrotną
  228. // (callback function). Bedzie ona wywoływana za każdym razem
  229. // gdy zajdzie potrzba przeryswania okna
  230.  
  231. glutReshapeFunc(ChangeSize);
  232. // Dla aktualnego okna ustala funkcję zwrotną odpowiedzialną
  233. // zazmiany rozmiaru okna
  234.  
  235. MyInit();
  236. // Funkcja MyInit() (zdefiniowana powyżej) wykonuje wszelkie
  237. // inicjalizacje konieczne przed przystąpieniem do renderowania
  238.  
  239. glEnable(GL_DEPTH_TEST);
  240. // Włączenie mechanizmu usuwania powierzchni niewidocznych
  241.  
  242. glutMainLoop();
  243. // Funkcja uruchamia szkielet biblioteki GLUT
  244.  
  245. }
  246.  
  247. /*************************************************************************************/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement