domingo, 23 de marzo de 2014

Práctica.- Eventos del Mouse

La práctica presentada a continuación pretende realizar una pequeña demostración acerca del funcionamiento del mouse mediante los métodos motion y mousebutton con los cuales es posible programar determinadas acciones mediante el clic o el deslizamiento del puntero.

El funcionamiento consiste en lo siguiente:
     1. Al hacer clic en cualquier lugar de la pantalla, debe dibujarse un rectángulo.
     2. al hacer clic, dejar presionado el botón y arrastrarlo sobre la pantalla, debe desplazarse el rectángulo.

El código utilizado se muestra a continuación:
---------------------------------------------------------------------------------------
#include <GL/gl.h>
#include <GL/glut.h>
#include <iostream>
#include <math.h>
#include <stdlib.h>

using namespace std;

#define NP 4000
#define AGE 200

float winWid,winHeight;// Determinará el tamaño de la ventana.
float rx,ry;//Determina la posicion en la que se encuentra el puntero del raton.

void redraw( void ){//Este metodo es para dibujar el rectángulo
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0,1.0,0.0);//determina el color del rectangulo a dibujar.
    glRectf(-10.0+rx,-10.0+ry,10.0+rx,10.0+ry);//Dibuja un rectangulo de acierto a dos vertices dados
    glutSwapBuffers();//Intercambia entre el buffer frontal y el buffer oculto
}

void motion(int x, int y){//Este método determina la posicion cuando se está moviendo el rectangulo
    cerr << "motion. x:" << x << ", y:" << y << " \n";
     rx = float(x);
     ry = winHeight - float(y);
}

void mousebutton(int button, int state, int x, int y){//Especifica la accion cuando se presiona un clic
    cerr << "mousebutton. x:" << x << ", y:" << y << " \n";
    if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN){
        rx = float(x);//Obtiene la posicion en x
        ry = winHeight - float(y);//Obtiene la posicion en y
        redraw();//Vuelve a dibujar el rectangulo
    }
}

int main(int argc, char *argv[]){
    winWid = 600.0;//determina el ancho de la ventana
    winHeight = 400.0;//determina el largo de la ventana.
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
    glutCreateWindow(" ");
    glutPositionWindow(200,100);
    glutReshapeWindow(int(winWid),int(winHeight));
    glClearColor(0.0,0.0,0.0,1.0);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0,winWid,0.0,winHeight, -100.0, 100.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glutDisplayFunc(redraw);
    glutIdleFunc(redraw);
    glutMotionFunc(motion);//Esta funcion permite seguir el movimiento en la ventana
    glutMouseFunc(mousebutton);//Esta funcion activa los movimientos del ratón.
    glutMainLoop();

    return 0;
}
---------------------------------------------------------------------------------------
Al finalizar podemos tener una secuencia de imágenes como la siguiente:

En esta secuencia de imágenes, se puede notar que en los círculos rojos se encuentran las coordenadas sobre las que hubo alguna acción con el ratón.

No hay comentarios.:

Publicar un comentario