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

(9页)

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

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 关 键 词: 图形 变换 二维 实验 计算机

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

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

  1. 计算机图形学二维图形基本变换实验原理,【实验课件】二维及三维图形基本变换的实现...

    实验二 二维及三维图形基本变换的实现 一.实验学时 4学时 二.实验类型 设计型实验 三.实验目的和要求 1. 掌握二维图形变换的原理,对一条直线实现二维基本变换(平移.错切.比例.旋转). 2. 掌 ...

  2. 计算机图形学二维图形基本变换实验原理,江苏大学-计算机图形学第三次实验报告-二维图形变换...

    <江苏大学-计算机图形学第三次实验报告-二维图形变换>由会员分享,可在线阅读,更多相关<江苏大学-计算机图形学第三次实验报告-二维图形变换(13页珍藏版)>请在人人文库网上搜索 ...

  3. MATLAB图形的实验原理,信息隐藏实验1

    信息隐藏实验1  计算机图像的基本操作 实验目的 一.熟悉MATLAB图像基本操作 二.使用图像降级技术实现图中藏图 实验要求 一.要求能够利用C/C++.Matlab等高级编程语言编写基本的算法程序 ...

  4. C语言第五章实验二答案,《C语言程序设计》实验二 参考答案

    //P13 二.1)编写程序:已知圆的半径为3,求圆的直径.周长和面积. #include #define PI 3.14159265 main() { double r=3,d,c,s; d=2.0 ...

  5. 差分方程matlab实验报告,实验二微分方程与差分方程模型Matlab求解

    实验二微分方程与差分方程模型Matlab求解 实验二: 微分方程与差分方程模型Matlab求解 一.实验目的 [1] 掌握解析.数值解法,并学会用图形观察解的形态和进行解的定性分析: [2] 熟悉MA ...

  6. matlab差分方程和微分方程,实验二微分方程与差分方程模型matlab求解

    实验二微分方程与差分方程模型matlab求解 实验二: 微分方程与差分方程模型 Matlab 求解一.实验目的[1] 掌握解析.数值解法,并学会用图形观察解的形态和进行解的定性分析:[2] 熟悉 MA ...

  7. 利用MATLAB进行系统时域分析,实验二 利用matlab进行系统的时域分析

    实验二 利用matlab进行系统的时域分析 实验二 利用MATLAB进行系统的时域分析 1.实验目的 在理论学习的基础上,通过本实验熟悉LTI连续时间系统的时域分析方法, 熟悉系统的零输入响应.零状态 ...

  8. 实验六 2D图形变换

    ZZU的学弟学妹们不要抄作业哦~(`Д´) 一.实验目的 1.了解和掌握2D图形变换:学会使用OpenGL平移.旋转和比例缩放函数,掌握基本图形变换和复合图形变换实现的方法. 2.综合运用2D图形变换 ...

  9. 二维图形几何变换(计算机图形学)

    说明:本实验代码在vs2022下可正常运行,本实验适配于计算机图形学新版(VC++ MFC )第二版 1.实验目的 1)掌握3*3矩阵乘法运算的编程实现 2)掌握平移,比例,旋转三种基本二维几何变换矩 ...

最新文章

  1. FTP服务器端程序分类
  2. 解决Eclipse安装Genymotion插件后抛异常的Bug
  3. 音视频技术开发周刊 | 149
  4. 七月时忙碌而充实的_如何减少忙碌而更有效
  5. SqlHelper操纵数据库工具类
  6. docker4.9.0.9_Docker支持现实生活中的鲸鱼,通过投票确定Linux v4.0等
  7. linux判断redis是否启动成功_redis的前生后世
  8. 未来通信设备的体系构架
  9. 【数据结构之旅】循环队列
  10. 标学教育计算机等级考试系统,标学教育电脑版
  11. 使用C# 开始第一个QQ机器人
  12. adf4351 锁相环相关硬件设计
  13. 从事汽车电子软件开发需要什么技能?
  14. Tensorflow教程之语音识别
  15. 直播还有哪些新想象?AI+直播打造更有趣的直播间
  16. Java课设对对碰_java 对对碰游戏
  17. cartographer保存二维地图
  18. for循环输出素数探究【java】
  19. 对微软CRM日期保存格式的分析
  20. 机械工程研究生转行计算机,机械不转行offer比较

热门文章

  1. haproxy+keepalived实现高可用负载均衡
  2. .net测试学习--理解.net测试选项
  3. 应用交付脚本工具在HTTP服务中的应用
  4. Unity官方宣传片Adam 播放地址
  5. saltstack之基础入门系列文章简介
  6. APPCAN学习笔记003---原生开发与HTML5技术
  7. AM335x关于LCD屏幕的时钟PLL配置
  8. LINUX优化--打开文件数保存方法
  9. Mybatis与Ibatis比较(转载)
  10. 一起谈.NET技术,抛砖引玉:我看微软.NET各子技术领域之应用前景