实验指导书(实验一)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、Visual C++ 基本知识
一、Visual C++开发系统基本绘图知识
Windows应用程序框架的核心是文档与视的相互关系,应用程序框架中的文档和视图结构文档即应用程序处理的数据对象,如NotePad中的文本。
视即指文档的应用程序中的表现方式或用户用于改变文档的交互窗口对像。
MFC中与绘图有关系的几个关键类如下:(1)文档类(Document)
文档是用户处理数据的对象。
文档一般从MFC中类CDocument中派生,由CDocument 派生的类主要用于存储数据。
CDocument类用于相应数据文件的读取及存储Cview类所需要观察和处理的信息。
(2)视类(View)
视相当于文档在应用程序中的观察窗口,它确定了用户对文档的观察方式和用户编辑文档的方式。
如果需要,用户可在多个视中对文档进行操作,即多文档结构。
对于图形来说视就好比我们进行绘图工作的画布,对图形的操作都是在视上进行的。
因此掌握好视类对我们很重要。
另外,视类中有一个重要的成员函数----OnDraw()函数,应用程序中,几乎所有‘画’的动作都出现在OnDraw()中或由它来引发。
该函数必须被重载。
重载的OnDraw()函数要完成两件事,即调用相应的文档的函数获取文档数据和调用GDI(图形设备接口)的函数在视中画出文档数据。
(3)主窗口类(Main Frame Window)
主窗口是Windows应用程序中限定其所有窗口范围的最外边框。
应用程序中的所有其他窗口都直接或间接地为主窗口的子窗口,如标准菜单、工具条、状态条等。
(4)文档类模板(Document Template)
文档类模板用于协调文档对象、视对象、和主窗口对象的创建过程。
一个文档模板可以管理同一文档类型的所以文档。
对于不同的类型的文档,必须使用不同的文档模板类。
(5)应用类(Application)
一个应用程序有且只有一个应用类的对象,它控制上述所有的对象,确定程序的特点,并负责应用程序的初始化,以便创建和管理程序支持的文档模板对象,一个应用程序对象就代表一个应用程序。
(6)图形设备接口
PC机种上可以连接多种不同的视讯设备,所以,GDI的主要目的之一是支援与装置无关的图形。
图形设备接口GDI(Graphic Device Interface)管理Windows应用程序在窗口中的所有绘图操作和与此有关的诸多方面。
如图形设备的信息,坐标系和映射模式,绘图的当前状态(画笔、画刷、颜色、字体等),绘图的具体操作(如画线、画图等);
(7)设备环境类
CDC是MFC中最重要的类之一,更是绘图应用程序中最重要的类,CDC类定义的是设备上下文对象的类。
CDC类的内容十分丰富,包含了和绘图有关的方方面面。
CDC类提供的成员函数可以用于对设备环境的操作、绘图工具的使用、图形设备接口(GDI)对象的选择等,但在使用CDC类对象应注意一个问题:为使用CDC对象,须构造一个CDC对象,然后才能调用它的成员函数。
使用完成后,必须在适当地方将其删除,在Windows环境中可获得的设备环境的数量是有限的。
如果太多的CDC对象没有被删除,计算机的资源将很快耗尽,VC++也会在调试窗口中报错。
框架大部分的代码是应用程序自动生成的,程序设计的大部分工作是在视类的两个文件(.h头文件和.cpp应用文件)中进行的。
二、计算机图形学绘图系统设计基本原则
设计一个图形系统是一个复杂的工作,设计工作一般分为需求分析、设计、编程、测试和运算等几个阶段,每一阶段各有明确任务。
对于一个交互式通用图形系统的设计原则大致如下:
(1).结构层次化、模块化;
(2)通用性强,使用方便;
(3)处理速度快;
(4)程序易读、查、改以及移植和扩充;
三、图形程序设计步骤
(1)根据实际需要,确定绘图程序的功能和用途。
(2)明确所绘制图行的几何形成过程。
(3)根据图形绘制要求对所绘制图形进行系统的模块划分。
(4)针对各个模块的功能确定相应绘图算法
(5)编写绘图程序
(6)上机调试、运行和绘图;
对写好的程序,首先要在纸上进行认真仔细的检查,不要匆忙上机,程序通过认真检查后在上机调试、编译,初学者容易忽略这一点,在计算机上占用大量时间。
四、在Visual C++集成开发环境下程序的调试
(1)运行要调试的程序;
(2)利用F9在需要行设置断点
(3)可用F11一次执行一条语句,一步步跟踪;可以跟踪进某行调用的函数(如果不想跟踪进函数,可用F10)
打开Watch窗口(按Alt+3组合键)或QuickWatch窗口(按Shift—+F9组合键),也可以打开运算窗口或通过主菜单中的Debug菜单的选项来打开,观察已经执行过的一段程序中的变量值。
在Watch窗口中有几个Watch子窗口,在每个子窗口的Name列任意一行键入变量名后回车在相应的Value列中就得到程序中此变量的值。
这样可观察程序运行中变量值的计算与传递是否正确,常常能找到不容易发现的问题,还可利用窗口值来修改变量的值测试程序。
五、计算机图形学课程实验常用文件说明
计算机图形学课程实验的算法所涉及的文件只有下面两个,其余均不需要改动。
(1)2DgraphicsView.cpp 程序主代码,算法中的主程序,调用程序均在其源代码上增加。
(2)2DgraphicsView.h 头文件,算法中的全局变量的声明,调用程序的声明等都在其上增加修改。
实验一:直线的两种生成算法
实验目的:
1、熟悉visual c ++的编程环境。
2、掌握二维图形中画线段的两种典型方法。
实验内容:
1、visual c ++中创建新的object 。
2、程序验证设计画线DDA 算法。
3、程序验证画线的Bresenham 算法。
实验步骤:问题:已知在屏幕上的线段两点P、Q 的坐标,求线段PQ 经过的象素的点集。
方法一、画线的DDA 算法
鼠标函数输入起点坐标P (,)P P x y ,终点坐标Q (,)Q Q x y ,坐标均为整数。
步长:利用一阶差分为常数,每次x 方向或者y 方向前进一个单位,然后决定到达象素点的位置。
取点原则:四舍五入。
步长决定:总步长,步长max(||,||)Q P Q P n x x y y =−−,Q P
Q P
x x y x y n
n
y −−∆=∆=
初始点: ,11P P x x y y == 直线上第二点
2121x x x y y =+∆=+∆y
, 经四舍五入后,得象素点
[.[.22220505x x y y ]]
=+=+
递推
11i i i i x x x y y ++=+∆=+∆y
[.[.11110505i i i i x x y y ++++=+=+]]
,最后,逐一显示点(1i x +,1i y +)
方法二:Bresenham 算法
鼠标函数输入起点坐标P (,)P P x y ,终点坐标Q (,)Q Q x y ,坐标均为整数。
思想:不通过计算直线段上的点,而计算插补线段象素点的坐标。
条件:if Q P Q P
y y n x x −=
−<1 步长x 方向移动,else 步长y 方向移动。
步长x 方向:则;
11i i x x +=+
递推过程:第i+1个点若比中点.05i y +高,则取上一点i y +1。
低则取下一点i y
..1111105
050i i i i i i
i i i y y y e y y y y e +++++≥+⎧=⎨10+≥<+<⎩其中的1i e +=(.105i i y y +)−+
推出量的递推式:1i e +1
01
i i i i e e e y e +≥⎧=+∆−⎨
<⎩
初始条件:,11P P x x y y ==;;接着一直按照递推式即可。
.105e y =∆+
程序的设计步骤:
1、程序设计功能说明
为编程实现上述算法,本程序利用最基本的绘制元素,绘制图形。
如图1所示,为程序
运行主界面,通过选择菜单及下拉菜单的各功能项分别完成各种对于算法的图形绘制。
图1 基本图形生成的程序运行界面
2、创建工程名称为“2Dgraphics ”单文档应用程序框架
(1)启动VC,选择“文件”|“新建”菜单命令,并在弹出的新建对话框中单击“工
程”标签。
(2)选择MFC AppWizard(exe),在“工程名称”编辑框中输入“2Dgraphics ”作为
工程名称,单击“确定”按钮,出现Step1对话框;
(3)选择“单个文档”选项,单击“下一个”按钮,接下来一直接受默认选项,单击
“下一个”,在最后出现的对话框中单击“完成”按钮,随后出现工程信息对话框,如图2所示。
单击确定,完成应用程序框架的创建。
图3 程序界面
3、编辑菜单资源
设计如图1所示的菜单项。
在工作区的ResourceView 标签中,单击Menu 项左边“+”,
然后双击其子项IDR_MAINFRAME ,并根据表1定义编辑菜单资源。
此时VC 已自动建好程序框架。
菜单标题 标识符
ID DDA
算法 ID_DDAline Bresenham 算法
ID_Bresenham
输入菜单项名称,(如DDA 算法)
图4 菜单项生成
4、添加消息处理函数
由菜单的“查看”,“建立类向导”,打开ClassWizard (也可CTRL+W )为应用程
序添加与菜单项相关的消息处理函数,ClassName 栏选中CScanlineView 类,根据表2建立。
根据表2建立如下的消息映射函数,ClassWizard 会自动完成有关函数声明。
菜单项ID
消息
消息处理函数
ID_DDAline COMMAND Ongetploygon ID_Bresenham COMMAND Onscanline CScanlineView WM_LBUTTONDOWN OnLButtonDown
图5 ClassWizard 打开界面
5、 程序代码设置
(1) 添加全局变量,打开2DgraphicsView.h
文件
int inputnumber;
int y;
int x;
POINT q;
POINT p;
(2)主程序代码(打开Cmy2DgraphicsView.cpp,红色为程序名,蓝色为需添加部分)
CMy2DgraphicsView::CMy2DgraphicsView()
{
inputnumber=0;
// TODO: add construction code here
}
void CMy2DgraphicsView::OnDDAline()
{
CDC* pdc=GetDC(); //调用CDC类中画图函数
int color=RGB(255,0,0); //颜色初始化
?????????????????填入DDA算法的主代码
ReleaseDC(pdc); //释放pdc
}
void CMy2DgraphicsView::OnLButtonDown(UINT nFlags, CPoint point)
{ //鼠标左键映射函数 point为反馈回的点信息
CDC* pdc=GetDC();
inputnumber++;
if(inputnumber==1)
{
P=point;
pdc->Ellipse(P.x-4,P.y-4,P.x+4,P.y+4);
if(inputnumber==2)
{
Q=point;
pdc->Ellipse(Q.x-4,Q.y-4,Q.x+4,Q.y+4);
inputnumber=0;
}
// TODO: Add your message handler code here and/or call default CView::OnLButtonDown(nFlags, point);
}
6.附加:常用的快捷键;
F4:查看错误信息。
F5:运行到下一个断点,开始调试
CTRL+F5:执行。
F7:组建。
CTRL+F7:编译。
F9:在当前行添加断点。
F10:单步运行,即只运行下一行,且不跨入子程序。
F11:单步运行,即只运行下一行,跨入子程序。
调试窗口如下:。