Título: Transformaciones geometricas en open gl Publicado por: V_Dan en 16 Septiembre 2012, 06:02 am Hola!
Es que necesito de su ayuda, tengo un código que me permite girar la figura con un menú, pero lo que pasa es que tiene que Rotar, escalar y Trasladar; Como hago para que rote pero en su mismo lugar, por que esta me aparece en la esquina de la pantalla y en la escala se me deforma totalmente Agradezco su ayuda CÓDIGO: #include <iostream> #include <GL/glut.h> #include <stdlib.h> using namespace std; int click[2] = {0,0}; void menuaplicacion(int); void operaciones (float p[2], float p1[2]) //Parámetros de Entrada { float R[3][3]={1,0,0, 0,1,0, 0,0,1}; p1[0]= R[0][0]*p[0]+ R[0][1]*p[1] + R[0][2]*1; p1[1]= R[1][0]*p[0]+ R [1][1]*p[1] + R[1][2]*1; return; } //Para rotar float q0[2]={click
float b0[2] ,b1[2] ,b2[2],b3[2],b4[2],b5[2], r[2]; float ang; void rotacion2D (float p[2], float p1[2], float ang) { float R[3][3]={0,0,0, 0,1,0, 0,0,1}; float theta; theta=ang*3.1415/180; R[0][0]=cos(theta); R[0][1]=-sin(theta); R[1][0]=sin(theta); R[1][1]=cos(theta); p1[0]= R[0][0]*p[0]+ R
return; } // Para Traslacion /*void traslacion2D (float p[2], float p1[2], float s[2]) { float T[3][3]={0,0,0, 0,1,0, 0,0,1}; T[0][1]=t[0]; //s[0] es tx T[1][0]=t[1]; //s[1] es ty p1[0]= T[0][0]*p[0]+ T
float b0[2] ,b1[2] ,b2[2],b3[2],b4[2],b5[2], t[2]; return; } */ //Para Escalado float s[2]; void escalado2D (float p[2], float p1[2], float s[2]) { float S[3][3]={0,0,0, 0,1,0, 0,0,1}; S[0][0]=s[0]; //s[0] es sx S[1][1]=s[1]; //s[1] es sy p1[0]= S[0][0]*p[0]+ S
return; } //********************************************EMPIEZA FORMALMENTE EL TRABAJO **************************************************************** void init(void) { glClearColor(0.0,0.0,0.0,0.0); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,500.0,0.0,500.0); int submenu1,submenu2,submenu3,submenu4; submenu1=glutCreateMenu(menuaplicacion); glutAddMenuEntry("45", 1); glutAddMenuEntry("-45", 2); submenu2=glutCreateMenu(menuaplicacion); glutAddMenuEntry("Doble", 3); glutAddMenuEntry("Mitad", 4); submenu3=glutCreateMenu(menuaplicacion); glutAddMenuEntry("Al Origen", 5); glutAddMenuEntry("Posicion Inicial", 6); submenu4=glutCreateMenu(menuaplicacion); glutAddMenuEntry("Retornar Posicion Inicial", 7); glutAddMenuEntry("Desde 0", 8); glutCreateMenu(menuaplicacion); glutAddSubMenu("Rotar",submenu1); glutAddSubMenu("Escalar",submenu2); glutAddSubMenu("Trasladar",submenu3); glutAddSubMenu("Reiniciar",submenu4); glutAttachMenu(GLUT_RIGHT_BUTTON); glutAttachMenu(GLUT_MIDDLE_BUTTON); } void ejesguia() { glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0,1.0,0.0); glBegin(GL_LINES); glPointSize(0.8); glVertex2i(30,30); glVertex2i(30,470); glVertex2i(30,30); glVertex2i(470,30); glEnd(); glFlush(); } void mouse(int button, int state, int x=0, int y=0) { if (state==0) return; y =500-y; if (state == 1 && click[0]==0 && click[1]==0) { click
} cout<<"Coordenada en X guardada"<<click[0]<<endl; cout<<"Coordenada en Y guardada"<<click[1]<<endl; glColor3f (0.73, 0.25, 0.83); glBegin (GL_POLYGON); glVertex2f(click
glEnd (); glFlush(); } void menuaplicacion(int value) { if(value==1) { // Rota mas 45 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); ejesguia(); glutMouseFunc(mouse); ang= 45; rotacion2D(q0,b0,ang); rotacion2D(q1,b1,ang); rotacion2D(q2,b2,ang); rotacion2D(q3,b3,ang); rotacion2D(q4,b4,ang); glColor3f(0.50,0.21,0.42); glBegin(GL_POLYGON); glVertex2fv(b0); glVertex2fv(b1); glVertex2fv(b2); glVertex2fv(b3); glEnd(); glFlush(); } if(value==2) { // Rota -45 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); ejesguia(); glutMouseFunc(mouse); ang= -45; rotacion2D(q0,b0,ang); rotacion2D(q1,b1,ang); rotacion2D(q2,b2,ang); rotacion2D(q3,b3,ang); rotacion2D(q4,b4,ang); glColor3f(0.50,0.21,0.42); glBegin(GL_POLYGON); glVertex2fv(b0); glVertex2fv(b1); glVertex2fv(b2); glVertex2fv(b3); glVertex2fv(b4); glVertex2fv(b5); glEnd(); glFlush(); } if(value==3) { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); ejesguia(); glutMouseFunc(mouse); s[0]=2; s[1]=2; escalado2D(q0,b0,s); escalado2D(q1,b1,s); escalado2D(q2,b2,s); escalado2D(q3,b3,s); escalado2D(q4,b4,s); glColor3f(1,1,0); glBegin(GL_POLYGON); glVertex2fv(b0); glVertex2fv(b1); glVertex2fv(b2); glVertex2fv(b3); glEnd(); glFlush(); } if(value==4) { // Mitad glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); ejesguia(); glutMouseFunc(mouse); s[0]=0.5; s[1]=0.5; escalado2D(q0,b0,s); escalado2D(q1,b1,s); escalado2D(q2,b2,s); escalado2D(q3,b3,s); escalado2D(q4,b4,s); glColor3f(1,1,0); glBegin(GL_POLYGON); glVertex2fv(b0); glVertex2fv(b1); glVertex2fv(b2); glVertex2fv(b3); glEnd(); glFlush(); } if(value==5) { // (0;0) glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); ejesguia(); glutMouseFunc(mouse); } if(value==6) { // (xo,yo) glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); ejesguia(); glutMouseFunc(mouse); } if(value==7) { //Posición Inicial glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); ejesguia(); glutMouseFunc(mouse); } if(value==8) { // Desde0 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); ejesguia(); glutMouseFunc(mouse); } } // FINMenú //Main int main (int argc,char** argv) { int menu, submenu1; //iniciacion de GLUT y pantalla glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowPosition(50,100); glutInitWindowSize(500,500); glutCreateWindow("Transformaciones"); glutMouseFunc(mouse); glutDisplayFunc (ejesguia); glutReshapeWindow (500,500); init(); glutMainLoop(); }//Findel Main |