OpenGL三角形几何变换
2015-10-30 11:38
357 查看
#include<GL/glut.h> //三角形几何变换 #include<stdlib.h> #include<math.h> #include<stdio.h> typedef double matrix3x3 [3][3]; //?????????? matrix3x3 commatrix; const double pi=3.1415926; int w=600; int h=600; class position { public: GLfloat x,y; }; void triangle(position *vertex) { int k; glBegin(GL_TRIANGLES); for(k=0;k<3;k++) { glVertex2f(vertex[k].x,vertex[k].y); //printf("---end:%lf %lf \n",vertex[k].x,vertex[k].y); } glEnd(); } void matrixsetidentity(matrix3x3 matrix) { for(int i=0;i<3;i++) for(int j=0;j<3;j++) { if(i==j) matrix[i][j]=1.0; else matrix[i][j]=0.0; } } void matrixmultiply(matrix3x3 m1) { matrix3x3 m2; for(int i=0;i<3;i++) for(int j=0;j<3;j++) m2[i][j]=m1[i][0]*commatrix[0][j]+m1[i][1]*commatrix[1][j]+m1[i][2]*commatrix[2][j]; for(int m=0;m<3;m++) for(int n=0;n<3;n++) commatrix[m] =m2[m] ; } void scale(void) { matrix3x3 matrix3; matrixsetidentity(matrix3); matrix3[0][0]=1; matrix3[1][1]=1; matrixmultiply(matrix3); //矩阵复合 } void rotate(void) { double theta=pi/3.0; matrix3x3 matrix1; matrixsetidentity(matrix1); matrix1[0][0]=cos(theta); matrix1[0][1]=-sin(theta); matrix1[1][0]=sin(theta); matrix1[1][1]=cos(theta); matrixmultiply(matrix1); } void translate(void) { matrix3x3 matrix1; matrixsetidentity(matrix1); matrix1[0][2]=100; matrix1[1][2]=100; matrixmultiply(matrix1); } void transform(position* vertex) { int i,j; /*printf("complex matrix:\n"); for(i=0;i<3;i++) { for(j=0;j<3;j++) printf("%lf ",commatrix[i][j]); printf("\n"); } printf("origin matrix:\n"); for(int m=0;m<3;m++) { printf(" ^%lf %lf \n",vertex[m].x,vertex[m].y); } */ for(int p=0;p<3;p++) { vertex[p].x=commatrix[0][0]*vertex[p].x+commatrix[0][1]*vertex[p].y+commatrix[0][2]; vertex[p].y=commatrix[1][0]*vertex[p].x+commatrix[1][1]*vertex[p].y+commatrix[1][2]; //printf("->%lf %lf \n",vertex[p].x,vertex[p].y); } } void display(void) { glClearColor(0.0,0.0,0.0,0.0); glClear(GL_COLOR_BUFFER_BIT); position vertex[3]={{100.0,200.0},{150.0,100.0},{200.0,250.0}}; glColor3f(0.0,1.0,0.0); /*for(int i=0;i<3;i++) { printf("begin:%lf %lf \n",vertex[i].x,vertex[i].y); } */ triangle(vertex); //绘制初始三角形 matrixsetidentity(commatrix); //初始化该矩阵为单位矩阵 //根据变换序列重建复合矩阵 scale(); rotate(); translate(); glColor3f(1.0,0.0,0.0); transform(vertex); glColor3f(1.0,0.0,0.0); triangle(vertex); glFlush(); } void winreshapefunc(int w,int h) { glMatrixMode(GL_PROJECTION); //指明将投影矩阵作为当前矩阵 glLoadIdentity(); //它保证每次进入投影模式时矩阵重新设定为单位矩阵 gluOrtho2D(-200,400,-200,400); glClear(GL_COLOR_BUFFER_BIT); } int main(int argc,char* argv[]) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE); glutInitWindowPosition(50,50); glutInitWindowSize(600,600); glutCreateWindow("2_dimention_transform"); glutDisplayFunc(display); glutReshapeFunc(winreshapefunc); glutMainLoop(); return 0; }
相关文章推荐
- hadoop2.7.1文基础操作测试
- Linux的shell
- linux 终止用户会话
- Sensu监控实战
- 帝国CMS灵动标签e:loop的使用
- CentOS各版本挂载光盘做yum源安装
- 安全运维访谈录
- shell 执行expect
- Docker使用桥接的通信方案
- 大型网站系统架构演化之路
- Linux命令行上执行操作,不退回命令行的解决方法
- CentOS7安装MySQL5.6详细步骤
- linux内核注意事项
- hadoop生态系统组件目前的理解(先记录,有些地方理解不正确,后面修改)
- Linux必备技能:vi的使用
- CentOS和ubuntu修改hostname的区别
- 使用Rest工具向OpenStack消息发送指导
- Hadoop2.x集群动态添加删除数据节点
- 关于openstack部分计算节点无法实现热迁移问题描述
- 重命名USB磁盘挂载分区卷标