sábado, 22 de marzo de 2014

Dibujar al dar clic secundario con el Mouse

En esta práctica hacemos uso del ratón mediante las instrucciones mousebutton() que nos permite obtener las coordenadas donde se realiza el clic y dibujar la figura seleccionada implementando el uso de un menú desplegable utilizando el clic secundario mediante glutAttachMenu y las funciones glutCreateMenu para crear el menú y con glutAddMenuEntry sus opciones.


#include <GL/gl.h>
#include <GL/glut.h>
#include <iostream>
#include <math.h>
#include <stdlib.h>//Importacion de librerarias

using namespace std; //Pues para mandar mensajes a pantala

#define NP 4000
#define AGE 200

float winWid,winHeight;
int rx,ry;//Declaracion de variables
float valores[30];
int count=0;
int countfig=0;
int figure[15];

//permitirá dibujar y recuperar la matriz 
void redraw(void){

    glClear(GL_COLOR_BUFFER_BIT);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();


    for(int i=0,j=0;i<count;i++,j++){
    glPushMatrix();
      double x=valores[i];
        i++;
      double y=valores[i];
        x=(x-250)/250;
        y=(y-250)/250;

      glTranslatef(x,y,0); //Mueve el punto de origen

      glColor3f(0.0,1.0,1.0);//Color

      if(figure[j]==1){
          glRotatef(55,9,22,0);
          glutWireCube(0.2);
       }
      if(figure[j]==2){
        glRotatef(45,0,1,1);
        glutWireSphere(.2,16,16);
      }
      if(figure[j]==3){
        glRotatef(60,1,0,0);
        glutWireTorus(0.05,0.15,12.0,32.0);
     }
     if(figure[j]==4)
       glutWireTeapot(0.2);

     if(figure[j]==5){
       glRotatef(60,1,0,0);
       glutWireCone(0.2,0.5,22.0,5.0);
     }
     if(figure[j]==6){
          glScalef(0.3,0.3,0.3);
          glRotatef(55,9,22,0);
          glutWireDodecahedron();
     }
     if(figure[j]==7){
            glScalef(0.2,0.2,0.1);
            glRotatef(45,0,1,1);
            glutWireIcosahedron();
     }

      glPopMatrix();

    }
    glFlush();
}



//metodo que nos permite obeter las coordenadas al dar clic izquierdo
void mousebutton(int button, int state, int x, int y){
    cerr << "mousebutton. x:" << x << ", y:" << y << " \n";
    if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN){
        rx = float(x);//debuelve el valor de donde se dio clic en el eje x
        ry = winHeight - float(y);//debuelve el valor donde se dio clic en el eje y

    }
}

//programar menu
void menu(int opc){
   switch(opc){
    case 1:
      valores[count]=rx;
      count++;
      valores[count]=ry;
      count++;
        figure[countfig]=1;
        countfig++;
        redraw();
    break;
    case 2:
      valores[count]=rx;
      count++;
      valores[count]=ry;
      count++;
        figure[countfig]=2;
        countfig++;
        redraw();
        break;
    case 3:
      valores[count]=rx;
      count++;
      valores[count]=ry;
      count++;
        figure[countfig]=3;
        countfig++;
        redraw();
    break;
    case 4:
      valores[count]=rx;
      count++;
      valores[count]=ry;
      count++;
        figure[countfig]=4;
        countfig++;
        redraw();
        break;
    case 5:
      valores[count]=rx;
      count++;
      valores[count]=ry;
      count++;
       figure[countfig]=5;
       countfig++;
       redraw();
    break;

    case 6:
      valores[count]=rx;
      count++;
      valores[count]=ry;
      count++;
        figure[countfig]=6;
        countfig++;
        redraw();
    break;

    case 7:
     valores[count]=rx;
     count++;
     valores[count]=ry;
     count++;
        figure[countfig]=7;
        countfig++;
        redraw();
    break;

     }

}


