lunes, 20 de febrero de 2017

Práctica 1 Sol y Nube - Equipo




#include <windows.h>
#include <C:\GLUT\include\GL\glut.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#define PI 3.1415926535897932384626433832795

/** Descripcion: Sol formado por dos cuadros y un circulo que gira
 * y una nube formada por cuatro círculos que se desplaza, esto al
 * presionar las teclas 'a' o 'z'
 *
 * Autores:
 *  Edgar Villa
 *  Karina Miranda
 *  Abigail Romero
 *  Isabel Gaona
 * Fecha de creacion: 16/02/17
 * Revisiones: ---
 * Fecha de ultima actualizacion: 18/02/17
 */

float r,g,b,dx,dy;
int ancho = 500, alto = 500; // alto y ancho para la ventana
int inc = 1; // variable usada para trasladar la nube al presionar las teclas 'a' y 'z'
int giro = 0; // variable usada para rotar el sol al presionar las teclas 'a' y 'z'

/* dibua un cuadrao
*/
void cuadro( float lado, float r, float g, float b)
{
    glColor3f(r,g,b);
    glBegin(GL_POLYGON );
    glVertex2f(lado, lado);
    glVertex2f(-lado, lado);

    glColor3f(r-0.1,g-0.3,b);
    glVertex2f(-lado, -lado);
    glVertex2f(lado, -lado);
    glEnd();

}

/**
 * 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 key(unsigned char c, int x, int y)
{
    if (c==27)
        {
            exit(0);
        }
    if (c=='a')
    {
        inc= inc + 5;
        giro = giro + 5;
    }
    if (c=='z')
    {
        inc= inc - 5;
        giro = giro - 5;
    }

    // if para que la nube vuelva a aparecer del otro lado al llegar a un borde
    if( inc < -394 )
        inc = 286; // al llegar al borde izquierdo y desaparecer se va al borde derecho

    if( inc > 286 )
        inc = -394; // al llegar al borde derecho y desaparecer se va al borde izquierdo
    glutPostRedisplay();
}

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT);

    glPushMatrix();
        glRotatef(90 ,0,0,1);
        glTranslatef(0,100,0);//traslada
        glRotatef(giro ,0,0,1);
        glPushMatrix();
            cuadro(100,1,0.85,0);
    //cuadro(100,1,0.8,0);
            glRotatef(45,0,0,1);
            cuadro(100,1,0.9,0);
    // cuadro(100,1,0.7,0);
            circulo( 0,0, 100,1,0.9,0,0,2*PI+0.1);
            glPopMatrix();
    glPopMatrix();


    glPushMatrix(); //empieza de adentro hacia afuera
        glTranslatef(inc,0,0);
        glPushMatrix();
        glTranslatef(100,-60,0);
        circulo( 0, 0, 45, 1, 1, 1, 0, PI);
        glTranslatef(-30,30,0);
        circulo( 0, 0, 40,1,1,1, 0, PI+0.8);
        glTranslatef(-30,20,0);
        circulo( 0, 0, 40, 1, 1, 1, 0, PI+0.5);
        glTranslatef(-20,-50,0);
        circulo( 0, 0, 50,1,1,1, 0, PI);
    glPopMatrix();
    glPopMatrix();
    glFlush();
}

void Init()
{   glClearColor( 65.0/255.0, 161.0/255.0, 245.0/255.0,0);
    gluOrtho2D(-ancho/2,ancho/2,-alto/2,alto/2);
}

int main(int argc, char **argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowPosition(100,100);
    glutInitWindowSize(ancho,alto);
    glutCreateWindow("Sol con nube");

    Init();

    glutDisplayFunc(display);
    glutKeyboardFunc(key);
    glutMainLoop();
    return 0;
}

No hay comentarios.:

Publicar un comentario