#include <windows.h> #include <C:\GLUT\include\GL\glut.h> #include <stdlib.h> #include <stdio.h> #include <math.h> #define PI 3.1415926535897932384626433832795 /** Descripcion: Tablero de Ajedrez sobre fondo azul, donde se mueve por las casillas * la letra G de Google. * * Autores: * Edgar Villa Miguel. * Fecha de creacion: 18/02/17 * Revisiones: --- * programa. * Fecha de ultima actualizacion: 20/02/17 */ int ancho = 734, alto = 734; // alto y ancho para la ventana int tableroBlanco = 296; // tamaño del tablero blanco int cuadroNegro = 37; // tamaño de un cuadrito negro del tablero int xG = ancho/2 - cuadroNegro; // coordenada x para mover G int yG = alto/2 + cuadroNegro; // coordenada y para mover G int bnG = 1; // variable para cambiar fonode de G, 1 significa blanco, 0 negro int confirmaCambia = 1; // bandera que ayuda a cambiar de manera correcta los colores para G float dx,dy; /** * 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 ); glBegin( GL_POLYGON ); glColor3f(r,g,b); glVertex2f(cx,cy); for( float i = a1; i<= a2; i+=0.01 ) { dx = radio*cos(i) + cx; dy= radio*sin(i) + cy; glVertex2f(dx,dy); } glEnd(); } void cuadro( float lado, float r, float g, float b) { glColor3f(r,g,b); glBegin(GL_POLYGON ); glVertex2f(lado, lado); glVertex2f(-lado, lado); glVertex2f(-lado, -lado); glVertex2f(lado, -lado); glEnd(); } void logoG( int bn ) // b(blanco) = 1, n(negro) = 0 { glPointSize(10); // el valor es el tamaño del punto que tendrá en pixeles glColor3f(0, 0, 1.0); // RGB B = 1, Blue circulo( 0.0, 0.0, 40, 0.917647, 0.262745, 0.207843, 0.872664626, 2.617993878 ); // Rojo circulo( 0.0, 0.0, 40, 0.984313, 0.737254, 0.019607, 2.60, 3.665191429 ); // Amarillo circulo( 0.0, 0.0, 40, 0.203921, 0.658823, 0.325490, 3.66, 5.410520681 ); // Verde circulo( 0.0, 0.0, 40, 0.258823, 0.521568, 0.956862, 5.4, 6.5 ); // Azul if( bn == 1 ) circulo( 0.0, 0.0, 23, 1.0, 1.0, 1.0, 0, 2*PI ); // Blanco else circulo( 0.0, 0.0, 23, 0.0, 0.0, 0.0, 0, 2*PI ); // Blanco glBegin( GL_POLYGON ); // Rectangulo azul glColor3f( 0.258823, 0.521568, 0.956862 ); // Azul glVertex2i(0,8); glVertex2i(0,-7); glVertex2i(39,-7); glVertex2i(39,8); glEnd(); } void cuadritoNegro( int x, int y) { // sino se pone push y pop Matriz solo se pintaría un cuadro que se esta movimiento n... // ... veces que se llame esta función glPushMatrix(); glTranslatef( x, y, 0);//traslada cuadro( cuadroNegro, 0.0, 0.0, 0.0 ); // cuadros pequeños de color negro para el tablero glPopMatrix(); } void key(unsigned char c, int x, int y) { int siAvanzo = 0; // verifica si se puede avanzar la G para entonces cambiar de color a G if ( c == 27 ) exit(0); // mueve G una posición a la izquierda al presionar 'a' o 'A' if ( (c == 'a' || c == 'A') && xG > 181 ) { xG = xG - 74; siAvanzo = 1; } // mueva G una posición a la derecha al presionar 'd' o 'D' if ( (c =='d' || c == 'D') && xG < 625 ) { xG = xG + 74; siAvanzo = 1; } // mueve G una posición hacia abajo al presionar 's' o'S' if ( (c =='s' || c == 'S') && yG > 109 ) { yG = yG - 74; siAvanzo = 1; } // mueve G una posición hacia arriba al presionar 'w' o 'W' if ( (c =='w' || c == 'W') && yG < 624 ) { yG = yG + 74; siAvanzo = 1; } if( siAvanzo == 1 ) // si G avanza entonces cambia de color, su fondo { if( confirmaCambia == 0 ) { bnG = 0; // negro // si bnG es negro, se permite cambiar a blanco en el sig movimiento de G confirmaCambia = 1; } else bnG = 1; // blanco } glutPostRedisplay(); } void display(void){ int i, j; // contador de for if( bnG == 1 ) // si bnG es blanco, se permite cambiar a negro en el sig movimiento de G confirmaCambia = 0; glClear( GL_COLOR_BUFFER_BIT ); // limpia, libera el buffer // Tablero parte blanca /*************************************************************/ glPushMatrix(); glTranslatef( ancho/2-1, alto/2+1, 0);//traslada cuadro( 296, 1.0, 1.0, 1.0 ); // color blanco del tablero glPopMatrix(); /*************************************************************/ int x, y; // coordenadas donde se traladarán los cuadritos negros // Tablero /*************************************************************/ x = 70 + cuadroNegro + 2*cuadroNegro; // cuadroNegro es la mitad de un lado del cuadrito y = alto - (70 + cuadroNegro); for ( i = 0; i < 8; ++i ) // recorre las filas o renglones { for( j = 0; j < 4; j++ ) // recorre las columnas de las filas { cuadritoNegro( x, y); // dibuja cada cuadrito negro x = x + 2*(2*cuadroNegro); // 2 por un lado completo de un cuadrito } y = y - 2*cuadroNegro; // cuadroNegro es la mitad de un lado del cuadrito if( i%2 != 0 ) x = 70 + cuadroNegro + 2*cuadroNegro; // cuadroNegro es la mitad de un lado del cuadrito else x = 70 + cuadroNegro; // cuadroNegro es la mitad de un lado del cuadrito } /*************************************************************/ // movimientos de G a través del tablero /** ------------------------------------------------------- **/ glPushMatrix(); glTranslatef( xG, yG, 0);//traslada glScalef( 0.76, 0.76, 1.0 ); // para escalar reduciendo el logo de la G logoG(bnG); // trae el logo de la letra G de Google glPopMatrix(); /** ------------------------------------------------------- **/ glFlush(); // libera memoria } int main(int argc, char** argv){ glutInit(&argc, argv); // Inicializa la libreria GLUT // glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB ); glutInitWindowSize( ancho, alto ); // Inicializa el tamaño de la ventana glutInitWindowPosition(10,50); // posicion de la ventana glutCreateWindow("Tablero de Ajedrez con G"); // crea la ventana glClearColor( 2.0/255.0, 75.0/255.0, 123.0/255.0, 0); // establece el color de fondo de la ventana gluOrtho2D( 0, ancho, 0, alto ); // glutDisplayFunc(display); Aqui le indicamos a GLUT que la rutina // utilizada como Display sera la llama display. Este tipo de rutinas se // ejecuta una vez por ciclo de programa, y será la que realice // todas las operaciones gráficas (render). // glutDisplayFunc(display); // ciclo de la aplicación glutDisplayFunc(display); glutKeyboardFunc(key); glutMainLoop(); return 0; return 0; }
lunes, 20 de febrero de 2017
Tarea 4 Ajedrez con G - Edgar
Suscribirse a:
Comentarios de la entrada (Atom)
No hay comentarios.:
Publicar un comentario