用二维矩阵实现一些变换,下面代码有注释。。平移,错切,放大缩小是可以运行的。
但是,旋转就越旋越小,对称点完也没有反应。
请大神看一下哪里有错误..
#include
#include
#include
//旋转时用的sita
double sita1=3.14/3;
double sita2=-3.14/3;
//这个类定义了点
class Point2{
public:
GLfloat x,y,a;
};
//四个顶点赋初值
Point2 p[4]={{-0.5,0.5,1},{0.5,0.5,1},{0.5,-0.5,1},{-0.5,-0.5,1}};
//变换矩阵初值
GLfloat varyMatrix[3][3]={{1,0,0},{0,1,0},{0,0,1}};
//每进行一次变换,调用一次这个函数,矩阵相乘。
void VaryMatrix(){
for(int i=0;i<4;i++){
p[i].x=p[i].x*varyMatrix[0][0]+p[i].y*varyMatrix[1][0]+p[i].a*varyMatrix[2][0];
p[i].y=p[i].x*varyMatrix[0][1]+p[i].y*varyMatrix[1][1]+p[i].a*varyMatrix[2][1];
p[i].a=p[i].x*varyMatrix[0][2]+p[i].y*varyMatrix[1][2]+p[i].a*varyMatrix[2][2];
}
//恢复变换矩阵初始值
varyMatrix[0][0]=1;
varyMatrix[0][1]=0;
varyMatrix[0][2]=0;
varyMatrix[1][0]=0;
varyMatrix[1][1]=1;
varyMatrix[1][2]=0;
varyMatrix[2][0]=0;
varyMatrix[2][1]=0;
varyMatrix[2][2]=1;
}
//每进行一次变化后,调用这个函数,重新绘制图形
void reDraw(){
glClear(GL_COLOR_BUFFER_BIT);
//坐标轴
glBegin(GL_LINES);
glVertex2i(-1,0);
glVertex2i(1,0);
glVertex2i(0,-1);
glVertex2i(0,1);
glEnd();
//绘制矩形
glBegin(GL_LINE_LOOP);
glVertex2f(p[0].x,p[0].y);
glVertex2f(p[1].x,p[1].y);
glVertex2f(p[2].x,p[2].y);
glVertex2f(p[3].x,p[3].y);
glEnd();
glFlush();
}
//键盘响应函数
void keyFunc1(GLubyte key,GLint xMouse,GLint yMouse){
int i;
GLfloat t;
switch(key)
{
//旋转
case'q':
for(i=0;i<4;i++)
{
p[i].x=t;
p[i].x=p[i].x*cos(sita1)-p[i].y*sin(sita1);
p[i].y=t*sin(sita1)-p[i].y*cos(sita1);
}
glutPostRedisplay();
break;
//另一个方向旋转
case'w':
varyMatrix[0][0]=cos(sita2);
varyMatrix[0][1]=sin(sita2);
varyMatrix[0][2]=1;
varyMatrix[1][0]=-sin(sita2);
varyMatrix[1][1]=cos(sita2);
varyMatrix[1][2]=1;
VaryMatrix();
glutPostRedisplay();
break;
//X轴镜像
case'e':
varyMatrix[1][1]=-1;
VaryMatrix();
glutPostRedisplay();
break;
//Y轴镜像
case'r':
varyMatrix[0][0]=-1;
VaryMatrix();
glutPostRedisplay();
break;
//原点对称
case't':
varyMatrix[0][0]=-1;
varyMatrix[1][1]=-1;
VaryMatrix();
glutPostRedisplay();
break;
//错切X轴 可运行!!
case'a':
varyMatrix[1][0]=-0.5;
VaryMatrix();
glutPostRedisplay();
break;
//错切Y轴 可运行!!
case's':
varyMatrix[0][1]=-0.5;
VaryMatrix();
glutPostRedisplay();
break;
//错切原点 可运行!!!
case'd':
varyMatrix[1][0]=-1;
varyMatrix[0][1]=1;
VaryMatrix();
glutPostRedisplay();
break;
//放大 可运行!!!
case'z':
varyMatrix[1][1]=varyMatrix[0][0]=1.2;
VaryMatrix();
glutPostRedisplay();
break;
//缩小 可运行!!!
case'x':
varyMatrix[1][1]=varyMatrix[0][0]=0.83;
VaryMatrix();
glutPostRedisplay();
break;
}
}
//上下左后键
void keyFunc2(GLint key,GLint xMouse,GLint yMouse){
switch(key){
case GLUT_KEY_UP:
varyMatrix[2][1]=0.2;
VaryMatrix();
glutPostRedisplay();
break;
case GLUT_KEY_DOWN:
varyMatrix[2][1]=-0.2;
VaryMatrix();
glutPostRedisplay();
break;
case GLUT_KEY_LEFT:
varyMatrix[2][0]=-0.2;
VaryMatrix();
glutPostRedisplay();
break;
case GLUT_KEY_RIGHT:
varyMatrix[2][0]=0.2;
VaryMatrix();
glutPostRedisplay();
break;
}
}
int main(int argc, char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowPosition(50,100);
glutInitWindowSize(550, 550);
glutCreateWindow("键盘响应!qw(旋转)ert(对称)asd(错切)zx(放大缩小)上下左右键移动方向");
glClearColor(0.0,0.0,0.0,1);
glutKeyboardFunc(keyFunc1);
glutSpecialFunc(keyFunc2);
glutDisplayFunc(reDraw);
glutMainLoop();
return 0;
}