计算机图形学二维图形基本变换实验原理,计算机图形学实验:二维图形变换.docx...

a7f4a3f590493a1e451dd952a488fd7c.gif 计算机图形学实验:二维图形变换.docx

(9页)

计算机图形学二维图形基本变换实验原理,计算机图形学实验:二维图形变换.docx..._第1张图片

本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!

19.90 积分

实验三 二维图形变换一、实验任务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对称三种。由于屏幕坐标只有第一象限,我们可以将原点平移到(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 1]4.三、设计思路1. 通过二维几何变换的数学模型,编写缩放、旋转、对称变换;2. 以(500,240)为原点建立图形变换的参考坐标系;3. 通过键盘按键控制图形的缩放、旋转、对称变换;4. 变换图形设定为以Pt[0](540,220)、Pt[1](670,130)、Pt[2](560,120)为顶点的三角形。步骤:1. 建立Trans工程文件;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_SYMMETRYCOMMANDOnTransformSymmetry4. 添加自定义的成员变量:CPoint Pt[3]; //三角形定点数组float dAngle; //每一次旋转的角度 在视图类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;5. 在视图类的OnDraw()函数中加入下列代码,实现视图绘图。void CTransView::OnDraw(CDC* pDC){ CTransDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here//绘出以以(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键");}6. 添加预编译常量#define PI 3.7. 分别编写步骤3中向视图类中添加消息映射函数,程序如下:void CTransView::OnTransformRotate() { // TODO: Add your command handler code here float dRadiusAngle = 30.0 * PI /180.0; for(int i=0; i<3; 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();} //实现图形旋转void CTransView::OnTransformScale() { // TODO: Add your command handler code here float dScaleX = 2.0; float dScaleY = 0.5; for(int i=0; i<3; i++) { Pt[i].x *= dScaleX; Pt[i].y *= dScaleY; } RedrawWindow();} //实现图形缩放void CTransView::OnTransformSymmetry() { // TODO: Add your command handler code here for(int i=0; i<3; i++) { Pt[i].x += Pt[i].x; Pt[i].y += Pt[i].y; } RedrawWindow();} //实现图形对称8. 添加成员函数实现键盘交互式控制图形变换函数及代码如下:void CTransView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: Add your message handler code here and/or call default int i=0; CPoint TmpPt = Pt[0]; switch (nChar){ case VK_UP: //上 for(i=0; i<3; i++) { Pt[i].y =240-(Pt[i].y-240); } break; case VK_DOWN: //下 for(i=0; i<3; i++) { Pt[i].y =240-(Pt[i].y-240); } break; case VK_LEFT: //左 for(i=0; i<3; i++) { Pt[i].x =500-(Pt[i].x-500); } break; case VK_RIGHT: //右 for(i=0; i<3; i++) { Pt[i].x =500-(Pt[i].x-500); } break; case 0X5A: //Z的ASCII码 Pt[1] = Pt[1] - Pt[0]; Pt[2] = Pt[2] - Pt[0]; Pt[0].x = Pt[0].y = 0; for(i=1; i<3; 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; case 0X58: //X的ASCII码 Pt[1] = Pt[1] - Pt[0]; Pt[2] = Pt[2] - Pt[0]; Pt[0].x = Pt[0].y = 0; for(i=1; i<3; 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; case 0X52 : //R的ASCII码 dAngle = -1.0; //每一次逆时针旋转一度 float dRadiusAngle = dAngle * PI /180.0; Pt[1] = Pt[1] - Pt[0]; Pt[2] = Pt[2] - Pt[0]; Pt[0].x = Pt[0].y = 0; for(int i=1; i<3; 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);}9. 编译和运行程序,查看程序运行结果四、实验效果及分析运行程序:按方向键“←”:按方向键“↓”按“Z”键按“X”键按“R”键进行旋转变换时,发现三角形的形状会有略微变化。8 关 键 词: 图形 变换 二维 实验 计算机

4d91c43bfc72ca913299809b07b4968f.gif  天天文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。

你可能感兴趣的:(计算机图形学二维图形基本变换实验原理,计算机图形学实验:二维图形变换.docx...)