#include <windows.h> #include <C:\GLUT\include\GL\glut.h> #include <stdio.h> #include <stdlib.h> #include <math.h> #define PI 3.1415926535897932384626433832795 #define CANTREBOTE 0.005 // cantidad de rebote que tendrá float radio=1, a1, a2, rotar = 0, inc = 0, sentido = 0.1; float sentido2 = 0.1; float nx, ny, r, g, b, dx, dy; int logoGActivo = 1; // 1 significa que G aparece float escala = 1.0; float incEscala = 1.0; float limitesEscala = 1.0; float rebote = 0.0; float limitesRebote = 0.0; int puntos = 0, ancho = 600, alto = 600, tam_px = 1; int tx=0,ty=0; void rombos() { // Figura de Rombos rojos glBegin( GL_QUADS ); // establece el modo de trazo glColor3f( 0.854901, 0.011764, 0.129411 ); // establece el color // se ubican los puntes de interes para dar la forma deseada // rombo superior glVertex2f( 1126 - 1069, 253 - (243+157)/2.0 ); glVertex2f( 1069 - 1069, 352 - (243+157)/2.0 ); glVertex2f( 1010 - 1069, 253 - (243+157)/2.0 ); glVertex2f( 1069 - 1069, 157 - (243+157)/2.0 ); // punto y centro común de los rombos // rombo izquierdo glVertex2f( 1069 - 1069, 157 - (243+157)/2.0 ); // punto y centro común de los rombos glVertex2f( 958 - 1069, 157 - (243+157)/2.0 ); glVertex2f( 903 - 1069, 59 - (243+157)/2.0 ); glVertex2f( 1013 - 1069, 59 - (243+157)/2.0 ); // rombo derecho glVertex2f( 1069 - 1069, 157 - (243+157)/2.0 ); // punto y centro común de los rombos glVertex2f( 1124 - 1069, 59 - (243+157)/2.0 ); glVertex2f( 1237 - 1069, 59 - (243+157)/2.0 ); glVertex2f( 1178 -1069, 157 - (243+157)/2.0 ); glEnd(); glFlush(); // libera memoria } /** * Traza circulos acorde a los parámetros recibidos * @param cx Coordenada x donde se ubicará el centro del circulo * @param cy Coordenada y donde se ubicará el centro del circulo * @param radio Medida que tendrá de radio el circulor * @param r Color rojo de un RGB de 0.0 a 1.0 * @param g Color verde de un RGB de 0.0 a 1.0lor * @param b Color azul de un RGB de 0.0 a 1.0 * @param a1 Inicio del trazo del circulo en radianes * @param a2 Fin del trazo del circulo en radianes */ void circulo( float cx, float cy, float radio, float r, float g, float b, float a1, float a2 ) { glEnable( GL_LINE_SMOOTH ); // suaviza el trazado de la línea glBegin( GL_POLYGON ); // une los puntos de un poligono y lo rellena glColor3f(r,g,b); // establece el color glVertex2f(cx,cy); // coordenadas del origenl del circulo // ciclo for para la posición y unión de los puntos del circulo for( float i = a1; i<= a2; i += 0.01 ) { dx = radio*cos(i) + cx; dy = radio*sin(i) + cy; glVertex2f( dx, dy); } glEnd(); } void logoPropio() { glPointSize(5); // el valor es el tamaño del punto que tendrá en pixeles r = 46.0/255.0; g = 134.0/255.0; b = 193.0/255.0; glBegin( GL_POLYGON ); // establece el modo de trazo glColor3f( r, g, b ); // establece el color // se ubican los puntes de interes para dar la forma deseada // Palito de la f glVertex2i( 0, -5 ); // punto y centro común de los rombos glVertex2i( 35, -5 ); glVertex2i( 35, 5 ); glVertex2i( 0, 5 ); glEnd(); glBegin( GL_POLYGON ); // establece el modo de trazo glColor3f( r, g, b ); // establece el color // se ubican los puntes de interes para dar la forma deseada // Palito de la f y la g glVertex2i( -5, 38 ); // punto y centro común de los rombos glVertex2i( -5, -50 ); glVertex2i( 5, -50 ); glVertex2i( 5, 38 ); glEnd(); // circulo de la g circulo( -25.0, 0.0, 30, r, g, b, 0.0, 2*PI ); // contorno negro de la primer figura circulo( -25.0, 0.0, 20, 0.0, 0.0, 0.0, 0.0, 2*PI ); // contorno negro de la primer figura // semicirculo de la g circulo( -25.0, -50.0, 30, r, g, b, PI, 2*PI ); // contorno negro de la primer figura circulo( -25.0, -50.0, 20, 0.0, 0.0, 0.0, PI, 2*PI ); // contorno negro de la primer figura glBegin( GL_POLYGON ); // establece el modo de trazo glColor3f( r, g, b ); // establece el color // se ubican los puntes de interes para dar la forma deseada // semicirculo de la F circulo( 25.0, 38.0, 30, r, g, b, 0, PI ); // contorno negro de la primer figura circulo( 25.0, 38.0, 20, 0.0, 0.0, 0.0, 0, PI ); // contorno negro de la primer figura glFlush(); // libera memoria } void dibujarG() { int cx=0;int cy=0; circulo(cx,cy,5,0.858,0.196,0.211,0.7854,2.7); circulo(cx,cy,5,0.956,0.76,0.05,2.65,3.65); circulo(cx,cy,5,0.235,0.73,0.33,3.65,5.49); circulo(cx,cy,5,0.282,0.52,0.93,5.48,2*3.22); circulo(cx,cy,3,0,0,0,0,2*3.1416); glColor3f(0.282,0.52,0.93); glBegin(GL_TRIANGLE_FAN); glVertex2f(0+cx,0.8+cy);glVertex2f(4.98+cx,0.8+cy); glVertex2f(4.93+cx,-1+cy);glVertex2f(0+cx,-1+cy); glEnd(); } void display(void) { glClear(GL_COLOR_BUFFER_BIT); glTranslatef( 0, rebote, 0 ); glScalef( escala, escala, 1.0 ); glRotatef(rotar, 0, 0, 1); if( logoGActivo == 1 ) { dibujarG(); glFlush(); } else if( logoGActivo == 0 ) { glPushMatrix(); glTranslatef( 0, 0.9, 0); glScalef( 0.02, 0.02, 1 ); rombos(); glPopMatrix(); } else if( logoGActivo == 2 ) { glPushMatrix(); glScalef( 0.1, 0.1, 1 ); logoPropio(); glPopMatrix(); } } void key(unsigned char c, int x, int y) { if (c == 27) { exit(0); } } void ajustar(int ancho, int alto) { float aspectratio; aspectratio = 1; if (1>(ancho/alto)) { // glViewport recibe 4 parametros, uno el origen en x, y y otro el ancho y otro el alto glViewport(0, 0, ancho, ancho/aspectratio); } else { glViewport(0, 0, alto*aspectratio,alto); } } void seleccion(int valor) { switch(valor) { case 1: inc = 1; break; case 2: inc = 0; break; case 3: // casos 3 y 4 sentidos de la rotacion sentido = sentido2; break; case 4: sentido = -1*sentido2; break; case 5: logoGActivo = 1; // cambio a logo G break; case 6: logoGActivo = 0; // cambio al otro logo break; case 7: logoGActivo = 2; // cambio al logo propio break; case 8: incEscala = 0.999; break; case 9: incEscala = 1.001; break; case 10: incEscala = 1.0; break; case 11: rebote = CANTREBOTE; break; case 12: rebote = 0; break; default: break; } } void animar(void) { rotar = inc*sentido; // 0.1 y 3 son los limites de reduccion y de apliacion a partir de los cuales deja de escalar if( limitesEscala > 0.1 && limitesEscala < 3 ) { escala = incEscala; if( incEscala > 1 ) limitesEscala = limitesEscala*incEscala; else if( incEscala < 1 ) limitesEscala = limitesEscala*incEscala; } else { escala = 1.0; if( incEscala != 1 ) limitesEscala = limitesEscala*incEscala; } if( limitesEscala < 0.1 || limitesEscala > 3 ) incEscala = 1.0; // MANEJO DEL REBOTE if( rebote > 0 ) { limitesRebote = limitesRebote + CANTREBOTE; } else if( rebote < 0 ) { limitesRebote = limitesRebote - CANTREBOTE; } if( limitesRebote > 2 && rebote != 0 ) { rebote = -1*CANTREBOTE; } if( limitesRebote < -2 && rebote != 0 ) { rebote = CANTREBOTE; } glutPostRedisplay(); } void Init() { glClearColor(0,0,0,0); gluOrtho2D(-10, 10, -10, 10); glPointSize(tam_px); glEnable(GL_POINT_SMOOTH); } void menu(){ int movimiento; movimiento = glutCreateMenu(seleccion); // como servira para un submenu se asigna a una variable glutAddMenuEntry("Izquierda", 3); glutAddMenuEntry("Derecha", 4); // cada menu tiene una jerarquia int logo; // guardara la selccion del logo elegido logo = glutCreateMenu(seleccion); glutAddMenuEntry("Logo G", 5); glutAddMenuEntry("Logo Rombos", 6); glutAddMenuEntry("Logo Propio", 7); int subMEsc; // guardara la selccion escalamiento subMEsc = glutCreateMenu(seleccion); glutAddMenuEntry("Reducir", 8); glutAddMenuEntry("Ampliar", 9); glutAddMenuEntry("Deshabilitar", 10); int subMReb; // guardara la selccion escalamiento subMReb = glutCreateMenu(seleccion); glutAddMenuEntry("Habilitar", 11); glutAddMenuEntry("Deshabilitar", 12); //menú con el click derecho glutCreateMenu(seleccion); glutAddMenuEntry("Iniciar", 1); glutAddMenuEntry("Detener", 2); glutAddSubMenu("Sentido", movimiento); // para agregar un submenu.... movimiento se crea antes para que se conozca glutAddSubMenu("Logo", logo); glutAddSubMenu("Escalamiento", subMEsc); glutAddSubMenu("Rebote", subMReb); glutAttachMenu(GLUT_RIGHT_BUTTON); // con clic derecho se accede al menú } int main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE ); glutInitWindowSize(500, 500); glutCreateWindow("Menu,animación y relación de aspecto"); Init(); menu(); glutDisplayFunc(display); glutIdleFunc(animar); // Idle significa en espera glutReshapeFunc(ajustar); glutKeyboardFunc(key); glutMainLoop(); return 0; }
lunes, 27 de febrero de 2017
Tarea animación y logo propio
Suscribirse a:
Comentarios de la entrada (Atom)
No hay comentarios.:
Publicar un comentario