main(int argc, char *argv[]){
    winWid = 590.0;
    winHeight = 550.0;
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
    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();

    glutCreateMenu(menu);//crear menu
    glutAddMenuEntry("Cubo",1);//opcion del menú
    glutAddMenuEntry("Esfera",2);
    glutAddMenuEntry("Dona",3);
    glutAddMenuEntry("Tetera",4);
    glutAddMenuEntry("Cono",5);
    glutAddMenuEntry("Dodecaedro",6);
    glutAddMenuEntry("Icosaedro",7);

    glutAttachMenu(GLUT_RIGHT_BUTTON);//al presionar clic secundario

    glutDisplayFunc(redraw);
    glutMouseFunc(mousebutton);
    glutMainLoop();

}

Mover y dibujar

En esta ocasión se realizó un programa que permitiera mover la cruz y al momento de presionar un tecla especifica dibujará la figura programada y así sucesivamente. Esto se logra mediante el uso de la funciones anteriormente utilizadas glTranslate, glMatrixMode(GL_PROJECTION) y las instrucciones specialKeyInput y keyInput.


#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <iostream>
#endif

#include <stdlib.h>

using namespace std;
float radio=0.0;
float valor_x=0.0;
float valor_y=0.0;
int contador=0;
float posx[30];
float posy[30];
int cont=0;
int entra=0;


//La función que nos va estar dibujando
void Dib(){
    //if(entra==1){
    for(int cont=0;cont<contador;cont++){
        glTranslatef(posx[cont],posy[cont],0.0);
        glPushMatrix();
        glLineWidth(1);
        glRotatef(45,0,1,1);
        glColor3f(1.0,1.0,0.0);
        glutWireSphere(0.2,15,15);
        glPopMatrix();
        glFlush();
        //glutPostRedisplay();
        cerr <<" cont:" <<cont;
    }

    //}
   // entra=0;

    //glutPostRedisplay();
}

void Dibuja(){
    cerr << "Dibuja() " << " valor_x:" << valor_x << " valor_y:" << valor_y << "\n";
    glClearColor(0,0,0,0);
    glClear(GL_COLOR_BUFFER_BIT);
    /*GL_PROJECTION permite mover el punto de referencia (0,0,0) a donde se le indique*/
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    cerr <<"antes:" <<cont;

    Dib();

    cerr <<"despues:" <<cont;
    glColor3f(0.0,1.0,1.0);
    glLineWidth(3);
    glTranslatef(valor_x,valor_y,0.0);
    glBegin(GL_LINE_STRIP);
    glVertex2d(valor_x+30,valor_y);
    glVertex2d(valor_x-30,valor_y);
    glVertex2d(valor_x,valor_y);
    glVertex2d(valor_x,valor_y+30);
    glVertex2d(valor_x,valor_y-30);
    glEnd();

    glFlush();

}


void keyInput(unsigned char key, int x, int y){

    switch(key){
    case 'q':
            exit(0);
    break;
    case 'a':
        cerr << "keyInput()" << " key:" << key;
        posx[contador]={valor_x};
        posy[contador]={valor_y};
        contador++;
        //entra=1;
    break;
    }

}

void specialKeyInput(int key, int x, int y){
    if(key==GLUT_KEY_DOWN){
        valor_y=valor_y-0.1;
        if(valor_y<=-1)
            valor_y=-1;
    }
    if(key == GLUT_KEY_LEFT){
        valor_x=valor_x-0.1;
        if(valor_x<=-1)
            valor_x=-1;
    }
    if(key == GLUT_KEY_UP){
        valor_y=valor_y+0.1;
        if(valor_y>=1)
            valor_y=1;
    }
    if(key == GLUT_KEY_RIGHT){
        valor_x=valor_x+0.1;
        if(valor_x>=1)
            valor_x=1;
    }

    glutPostRedisplay();
}




int main(){
    cerr <<"main() \n";
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
    glutInitWindowSize(550,550);
    glutCreateWindow("");
    glutDisplayFunc(Dibuja);
    glutKeyboardFunc(keyInput);
    glutSpecialFunc(specialKeyInput);
    glutMainLoop();
}


Uso del Teclado para dibujar

En esta ocasión se realizó un programa que permite realizar una acción reconociendo las teclas arriba, abajo,izquierda y derecha de nuestro teclado, esto se logra haciendo uso de la instrucción specialKeyInput, así como cualquier tecla de nuestro teclado mediante la instrucción keyInput.



