《计算机图形学实验:二维图形变换(共9页).docx》由会员分享,可在线阅读,更多相关《计算机图形学实验:二维图形变换(共9页).docx(9页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上实验三 二维图形变换一、实验任务1 通过二维几何变换的数学模型,编写缩放、旋转、对称变换;2 实现图形变换的交互式操作:缩放、旋转、对称变换等;二、实验内容1. 放大缩小变换放大缩小变换公式为:x=x.Sx, y=y.Sy; 其中Sx, Sy分别为x,y方向的放缩比例系数。变换矩阵表达式为:Sx 0 00 Sy 00 0 1 x y 1=x y 1可通过下面不同的比例系数来显示程序运行结果。(1)Sx=Sy= 1.5;等比例放大(2)Sx=Sy= 0.5;等比例缩小2. 对称变换包括以x轴对称、y轴对称和原点O对称三种。由于屏幕坐标只有第一象限,我们可以将原点平移到(
2、500,240)处。在第一象限画出一个三角形,然后分别求出三个对称图形。3. 旋转变换将图形上的点(x,y)旋转角度,得到新的坐标(x,y)为: x=xcos-ysin, y=xsin+ycos;cos sin 0-sin cos 00 0 1变换矩阵表示为: x y 1=x y 14.三、设计思路1 通过二维几何变换的数学模型,编写缩放、旋转、对称变换;2 以(500,240)为原点建立图形变换的参考坐标系;3 通过键盘按键控制图形的缩放、旋转、对称变换;4 变换图形设定为以Pt0(540,220)、Pt1(670,130)、Pt2(560,120)为顶点的三角形。步骤:1. 建立Trans
3、工程文件;2. 利用Resource View设计菜单,如图所示;菜单菜单项ID值图形变换(&T)缩放(&Z)ID_TRANSFORM_SCALE图形变换(&T)旋转(&R)ID_TRANSFORM_ROTATE图形变换(&T)对称(&S)ID_TRANSFORM_SYMMETRY3. 在CTransView视图类中添加消息映射函数;对象消息函数ID_TRANSFORM_SCALECOMMANDOnFigureCirleID_TRANSFORM_ROTATECOMMANDOnFigureEllipseID_TRANSFORM_SYMMETRYCOMMANDOnTransformSymmetry
4、4. 添加自定义的成员变量:CPoint Pt3; /三角形定点数组float dAngle; /每一次旋转的角度 在视图类CPP文件的构造函数中初始化成员变量Pt0.x = 540; Pt0.y = 220;Pt1.x = 670; Pt1.y = 130;Pt2.x = 560; Pt2.y = 120;dAngle = 0;5. 在视图类的OnDraw()函数中加入下列代码,实现视图绘图。void CTransView:OnDraw(CDC* pDC)CTransDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw c
5、ode for native data here/绘出以以(540,220)、(670,130)、(560,120)为顶点的三角形。pDC-MoveTo(Pt0);pDC-LineTo(Pt1);pDC-LineTo(Pt2);pDC-LineTo(Pt0);/绘出以(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,对
6、称变换:键盘方向键); pDC-TextOut(15,28,缩放变换:Z键缩小;X键放大);pDC-TextOut(15,46,旋转变换:键盘R键);6. 添加预编译常量#define PI 3.7. 分别编写步骤3中向视图类中添加消息映射函数,程序如下:void CTransView:OnTransformRotate() / TODO: Add your command handler code herefloat dRadiusAngle = 30.0 * PI /180.0;for(int i=0; i3; i+)Pti.x = Pti.x * cos(dRadiusAngle) -
7、Pti.y * sin(dRadiusAngle);Pti.y = Pti.x * sin(dRadiusAngle) + Pti.y * cos(dRadiusAngle);RedrawWindow(); /实现图形旋转void CTransView:OnTransformScale() / TODO: Add your command handler code herefloat dScaleX = 2.0; float dScaleY = 0.5;for(int i=0; i3; i+)Pti.x *= dScaleX;Pti.y *= dScaleY;RedrawWindow(); /
8、实现图形缩放void CTransView:OnTransformSymmetry() / TODO: Add your command handler code herefor(int i=0; i3; i+)Pti.x += Pti.x;Pti.y += Pti.y;RedrawWindow(); /实现图形对称8. 添加成员函数实现键盘交互式控制图形变换函数及代码如下:void CTransView:OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) / TODO: Add your message handler code here and
9、/or call defaultint i=0;CPoint TmpPt = Pt0;switch (nChar)case VK_UP:/上for(i=0; i3; i+)Pti.y =240-(Pti.y-240);break;case VK_DOWN:/下for(i=0; i3; i+)Pti.y =240-(Pti.y-240);break;case VK_LEFT:/左for(i=0; i3; i+)Pti.x =500-(Pti.x-500);break;case VK_RIGHT:/右for(i=0; i3; i+)Pti.x =500-(Pti.x-500);break;case
10、 0X5A:/Z的ASCII码Pt1 = Pt1 - Pt0;Pt2 = Pt2 - Pt0;Pt0.x = Pt0.y = 0;for(i=1; i3; i+)Pti.x *= 0.5;Pti.y *= 0.5;Pt0 = TmpPt;Pt1 = Pt1 + Pt0;Pt2 = Pt2 + Pt0;break;case 0X58:/X的ASCII码Pt1 = Pt1 - Pt0;Pt2 = Pt2 - Pt0;Pt0.x = Pt0.y = 0;for(i=1; i3; i+)Pti.x *= 2.0;Pti.y *= 2.0;Pt0 = TmpPt;Pt1 = Pt1 + Pt0;Pt2
11、= Pt2 + Pt0;break;case 0X52 : /R的ASCII码dAngle = -1.0; /每一次逆时针旋转一度float dRadiusAngle = dAngle * PI /180.0;Pt1 = Pt1 - Pt0;Pt2 = Pt2 - Pt0;Pt0.x = Pt0.y = 0;for(int i=1; i3; i+)/由于CPoint的x和y坐标值都为正值,所以如果计算出是负值来时,就直接赋0Pti.x = (float)Pti.x * cos(dRadiusAngle) - (float)Pti.y * sin(dRadiusAngle);Pti.y = (float)Pti.x * sin(dRadiusAngle) + (float)Pti.y * cos(dRadiusAngle);Pt0 = TmpPt;Pt1 = Pt1 + Pt0;Pt2 = Pt2 + Pt0;break;RedrawWindow();CView:OnKeyDown(nChar, nRepCnt, nFlags);9. 编译和运行程序,查看程序运行结果四、实验效果及分析运行程序:按方向键“”:按方向键“”按“Z”键按“X”键按“R”键进行旋转变换时,发现三角形的形状会有略微变化。专心-专注-专业
限制150内