计算机图形学二维图形变换

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

宁夏师范学院数学与计算机科学学院《计算机图形学》实验报告实验序号:7实验项目名称:二维图形变换学号姓名专业、班实验地点指导教师时间一、实验目的1、通过二维几何变换的数学模型,编写缩放、旋转、对称变换;2、实现图形变换的交互式操作:缩放、旋转、对称变换等;二、实验内容与步骤1、放大缩小变换放大缩小变换公式为:x’=x.Sx,y’=y.Sy;其中Sx,Sy分别为x,y方向的放缩比例系数。变换矩阵表达式为:[x’y’1]=[xy1]可通过下面不同的比例系数来显示程序运行结果。(1)Sx=Sy=1.5;等比例放大(2)Sx=Sy=0.5;等比例缩小2、对称变换包括以x轴对称、y轴对称和原点O对称三种。由于屏幕坐标只有第一象限,我们可以将原点平移到(500,240)处。在第一象限画出一个三角形,然后分别求出三个对称图形。3、旋转变换将图形上的点(x,y)旋转θ角度,得到新的坐标(x’,y’)为:x’=xcosθ-ysinθ,y’=xsinθ+ycosθ;变换矩阵表示为:[x’y’1]=[xy1]三、实验步骤1、通过二维几何变换的数学模型,编写缩放、旋转、对称变换;2、以(500,240)为原点建立图形变换的参考坐标系;3、通过键盘按键控制图形的缩放、旋转、对称变换;4、变换图形设定为以Pt[0](540,220)、Pt[1](670,130)、Pt[2](560,120)为顶点的三角形。步骤:1.建立Trans工程文件;2.利用ResourceView设计菜单,如图所示;Sx000Sy0001cosθsinθ0-sinθcosθ0001菜单菜单项ID值图形变换(&T)缩放(&Z)ID_TRANSFORM_SCALE图形变换(&T)旋转(&R)ID_TRANSFORM_ROTATE图形变换(&T)对称(&S)ID_TRANSFORM_SYMMETRY4、在CTransView视图类中添加消息映射函数;对象消息函数ID_TRANSFORM_SCALECOMMANDOnFigureCirleID_TRANSFORM_ROTATECOMMANDOnFigureEllipseID_TRANSFORM_SYMMETRYCOMMANDOnTransformSymmetry5、添加自定义的成员变量:CPointPt[3];//三角形定点数组floatdAngle;//每一次旋转的角度在视图类CPP文件的构造函数中初始化成员变量Pt[0].x=540;Pt[0].y=220;Pt[1].x=670;Pt[1].y=130;Pt[2].x=560;Pt[2].y=120;dAngle=0;6、在视图类的OnDraw()函数中加入下列代码,实现视图绘图。voidCTransView::OnDraw(CDC*pDC){CTransDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);//TODO:adddrawcodefornativedatahere//绘出以以(540,220)、(670,130)、(560,120)为顶点的三角形。pDC-MoveTo(Pt[0]);pDC-LineTo(Pt[1]);pDC-LineTo(Pt[2]);pDC-LineTo(Pt[0]);//绘出以(500,240)为原点的坐标轴pDC-MoveTo(100,240);pDC-LineTo(900,240);pDC-MoveTo(500,5);pDC-LineTo(500,400);pDC-TextOut(900,235,x轴);pDC-TextOut(500,400,y轴);//控制信息pDC-TextOut(15,10,对称变换:键盘方向键);pDC-TextOut(15,28,缩放变换:Z键缩小;X键放大);pDC-TextOut(15,46,旋转变换:键盘R键);}7、添加预编译常量#definePI3.14159268、分别编写步骤3中向视图类中添加消息映射函数,程序如下:voidCTransView::OnTransformRotate(){//TODO:AddyourcommandhandlercodeherefloatdRadiusAngle=30.0*PI/180.0;for(inti=0;i3;i++){Pt[i].x=Pt[i].x*cos(dRadiusAngle)-Pt[i].y*sin(dRadiusAngle);Pt[i].y=Pt[i].x*sin(dRadiusAngle)+Pt[i].y*cos(dRadiusAngle);}RedrawWindow();}//实现图形旋转voidCTransView::OnTransformScale(){//TODO:AddyourcommandhandlercodeherefloatdScaleX=2.0;floatdScaleY=0.5;for(inti=0;i3;i++){Pt[i].x*=dScaleX;Pt[i].y*=dScaleY;}RedrawWindow();}//实现图形缩放voidCTransView::OnTransformSymmetry(){//TODO:Addyourcommandhandlercodeherefor(inti=0;i3;i++){Pt[i].x+=Pt[i].x;Pt[i].y+=Pt[i].y;}RedrawWindow();}//实现图形对称9、添加成员函数实现键盘交互式控制图形变换函数及代码如下:voidCTransView::OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags){//TODO:Addyourmessagehandlercodehereand/orcalldefaultinti=0;CPointTmpPt=Pt[0];switch(nChar){caseVK_UP://上for(i=0;i3;i++){Pt[i].y=240-(Pt[i].y-240);}break;caseVK_DOWN://下for(i=0;i3;i++){Pt[i].y=240-(Pt[i].y-240);}break;caseVK_LEFT://左for(i=0;i3;i++){Pt[i].x=500-(Pt[i].x-500);}break;caseVK_RIGHT://右for(i=0;i3;i++){Pt[i].x=500-(Pt[i].x-500);}break;case0X5A://Z的ASCII码Pt[1]=Pt[1]-Pt[0];Pt[2]=Pt[2]-Pt[0];Pt[0].x=Pt[0].y=0;for(i=1;i3;i++){Pt[i].x*=0.5;Pt[i].y*=0.5;}Pt[0]=TmpPt;Pt[1]=Pt[1]+Pt[0];Pt[2]=Pt[2]+Pt[0];break;case0X58://X的ASCII码Pt[1]=Pt[1]-Pt[0];Pt[2]=Pt[2]-Pt[0];Pt[0].x=Pt[0].y=0;for(i=1;i3;i++){Pt[i].x*=2.0;Pt[i].y*=2.0;}Pt[0]=TmpPt;Pt[1]=Pt[1]+Pt[0];Pt[2]=Pt[2]+Pt[0];break;case0X52://R的ASCII码dAngle=-1.0;//每一次逆时针旋转一度floatdRadiusAngle=dAngle*PI/180.0;Pt[1]=Pt[1]-Pt[0];Pt[2]=Pt[2]-Pt[0];Pt[0].x=Pt[0].y=0;for(inti=1;i3;i++)//由于CPoint的x和y坐标值都为正值,所以如果计算出是负值来时,就直接赋0{Pt[i].x=(float)Pt[i].x*cos(dRadiusAngle)-(float)Pt[i].y*sin(dRadiusAngle);Pt[i].y=(float)Pt[i].x*sin(dRadiusAngle)+(float)Pt[i].y*cos(dRadiusAngle);}Pt[0]=TmpPt;Pt[1]=Pt[1]+Pt[0];Pt[2]=Pt[2]+Pt[0];break;}RedrawWindow();CView::OnKeyDown(nChar,nRepCnt,nFlags);}10、编译和运行程序,查看程序运行结果三、运行结果变换前:对称变换:缩放变换:旋转变换:五、教师评语签名:日期:年月日成绩

1 / 6
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功