#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <iostream>
#endif

#include <stdlib.h>

using namespace std;
float radio=0.0;
float valor_x=0.0;
float valor_y=0.0;


//La función que nos va estar dibujando

void Dibuja(){
    cerr << "Dibuja() " << " valor_x:" << valor_x << " valor_y:" << valor_y << "\n";
    glClearColor(0,0,0,0);
    glClear(GL_COLOR_BUFFER_BIT);
    /*GL_PROJECTION permite mover el punto de referencia (0,0,0) a donde se le indique*/
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    glTranslatef(valor_x,valor_y,0.0);
    glRotatef(60,1,0,0);
    //glRotated(1,0,0,1);
    glColor3f(1.0,1.0,0.0);
    glutWireSphere(0.2,15,15);
    glFlush();
}

void keyInput(unsigned char key, int x, int y){
    switch (key){
    case 'q':
            exit(0);
            break;
    }
}

void specialKeyInput(int key, int x, int y){
    if(key==GLUT_KEY_DOWN){
        valor_y=valor_y-0.1;
        if(valor_y<=-1)
            valor_y=-1;
    }
    if(key == GLUT_KEY_LEFT){
        valor_x=valor_x-0.1;
        if(valor_x<=-1)
            valor_x=-1;
    }
    if(key == GLUT_KEY_UP){
        valor_y=valor_y+0.1;
        if(valor_y>=1)
            valor_y=1;
    }
    if(key == GLUT_KEY_RIGHT){
        valor_x=valor_x+0.1;
        if(valor_x>=1)
            valor_x=1;
    }

    glutPostRedisplay();
}



int main(){
    cerr <<"main() \n";
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
    glutInitWindowSize(590,590);
    glutCreateWindow("");
    glutDisplayFunc(Dibuja);
    glutKeyboardFunc(keyInput);
    glutSpecialFunc(specialKeyInput);
    glutMainLoop();
}


Traladar, Escalar, Rotar una Figura

En esta ocación se analizó el funcionamiento de glScale, glTranslate y glRotate, la primera función nos permite establecer la escala de la lo que se dibuje en el eje x,y,z; la segunda función nos permite trasladar nuestro punto de origen para dibujar al lugar que se le indique en los ejes x,y,z y por último la tercera función nos permite girar lo que se haya dibujado estableciendo el águlo,y los ejes x,y,z. Es importante mencionar que en OpenGl lo que dibujamos al final de un segmento de código es a lo que se le irán aplicando las funciones descritas hacia arriba.


#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <iostream>
#endif
#include <stdlib.h>


using namespace std;
//La función que nos va estar dibujando
void Dibuja(){
    cerr << "Dibuja()\n";
    glClearColor(0,0,0,0);
    glClear(GL_COLOR_BUFFER_BIT);
    /*GL_PROJECTION permite */
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    glPushMatrix();//guarda la matriz
    glTranslatef(-0.8,0.8,0.0);
    glScalef(1.5,1.5,1.5);//permite esblecer  una escala
    glRotatef(45,0,1,1);
    glColor3f(0.0,1.0,0.0);
    //glutSolidSphere(0.2,15,15); //dibuja la esfera solida
    glutWireSphere(0.2,15,15);
    glPopMatrix();//la guarda y la restaura

    glPushMatrix();
    glTranslatef(0.8,0.8,0.0);
    glColor3f(1.0,1.0,0.0);
    glutWireSphere(0.2,15,15);
    glPopMatrix();

    glPushMatrix();
    glTranslatef(0.8,-0.8,0.0);
    glColor3f(0.0,1.0,1.0);
    glutWireSphere(0.2,15,15);
    glPopMatrix();

    glPushMatrix();
    glTranslatef(-0.8,-0.8,0.0);
    glColor3f(0.0,0.0,1.0);
    glutWireSphere(0.2,15,15);
    glPopMatrix();

    glFlush();
}

int main(){
    cerr <<"main() \n";
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
    glutInitWindowSize(550,550);
    glutCreateWindow("");
    glutDisplayFunc(Dibuja);
    glutMainLoop();
}