domingo, 30 de septiembre de 2007

Reporte Practica 5 (LABORATORIO)

1.- ¿Qué es diseño orientado a eventos?

La programación dirigida por eventos es un paradigma de programación en el que tanto la estructura como la ejecución de los programas van determinados por los sucesos que ocurran en el sistema o que ellos mismos provoquen.

Para entender la programación dirigida por eventos, podemos oponerla a lo que no es: mientras en la programación secuencial (o estructurada) es el programador el que define cuál va a ser el flujo del programa, en la programación dirigida por eventos será el propio usuario --o lo que sea que esté accionando el programa-- el que dirija el flujo del programa. Aunque en la programación secuencial puede haber intervención de un agente externo al programa, estas intervenciones ocurrirán cuando el programador lo haya determinado, y no en cualquier momento como puede ser en el caso de la programación dirigida por eventos.

El creador de un programa dirigido por eventos debe definir los eventos que manejará su programa y las acciones que se realizarán al producirse cada uno de ellos, lo que se conoce como el manejador de evento. Los eventos soportados estarán determinados por el lenguaje de programación utilizado, por el sistema operativo e incluso por eventos creados por el mismo programador. En la programación dirigid a por eventos, al comenzar la ejecución del programa se llevarán a cabo las inicializaciones y demás código inicial y a continuación el programa quedará bloqueado hasta que se produzca algún evento. Cuando alguno de los eventos esperados por el programa tenga lugar, el programa pasará a ejecutar el código del correspondiente manejador de evento. Por ejemplo, si el evento consiste en que el usuario ha hecho click en el botón de play de un reproductor de películas, se ejecutará el código del manejador de evento, que será el que haga que la película se muestre por pantalla.

2.- ¿Qué utilidad tiene el manejo de eventos en el desarrollo de aplicaciones gráficas?

Dan la libertad al usuario --o lo que sea que esté accionando el programa-- que dirija el flujo del programa

3.- Escriba un programa en el cual: - Al hacer click en la ventana se toman las coordenadas del mouse y se dibuja un punto. - Cada dos puntos acumulados se dibuja una linea. - Cada tres puntos acumulados se dubuja un triángulo. - Cada cuatro puntos acumulados dibuja un cuadrilatero. - Cada 5 o más puntos acumulados, dibuja un poligono. - El botón izquierdo del mouse limpia la ventana. OJO: checar la funcion glViewport para ajustar escalas dentro de la ventana.


Código:

/*laB. COMPUTACION GRÁFICA SEM, 20081
XImena Gutiérrez Vasques... Programa que dibuja figuras geometricas sencillas
según el número de clicks que detecte.. el boton izquierod dibuja, el boton derecho borra*/


#include
#include

float Ang=0;
int contador=0;
void Idle(void);
void init(void)
{
glClearColor (0.0, 0.0, 0.0, 0.0);
glShadeModel (GL_FLAT);
}

void processMouse(int boton, int estado, int x, int y) ///manejar al mouse evento dle mouse cuando se da click
{
switch (boton){ //Boton izquierdo
case GLUT_RIGHT_BUTTON:
switch (estado){
case GLUT_DOWN: //al presionarlo se reinicia el contador de clicks, se borra la pantalla
contador=0;
glutPostRedisplay ();
break;
}
break;
case GLUT_LEFT_BUTTON:// Boton derecho
switch (estado){
case GLUT_DOWN: // Al presionarlo imprime las coordenadas y dibuja una figura según el num. de clicks
printf("Posicion X: %d Posicion Y: %d",x,y);

contador++;

glutPostRedisplay ();

break;

}

break;
}

}


void display(void)
{

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glColor3f (1.0, 0.0, 0.0); /* clear the matrix */

gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
glScalef (1,1,1); /* modeling transformation */


if (contador==1) //1 click, dibuja un punto
{

glBegin(GL_POINTS);

glVertex2f(2,2) ;
glEnd();
}


if (contador==2) //2 click, dibuja unA LINEA
{

glBegin(GL_LINE_LOOP);
glVertex2f(0,0);
glVertex2f(0,1);


glEnd();

}

if (contador==3) //3 click, dibuja unA TRIANGULO
{
glBegin(GL_LINE_LOOP);
glVertex2f(0,0);

glVertex2f(1,0);

glVertex2f(0.5,1);



glEnd();
}

if (contador==4) //4 click, dibuja un CUADRITO
{
glBegin(GL_LINE_LOOP);
glVertex2f(0,0);
glVertex2f(0,1);
glVertex2f(1,1);
glVertex2f(1,0);

glEnd();
}

if (contador>=5) //5 click, dibuja un POLIGONO
{
glBegin(GL_POLYGON);

glVertex2f(0,0);
glVertex2f(0,1);
glVertex2f(1,3);
glVertex2f(1,0);
glEnd();
}


glutSwapBuffers();
glFlush ();

}

void reshape (int w, int h)
{
glViewport (0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode (GL_PROJECTION);
//glLoadIdentity ();
glFrustum (-1.0, 1.0, -1.0, 1.0, 1.5, 20.0);
glMatrixMode (GL_MODELVIEW);
}

/* ARGSUSED1 */
void keyboard(unsigned char key, int x, int y)
{
switch (key) {
case 27: //esc
exit(0);
break;
}
}


int main(int argc, char** argv)
{

glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);

glutInitWindowSize (700, 700);

glutInitWindowPosition (100, 100);
glutCreateWindow ("Reporte 5 ...XimenA");
init ();
glutDisplayFunc(display);
// glutDisplayFunc(Render);
//glutIdleFunc(Idle);
glutReshapeFunc(reshape);

//llamadas a eventos para manejar el mouse
glutMouseFunc(processMouse);

glutKeyboardFunc(keyboard);

glutMainLoop();
return 0;
}

void Idle(void)
{
Ang++;
display();
}













No hay comentarios: