计算机图形学 图形变换
更新时间:2024-05-28 20:33:01 阅读量: 综合文库 文档下载
- 计算机图形学推荐度:
- 相关推荐
实验五:图形变换
一、实验目的:
1、掌握图形变换的基本方法。
2、初步掌握映射菜单消息和捕获键盘消息的方法。
二、实验内容及要求:
1、 2、 3、
以三角形为例,使用Visual C++实现二维图形的平移、旋转和缩放功能。 每人单独完成实验。
按要求撰写实验报告,写出实验心得,并在实验报告中附上程序的核心算法代码。
三、实验设备:
微机,Visual C++6.0
四、实验内容和步骤:
1、 打开VC,新建一个MFC Appwizard项目,选择创建单文档工程(SDI工程)。假设工程名为
Transform。如图1和图2所示。
图1
图2
2、 在图2的界面上点击Finish,完成工程的创建。 3、 在TransformView.h文件中,加入如下代码: public: CPoint Pt[3]; //存储三角形的三个顶点 float dAngle; //存储三角形旋转的角度
4、 在类CTransformView的构造函数中定义三角形的三个顶点的初始坐标和dAngle的初值,代码如
下;
CTransformView::CTransformView() {
// TODO: add construction code here Pt[0].x = 200; Pt[0].y = 220; Pt[1].x = 260; Pt[1].y = 300; Pt[2].x = 360; Pt[2].y = 180; dAngle = 0.0; }
5、 在类CTransformView中添加成员函数void DrawTriangle(CDC *pDC),并实现该函数。(该部分代
码请同学们自己实现,为了简便编程,可以使用MoveTo和LineTo函数,也可以调用自己在实验2中编写的DDA或者Bresenham画线函数);
6、 在类CTransformView的OnDraw()函数中添加绘制三角形的代码;
void CTransformView::OnDraw(CDC* pDC) {
CTransformDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc);
// TODO: add draw code for native data here DrawTriangle(pDC); }
7、 映射菜单消息,方法是打开ResourceView菜单,依次展开MENU \\ IDR_MAINFRAME,添加“图
形变换”主菜单项,在其下添加“平移”,如图3所示。
图3
8、 在TransformView.cpp文件中(类CTransformView中)映射平移的菜单消息,触发平移函数。代
码如下:
void CTransformView::OnMenuTransformTranslate() {
// TODO: Add your command handler code here int nX = 50;
int nY = 80; //平移的X坐标和Y坐标 for(int i=0; i<3; i++) { Pt[i].x += nX; Pt[i].y += nY; }
RedrawWindow(); //该行代码必不可少,用于触发OnDraw()函数 }
9、 与平移类似,请同学们自己依次添加“缩放”和“旋转”菜单,并实现相应的“缩放”菜单和“旋
转”菜单的消息映射函数。 10、 添加捕获键盘的消息,实现用键盘控制三角形的平移、缩放和旋转。在TransformView.cpp
文件中单击鼠标右键,选择ClassWizard,如图4所示,为键盘消息WM_KEYDOWN添加消息映射函数,代码如下:
void CTransformView::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 -= 5; } break; case VK_DOWN: //用下箭头控制三角形向下移动 for(i=0; i<3; i++) { Pt[i].y += 5;
}
} break; 。。。。。。 // }
RedrawWindow();
CView::OnKeyDown(nChar, nRepCnt, nFlags);
图4
11、 请同学们在WM_KEYDOWN的消息映射函数中,再自己实现用左、右箭头控制三角形移动
的代码。左右箭头的虚键分别为VK_LEFT, VK_RIGHT。 12、 请同学们在WM_KEYDOWN的消息映射函数中,再自己实现用Z和X键控制三角形放大1
倍和缩小1倍的代码。在消息映射函数中,按下Z键,说明nChar=Z的ASCII码;其他字母相同。 13、 请同学们在WM_KEYDOWN的消息映射函数中,再自己实现用R键控制三角形旋转的代
码。多按几下R键,看看会发生什么情况?为什么会这样?如何解决?
五、核心代码:
这里将自己编写的上机程序中的主要代码拷贝粘贴过来; Ondraw:
void CShiyqan5View::OnDraw(CDC* pDC) { CShiyqan5Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc);
DrawTriangle(pDC); }
用DDA画出三角形
void CShiyqan5View::DrawTriangle(CDC *pDC) {
DDALine(Pt[0].x,Pt[0].y,Pt[1].x,Pt[1].y,RGB(0,147,145)); DDALine(Pt[1].x,Pt[1].y,Pt[2].x,Pt[2].y,RGB(0,147,145)); DDALine(Pt[2].x,Pt[2].y,Pt[0].x,Pt[0].y,RGB(0,147,145)); }
void CShiyqan5View::DDALine(int x0, int y0, int x1, int y1, COLORREF color) {
CDC *pDC = this->GetDC(); int i;
float dx, dy, length,x,y;
if (fabs(x1-x0)>=fabs(y1-y0)) length=fabs(x1-x0); else
length=fabs(y1-y0); dx= (x1-x0)/length; dy=(y1-y0)/length; i=1;x= x0;y= y0; while(i<=length) {
pDC->SetPixel(int (x + 0.5), int (y + 0.5), color); x=x+dx; y=y+dy; i++; }
实现图形平移
void CShiyqan5View::OnMenuTransformTranslate() { // TODO: Add your command handler code here int nX = 50; int nY = 80; //平移的X坐标和Y坐标 for(int i=0; i<3; i++) { Pt[i].x += nX; Pt[i].y += nY; } RedrawWindow();
实现向下移动:
向左
键盘向右
实现Z的缩放
实现X的放大
实现R的旋转
七、思考题(尽量做,计入成绩):
1、将三角形A(250,200),B(100,100),C(300,200)绕P(200,100)点旋转45°,求旋转后的三角形的坐标。 要求画出原三角形、坐标系、点P,旋转后得到的新三角形。――要求上机完成
2、如何较好地绘出一个平面直角坐标系? (1)Scale法
通过自定义左上角和右下角坐标来设置新的坐标系统。用户通过自定义坐标时,一般先选定ScaleMode=0,然后设定用户自定义坐标ScaleMode=3,最后用Scale方法定义坐标系。 (2)通过对象属性ScaleLeft和ScaleTop直接赋值自定义坐标系
3、在Turbo C中如果要编写菜单的实现程序,是什么步骤?
首先建立类向导,然后在Project的Cshiyan5View下的,Message是command下建立一个新的成员函数。然后设好ID,并且名字可以改成想要的。建好后就可以在函数体中添加代码,来实现菜单。 例如:
void CShiyqan5View::OnMenuTransformTranslate() {
// TODO: Add your command handler code here int nX = 50;
int nY = 80; //平移的X坐标和Y坐标 for(int i=0; i<3; i++) { Pt[i].x += nX; Pt[i].y += nY; }
RedrawWindow();
4、如果OnKeyDown函数中不加RedrawWindow()语句,会出现什么结果?为什么? RedrawWindow()是用来触发Ondraw函数的,如果不用则无法进行调用。
5、为什么旋转程序的结果和预计的不一样?
因为P点是左上角的一个点,随着三角形的旋转,围绕着的中心点不断向外延伸出去。这样就和预想的结果有些不同了。
八、实验体会
通过这次试验,我学到了图形变换的基本方法,同时初步掌握映射菜单消息和捕获键盘消息的方法。根据实验指导书的要求,以三角形为例,使用Visual C++实现二维图形的平移、旋转和缩放功能。
在映射平移的菜单消息中,触发平移函数。使用RedrawWindow();这条语句,该行代码必不可少,用于触发OnDraw()函数。然后在实现缩放和平移的内容。
在做实验时我一直编译不通过,经过老师的提点之后,发现我一开始是在Frame下建立类向导,而实际是应该在View下建立,但是我只是把相应的代码从程序中删除了,而没有实际把他们删掉,使得程序总是编译不通过。经过老师的提点后,发现其实错误根本还没有完全删除,再改正之后,程序才得以编译成功。
添加捕获键盘的消息,在实现键盘上下左右的位移,通过上面的实验指导书中的内容加以改编,可以完成,还需加上case 和要用的按钮。在添加ZXR的虚键时,算了下他们相对应的ASCII码,之后进行编写代码,把之前做的缩放、旋转加进去,这样即可实现。
按照实验内容,共做了13步实验,并加以实现。
九、注意及特别说明
1、 实验内容及步骤中的前9步为必须完成的实验内容,第10步至第13步,请同学们根据自己的兴趣选
做;
2、 如对Visual C++的编译环境不熟悉,请课下提前参考Visual C++的相关书籍和MSDN。
正在阅读:
计算机图形学 图形变换05-28
我最喜爱的水果作文300字07-04
建筑行业职业病危害因素09-02
2017-2022年中国砂布行业市场分析与发展前景预测报告(目录)08-30
最佳微小说:多余一句话!08-02
幼儿园园长岗位职责和制度全套07-09
开心的游玩作文400字06-20
小议十字交叉法在化学计算中的应用05-11
徐浦医院中药饮片处方用名与调剂给付规定07-04
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 图形
- 变换
- 计算机
- 地下通道工程施工组织设计 - 图文
- 礼品包装方法大全
- 宏观整理版 - 图文
- 2018年中国造纸木片市场行业前景预测报告目录
- 文红梅文献检索 - 图文
- 甲级单位编制血塞通胶囊项目可行性报告(立项可研+贷款+用地+201
- 新校园网工程软件解决方案 - 图文
- 社会实践报告房地产社会实践报告
- 期末二年级期末测试 一doc
- WIN7使用技巧大全
- 通信工程专业发展及就业方向
- 信息技术环境下的“小学语文提前读写”
- 首批重点监管的危险化学品安全措施和应急处置原则(安监总厅管三[
- 生物2016年中考适应性考试
- 交通灯信号控制器VHDL文本输入设计
- 好氧颗粒污泥形成的影响因素及其应用
- 质量管理办法
- 档案管理学教案
- ExamStack2考试系统部署方案
- 英文激励名言