计算机图形图像学校:郑州大学学院:软件学院姓名:张浩学号:20097610470•第一:实验目的•第二:实现代码•第三:运行结果•第四:通过实验自身的感受和启发,即总结。•1.1构造二维旋转矩阵•在只知道对象的最后方向而不知道将对象放到这个位置所需要的旋转角度时,旋转矩阵的正交特性可用于构造矩阵。该方向信息可以根据与场景中某一对象对齐货有场景中选定的位置来确定。例如,我们可能要将以对象旋转使其与观察方向对称的轴对齐,或将一对像之上。下面的程序给出了一系列几何变换的实现实例。开始时,复合矩阵compMatrix是一个单位矩阵。在本例中,使用从左往右合并的次序来构造符合变换矩阵,且按其执行顺序调用变换子程序。在每一变换函数被调用是,为该变换建立矩阵并从左边去和复合矩阵相结合。在指定完所有变换后,使用复合矩阵对三角形进行变换。该三角形先对其中心位置进行缩放,然后绕气中心旋转,最后进行平移。2.1程序源代码如下:#include#include#includeGLsizeiwinWidth=600,winHeight=600;GLfloatxwcMin=0.0,xwcMax=225.0;GLfloatywcMin=0.0,ywcMax=225.0;classwcPt2D{public:GLfloatx,y;};typedefGLfloatMatrix3x3[3][3];Matrix3x3matComposite;constGLdoublepi=3.14159;voidinit(void){glClearColor(1.0,1.0,1.0,0.0);}voidmatrix3x3SetIdentity(Matrix3x3matIdent3x3){GLintrow,col;for(row=0;row<3;row++)for(col=0;col<3;col++)matIdent3x3[row][col]=(row==col);}voidmatrix3x3PreMultiply(Matrix3x3m1,Matrix3x3m2){GLintrow,col;Matrix3x3matTemp;for(row=0;row<3;row++)for(col=0;col<3;col++)matTemp[row][col]=m1[row][0]*m2[0][col]+m1[row][1]*m2[1][col]+m1[row][2]*m2[2][col];for(row=0;row<3;col++)for(col=0;col<3;col++)m2[row][col]=matTemp[row][col];}voidtranslate2D(GLfloattx,GLfloatty){Matrix3x3matTransl;matrix3x3SetIdentity(matTransl);matTransl[0][2]=tx;matTransl[1][2]=ty;matrix3x3PreMultiply(matTransl,matComposite);}voidrotate2D(wcPt2DpivotPt,GLfloattheta){Matrix3x3matRot;matrix3x3SetIdentity(matRot);matRot[0][0]=cos(theta);matRot[0][1]=-sin(theta);matRot[0][2]=pivotPt.x*(1-cos(theta))+pivotPt.y*sin(theta);matRot[1][0]=sin(theta);matRot[1][1]=cos(theta);matRot[1][2]=pivotPt.y*(1-cos(theta))-pivotPt.x*sin(theta);matrix3x3PreMultiply(matRot,matComposite);}voidscale2D(GLfloatsx,GLfloatsy,wcPt2DfixedPt){Matrix3x3matScale;matrix3x3SetIdentity(matScale);matScale[0][0]=sx;matScale[0][2]=(1-sx)*fixedPt.x;matScale[1][1]=sy;matScale[1][2]=(1-sy)*fixedPt.y;matrix3x3PreMultiply(matScale,matComposite);}voidtransformVerts2D(GLintnVerts,wcPt2D*verts){GLintk;GLfloattemp;for(k=0;k