Advertisement
Guest User

Untitled

a guest
Sep 18th, 2019
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.04 KB | None | 0 0
  1. /* 1. Transformações de translação, escala e rotação 2D.
  2. */
  3. #include <GL/glut.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <math.h>
  7. #define MAX(x,y) (x > y ? x : y)
  8.  
  9. /*'Coordenadas_poligono' serve como base para a criacao de poligonos
  10. * Nesse caso estamos gerando um Triangulo */
  11. typedef struct Coordenadas_poligono{
  12. int quantidade_de_lados;
  13. GLfloat *coordenadas_x, *coordenadas_y, *coordenadas_z;
  14. }CoordenadasTriangulo;
  15.  
  16. CoordenadasTriangulo Triangulo;
  17. GLint view_w, view_h;
  18. GLfloat xf, yf, win;
  19. float escala = 1;
  20. float tx = 1;
  21. float ty = 1;
  22. double Valor_fixo_rotacao = 30.0;
  23.  
  24.  
  25. void Desenha(void);
  26. void Inicializa(void);
  27. void GerenciaTeclado(unsigned char key, int x, int y);
  28. void AlteraTamanhoJanela(GLsizei w, GLsizei h);
  29. void rotacionar(double angulo);
  30.  
  31. int main(int argc, char** argv){
  32.  
  33.  
  34. //Inicializacao de um poligono de 3 lados
  35. Triangulo.quantidade_de_lados = 3;
  36. Triangulo.coordenadas_x = (GLfloat *)malloc(sizeof(GLfloat)*Triangulo.quantidade_de_lados);
  37. Triangulo.coordenadas_y = (GLfloat *)malloc(sizeof(GLfloat)*Triangulo.quantidade_de_lados);
  38. Triangulo.coordenadas_z = (GLfloat *)malloc(sizeof(GLfloat)*Triangulo.quantidade_de_lados);
  39. Triangulo.coordenadas_x[0] = 0.125;
  40. Triangulo.coordenadas_x[1] = 0.375;
  41. Triangulo.coordenadas_x[2] = 0.245;
  42. Triangulo.coordenadas_y[0] = 0.125;
  43. Triangulo.coordenadas_y[1] = 0.125;
  44. Triangulo.coordenadas_y[2] = 0.375;
  45. Triangulo.coordenadas_z[0] = 0.0;
  46. Triangulo.coordenadas_z[1] = 0.0;
  47. Triangulo.coordenadas_z[2] = 0.0;
  48. //-----------------------------------------------
  49.  
  50. glutInit(&argc, argv);
  51. glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
  52. glutInitWindowSize(1000, 800);
  53. glutInitWindowPosition(0,0);
  54. glutCreateWindow ("Exercicio 01 --- Grupo 07");
  55. glClearColor(1.0, 1.0, 1.0, 0.0);
  56. glShadeModel (GL_FLAT);
  57. glOrtho (0, 2, 0, 2, -2 ,2);
  58. glutDisplayFunc(Desenha);
  59. glutReshapeFunc(AlteraTamanhoJanela);
  60. glutKeyboardFunc(GerenciaTeclado);
  61.  
  62. Inicializa();
  63. glutMainLoop();
  64. return 0;
  65. }
  66. // Função callback chamada para fazer o desenho
  67. void Desenha(void)
  68. {
  69. glLoadIdentity();
  70. glClear(GL_COLOR_BUFFER_BIT);
  71. glColor3f (1.0, 0.0, 0.0);
  72. glBegin(GL_POLYGON);
  73. glVertex3f((Triangulo.coordenadas_x[0]*escala)+tx, (Triangulo.coordenadas_y[0]*escala)+ty, Triangulo.coordenadas_z[0]*escala); //baixo esq
  74. glVertex3f((Triangulo.coordenadas_x[1]*escala)+tx, (Triangulo.coordenadas_y[1]*escala)+ty, Triangulo.coordenadas_z[1]*escala); //baixo dir
  75. glVertex3f((Triangulo.coordenadas_x[2]*escala)+tx, (Triangulo.coordenadas_y[2]*escala)+ty, Triangulo.coordenadas_z[2]*escala); //cima
  76. glEnd();
  77. glFlush();
  78. }
  79.  
  80. // Inicializa parâmetros de rendering
  81. void Inicializa (void){
  82. glClearColor(0.0f, 0.0f, 0.5f, 1.0f);
  83. }
  84.  
  85. // Função callback chamada quando o tamanho da janela é alterado
  86. void AlteraTamanhoJanela(GLsizei w, GLsizei h)
  87. {
  88. // Especifica as dimensões da Viewport
  89. glViewport(0, 0, w, h);
  90. view_w = w;
  91. view_h = h;
  92. // Inicializa o sistema de coordenadas
  93. glMatrixMode(GL_PROJECTION);
  94. glLoadIdentity();
  95. gluOrtho2D (-win, win, -win, win);
  96. }
  97.  
  98. /*Funcao para rotacao ao redor do eixo Z
  99. * parametros: double angulo -> espera um valor real com o angulo de rotacao
  100. * Nessa função a rotação é feita através de um ângulo teta qualquer a partir da origem.
  101. * A rotação segue o seguinte cálculo:
  102. *
  103. *x' = x * cos(teta) - y * sen(teta)
  104. *y' = y * sen(teta) + y * cos(teta)
  105. *
  106. * -> x e y são as coordenadas atuais de um determinado vértice, antes da rotação.
  107. * -> x' e y' são as novas coordenadas de um determinado vértice, dada sua rotação.
  108. * x' e y' são representados por nova_coordenada_x e nova_coordenada_y, respectivamente.
  109. */
  110. void rotacionar(double angulo){
  111. GLfloat nova_coordenada_x, nova_coordenada_y;
  112. int contador;
  113. double seno_angulo, cosseno_angulo;
  114. seno_angulo = sin(angulo);
  115. cosseno_angulo = cos(angulo);
  116. for(contador = 0; contador < Triangulo.quantidade_de_lados; contador++){
  117. /*Calcula as coordenadas x e y de acordo com os calculos da matriz de rotação*/
  118. nova_coordenada_x = Triangulo.coordenadas_x[contador]*cosseno_angulo - Triangulo.coordenadas_y[contador]*seno_angulo;
  119. nova_coordenada_y = Triangulo.coordenadas_x[contador]*seno_angulo + Triangulo.coordenadas_y[contador]*cosseno_angulo;
  120. Triangulo.coordenadas_x[contador] = nova_coordenada_x;
  121. Triangulo.coordenadas_y[contador] = nova_coordenada_y;
  122. }
  123. }
  124. // Função callback chamada para gerenciar eventos de teclado
  125. void GerenciaTeclado(unsigned char key, int x, int y){
  126. switch (key) {
  127. case 'g':
  128. case 'G':// muda a escala pra grande
  129. escala += 0.4;
  130. break;
  131. case 'm':
  132. case 'M':// muda a escala menor
  133. escala = MAX(escala-0.4,0.4);
  134. break;
  135. case 'r':
  136. rotacionar(Valor_fixo_rotacao);
  137. //rotacionar no sentido anti-horário, o valor fixado esta em 30 graus
  138. break;
  139. case 'R':
  140. rotacionar(-Valor_fixo_rotacao);
  141. //rotacionar no sentido horário, o valor fixado esta em 30 graus
  142. break;
  143. case 'a':
  144. case 'A'://translada pra esquerda
  145. tx += -0.25;
  146. break;
  147. case 'd':
  148. case 'D'://translada pra direita
  149. tx += 0.25;
  150. break;
  151. case 'w':
  152. case 'W'://translada pra cima
  153. ty += 0.25;
  154. break;
  155. case 's':
  156. case 'S'://translada pra baixo
  157. ty += -0.25;
  158. break;
  159. case 'c':
  160. case 'C':
  161. Triangulo.coordenadas_x[0] = 0.125;
  162. Triangulo.coordenadas_x[1] = 0.375;
  163. Triangulo.coordenadas_x[2] = 0.245;
  164. Triangulo.coordenadas_y[0] = 0.125;
  165. Triangulo.coordenadas_y[1] = 0.125;
  166. Triangulo.coordenadas_y[2] = 0.375;
  167. Triangulo.coordenadas_z[0] = 0.0;
  168. Triangulo.coordenadas_z[1] = 0.0;
  169. Triangulo.coordenadas_z[2] = 0.0;
  170. break;
  171. }
  172. glutPostRedisplay();
  173. }
  174.  
  175.  
  176. //////////////////////////////////////////////
  177. Makefile - codigo atualizado com funcao de rotacao
  178. //////////////////////
  179. C_COMP = gcc
  180.  
  181. run : GC1
  182. ./GC1
  183. GC1 : GC1.o
  184. $(C_COMP) -o GC1 GC1.c -lGL -lGLU -lglut -lm
  185.  
  186. GC1.o : GC1.c
  187. $(C_COMP) -c GC1.c -lGL -lGLU -lglut -lm
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement