Advertisement
Guest User

Untitled

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