lunes, 27 de febrero de 2017

Tarea animación y logo propio



#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;
}

No hay comentarios.:

Publicar un comentario