martes, 18 de septiembre de 2007

Previo 5 (LABORATORIO)

1.- Escriba una aplicación que usando la librería gluut detecte que se ha realizado un click con el botón derecho del mouse sobre la ventana principal e imprima las coordenadas del mouse en la salida estándar.

-cuando se haga click con el botón izquierdo, cierre la aplicación. Nota: usar getMopuseFunc()

código:

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_LEFT_BUTTON:
switch (estado){
case GLUT_DOWN: //al presionarlo se sale de la aplicacion
exit(0);
break;
}
break;
case GLUT_RIGHT_BUTTON:// Boton derecho
switch (estado){
case GLUT_DOWN: // Al presionarlo imprime las coordenadas
printf("Posicion X: %d Posicion Y: %d",x,y);
break;

}
break;
}
glutPostRedisplay ();
}

void display(void) //no se dibuja nada
{

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

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 ("0");
init ();
glutDisplayFunc(display);
// glutDisplayFunc(Render);
//glutIdleFunc(Idle);
glutReshapeFunc(reshape);

//llamadas a eventos para manejar el mouse, en est eprograma solo s eusa la primera
glutMouseFunc(processMouse);

glutMotionFunc(processMouseActiveMotion);
glutPassiveMotionFunc(processMousePassiveMotion);
glutEntryFunc(processMouseEntry);
glutKeyboardFunc(keyboard);



glutMainLoop();
return 0;
}

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

2.- Escriba una aplicación que cada 5 segundos abra una nueva ventana y como título ponga en tiempo en que se creó.

Al apretar el botón izquierdo del mouse, para le contador

Al apretar el botón derecho reinicia el contador

Al apretar la tecla ESC cierra kla palicacion

Nota:usar glutimerfunc glutmousefunc y glutkeyboardfuunc

Código:

char buffer [30];
int titulo=1;
int contador=0;
int bandera=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_LEFT_BUTTON:
switch (estado){
case GLUT_DOWN: //al presionarlo se para el contador

bandera=1; //para parar el contador
break;
}
break;
case GLUT_RIGHT_BUTTON:// Boton derecho
switch (estado){
case GLUT_DOWN: // Al presionarlo imprime las coordenadas
printf("Posicion X: %d Posicion Y: %d",x,y);
contador=0; //al presioanrlo se resetea el contador
bandera=0; //al presioanrlo se inicia el contador si e sque estaba detenido
break;

}
break;
}
glutPostRedisplay ();
}

void display(void)
{

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
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;
}
}

void TimerFunction()
{
if (bandera==1) //si dan click izquierdo se detiene no hace nada (detiene el contador)
{
}
else{
contador=contador+5000; //se incremeenta el contador cada 5 seg
glutInitWindowPosition(200,200);
glutReshapeFunc(reshape);
glutCreateWindow(itoa(contador,buffer,10)); //la nueva ventana lleva el nombre del contador
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMouseFunc(processMouse); //para que detecte botones del mouse
glutKeyboardFunc(keyboard); //para que detecte teclado
}
//printf("contador:%d",contador);
glutTimerFunc(5000, TimerFunction, 28317); //llamadaa recursiva a la funcion
}

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

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

glutInitWindowSize (700, 700);

glutInitWindowPosition (100, 100);
glutCreateWindow ("0");
init ();
glutDisplayFunc(display);
// glutDisplayFunc(Render);
//glutIdleFunc(Idle);
glutReshapeFunc(reshape);

//llamadas a eventos para manejar el mouse, en est eprograma solo s eusa la primera
glutMouseFunc(processMouse);

glutMotionFunc(processMouseActiveMotion);
glutPassiveMotionFunc(processMousePassiveMotion);
glutEntryFunc(processMouseEntry);
glutKeyboardFunc(keyboard);

glutTimerFunc(5000, TimerFunction, 28317);

glutMainLoop();
return 0;
}


3.- ¿qué comando para manejo de eventos nos proporciona GLUT? Describa cada uno de estos

  • void glutButtonBoxFunc (void (*func)(int button, int state)): el glutButtonBoxFunc fija el servicio repetido del botón de la caja del dial y del botón para la ventana actual.

    glutButtonBoxFunc


  • void glutDialsFunc (void (*func)(int dial, int value)): el glutDialsFunc fija el servicio repetido de los diales de la caja del dial y del botón para la ventana actual.

  • void glutDisplayFunc (void (*func)(void)): el glutDisplayFunc fija el servicio repetido de la exhibición para la ventana actual.

  • void glutEntryFunc (void (*func)(int state)) el glutEntryFunc fija el ratón entra/el servicio repetido de la licencia para la ventana actual.

  • void glutIdleFunc (void (*func)(void)) el glutIdleFunc fija el servicio repetido ocioso global.

  • void glutKeyboardFunc (void (*func)(unsigned char key, int x, int y)) el glutKeyboardFunc fija el servicio repetido del teclado para la ventana actual.

  • void glutMenuStatusFunc (void (*func)(int status, int x, int y)) fija el servicio repetido global del estado del menú. glutMenuStatusFunc

  • void glutMotionFunc (void (*func)(int x, int y)) :el glutMotionFunc y el glutPassiveMotionFunc fijaron el movimiento y los servicios repetidos pasivos del movimiento respectivamente para la ventana actual.

  • void glutMouseFunc (void (*func)(int button, int state, int x, int y)) el glutMouseFunc fija el servicio repetido del ratón para la ventana actual.

  • void glutOverlayDisplayFunc (void (*func)(void)): el glutOverlayDisplayFunc fija el servicio repetido de la exhibición del recubrimiento para la ventana actual.

  • void glutReshapeFunc (void (*func)(int width, int height)): el glutReshapeFunc fija el servicio repetido de la nueva formación para la ventana actual.

  • void glutSpaceballButtonFunc (void (*func)(int button, int state)): el glutSpaceballButtonFunc fija el servicio repetido del botón de Spaceball para la ventana actual.

  • void glutSpaceballMotionFunc (void (*func)(int x, int y, int z)): el glutSpaceballMotionFunc fija el servicio repetido del movimiento de Spaceball para la ventana actual.

  • void glutSpaceballRotateFunc (void (*func)(int x, int y, int z)):el glutSpaceballRotateFunc fija el servicio repetido de la rotación de Spaceball para la ventana actual.

  • void glutSpecialFunc (void (*func)(int key, int x, int y)):el glutSpecialFunc fija el servicio repetido especial del teclado para la ventana actual.

  • void glutTabletButtonFunc (void (*func)(int button, int state, int x, int y)): el glutTabletButtonFunc fija el servicio repetido especial del teclado para la ventana actual.

  • void glutTabletMotionFunc (void (*func)(int x, int y)): el glutTabletMotionFunc fija el servicio repetido especial del teclado para la ventana actual.

  • void glutTimerFunc (unsigned int msecs, void (*func)(int value), value): el glutTimerFunc coloca un servicio repetido del contador de tiempo que se accionará en un número especificado de
  • milisegundos.

  • void glutVisibilityFunc (void (*func)(int state)): glutVisibilityFunc dispone la función de visibilidad dentro de la ventana actual. Esta función es llamada cuando la visibilidad en una ventana ha cambiado. El parámetro estado puede ser GLUT_NOT_VISIBLE o GLUT_VISIBLE dependiendo en la la visibilidad actual de la ventana.

No hay comentarios: