几何变换.docx
- 文档编号:7341091
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:6
- 大小:245.19KB
几何变换.docx
《几何变换.docx》由会员分享,可在线阅读,更多相关《几何变换.docx(6页珍藏版)》请在冰豆网上搜索。
几何变换
《计算机图形学实验》报告
)
2016年春季学期
实验:
几何变换
实验时间:
2016年11月17日
实验地点:
信息学院2204
实验目的:
掌握几何变换
程序代码:
#include
#include
#include
GLsizeiwinWidth=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;row++)
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 temp=matComposite[0][0]*verts[k].x+matComposite[0][1]* verts[k].y+matComposite[0][2]; verts[k].y=matComposite[1][0]*verts[k].x+matComposite[1][1]* verts[k].y+matComposite[1][2]; verts[k].x=temp; } } voidtriangle(wcPt2D*verts) { GLintk; glBegin(GL_TRIANGLES); for(k=0;k<3;k++) glVertex2f(verts[k].x,verts[k].y); glEnd(); } voiddisplayFcn(void) { GLintnVerts=3; wcPt2Dverts[3]={{50.0,25.0},{150.0,25.0},{100.0,100.0}}; wcPt2DcentroidPt; GLintk,xSum=0,ySum=0; for(k=0;k xSum+=verts[k].x; ySum+=verts[k].y; } centroidPt.x=GLfloat(xSum)/GLfloat(nVerts); centroidPt.y=GLfloat(ySum)/GLfloat(nVerts); wcPt2DpivPt,fixedPt; pivPt=centroidPt; fixedPt=centroidPt; GLfloattx=0.0,ty=100.0; GLfloatsx=0.5,sy=0.5; GLdoubletheta=pi/2.0; glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0,0.0,1.0); triangle(verts); matrix3x3SetIdentity(matComposite); scale2D(sx,sy,fixedPt); rotate2D(pivPt,theta); translate2D(tx,ty); transformVerts2D(nVerts,verts); glColor3f(1.0,0.0,0.0); triangle(verts); glFlush(); } voidwinReshapeFcn(GLintnewWidth,GLintnewHeight) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(xwcMin,xwcMax,ywcMin,ywcMax); glClear(GL_COLOR_BUFFER_BIT); } voidmain(intargc,char**argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowPosition(50,50); glutInitWindowSize(winWidth,winHeight); glutCreateWindow("GeometricTransformationSequence"); init(); glutDisplayFunc(displayFcn); glutReshapeFunc(winReshapeFcn); glutMainLoop(); } 实验结果:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 几何 变换