您的位置:首页 > 运维架构

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: