#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