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
- , click [1]};
- +100, click [1]};
- +100, click [1]+100};
- +50, click [1]+150};
- , click [1]+100};
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
- [1]*p[1] + R[0][2]*1;
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
- [1]*p[1] + T[0][2]*1;
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
- [1]*p[1] + S[0][2]*1;
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
- =x;
}
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
- , click [1]);
- +100, click [1]);
- +100, click [1]+100);
- +50, click [1]+150);
- , click [1]+100);
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