第九章 使用MFC实现真实感图形绘制

合集下载

计算机图形学实验指导书(vc++版)

计算机图形学实验指导书(vc++版)

实验指导书刘文涛2013目录第一章图形学实验环境和要求 (4)1.1 VC++实验环境 (4)1.1.1 基本环境 (4)1.1.1 开发图形程序的一般流程 (7)1.1.3 基本绘图函数介绍 (11)1.2 OpenGL (22)1.2.1 OpenGL介绍 (22)1.2.2 OpenGL开发环境 (24)1.2.3 OpenGL函数 (24)1.2.4 回调函数 (25)1.2.4 一个典型OpenGL例程 (26)1.3 实验要求 (29)1.3.1 实验内容 (29)1.3.2 实验方法 (29)1.3.3 实验效果 (30)第二章直线生成算法 (30)2.1 实验原理 (30)2.1.1 DDA算法 (30)2.1.2 Bresenham算法 (30)2.2 实验内容 (30)2.3 参考示例程序 (30)第三章圆和椭圆生成算法 (32)3.1 实验原理 (32)3.2 实验内容 (32)3.3 参考示例程序1 (32)3.4 参考示例程序2 (33)第四章裁剪算法 (35)4.1 实验原理 (35)4.2 实验内容 (35)4.3 示例程序 (35)4.3.1 参考例子1 (35)4.3.2参考例子2 (38)第五章二维变换 (40)5.1 实验原理 (40)5.2 实验内容 (40)5.3 示例程序 (40)5.3.1参考例子1 (40)第六章三维变换 (44)6.1 实验原理: (44)6.2 实验内容 (45)6.3示例程序 (45)第七章填充算法 (47)7.1 实验原理: (47)7.2 实验内容 (47)7.3示例程序 (47)第八章曲线曲面 (50)8.1 实验原理 (50)8.2 实验内容 (50)8.3示例程序 (51)8.3.1 参考例子(1) (51)8.3.2 参考例子(2) (52)8.3.3 参考例子(3) (54)8.3.4 参考例子(4) (56)第九章真实感图形绘制 (59)9.1 实验原理 (59)9.2 实验内容 (59)9.3示例程序 (59)9.3.1参考例子(1) (59)9.3.2参考例子(2) (61)9.3.3参考例子(3) (63)第十章动画 (66)10.1 实验原理 (66)10.2 实验内容 (66)10.3示例程序 (66)10.3.1 参考例子 (66)参考文献: (72)第一章图形学实验基础1.1 VC++实验环境1.1.1 基本环境Microsoft Visual C++ 6.0 是微软推出的功能强大的可视化C/C++语言编译器,运行在Windows 9x/2000/NT等平台上,可以建立32位应用程序。

MFC绘图

MFC绘图

一、绘制线条1、新建MFC单文档工程Draw。

2、为CDrawView类添加CPoint类型的成员变量m_ptOrigin,将其访问权限设置为Private。

3、添加WM_LBUTTONDOWN的消息响应函数,该函数初始化m_ptOrigin变量m_ptOrigin=point。

4、添加WM_LBUTTONUP的消息响应函数void CDrawView::OnLButtonUp(UINT nFlags, CPoint point),在该函数里可添加如下各种代码实现绘图:(1)、利用SDK全局函数实现画线功能:HDC hdc;hdc=::GetDC(m_hWnd); //获得窗口的设备描述表MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL); //移动到线条的起点LineTo(hdc,point.x,point.y); //画线::ReleaseDC(m_hWnd,hdc);//释放设备描述表知识点:所有派生于CWnd类的子类都拥有m_hWnd这一成员变量,m_hWnd被定义为HWND类型,用于保存当前窗口的句柄,该成员变量具有public的访问权限。

(2)、利用MFC的CDC类实现画线功能:CDC* pDC=GetDC();pDC->MoveTo(m_ptOrigin);pDC->LineTo(point);ReleaseDC(pDC);知识点:MFC提供了设备描述表的封装类CDC,该类封装了所有与绘图相关的操作。

该类提供了一个数据成员m_hDC,用来保存与CDC类相关的DC句柄(3)、利用MFC的CClientDC类实现画线功能:CClientDC dc(this);//dc(GetParent())可获得父窗口的DCdc.MoveTo(m_ptOrigin);dc.LineTo(point);知识点:CClientDC派生于CDC类,当一个CClientDC对象在构造时,它在内部会调用GetDC 函数,在这个CClientDC对象析构时,它会调用ReleaseDC函数。

vc++基于mfc简单绘图

vc++基于mfc简单绘图

利用MFC简单绘图实验报告一、实验目的1、了解学会VC++ 6.0集成环境操作界面的使用;2、使用MFC进行可视化的编程;3、能够以交互方式在图形绘制区绘制点、直线、矩形、椭圆;4、设置线条的颜色、线型和线条宽度,对绘制的图元进行线条和填充属性的修改;二、简单的功能介绍1、画点:通过Ondot()函数实现2、画直线:通过OnLine()函数实现。

3、画矩形:通过OnRectangle()函数实现。

4、画圆角矩形:通过OnRoundrect()函数实现。

5、画椭圆:通过OnEllipse()函数实现。

6、铅笔工具:可以画任意线条。

通过直接在OnMouseMove(UINT nFlags, CPoint point)函数里面添加代码实现。

7、右键弹出菜单:可以在客户中点击鼠标右键,快速选择常用菜单。

通过OnContextMenu函数实现。

8、状态栏显示鼠标移动的坐标:在程序的右下角显示,通过调用setWidnowTextGetParent()实现。

9、画图颜色选择:可以画任何颜色的线条,通过OnColor()函数实现。

10、线条类型及线宽的设置:可以将画出的线条设置成实线、虚线、点线、点划线,双点划线,还可以设置线条的粗细,通过实例这一功能立刻显示所选择线条的粗细及线型。

通过新建CLineSettingDlg类,其中OnSelchangeLineStyle()函数实现线型的OnChangeEditLineWidth()函数实现线宽的改变。

再在CDrawView类中调用OnLineSetting()函数实现画笔的对话框,CLineSettingDlg类中的OnPaint()函数是实现示例功能的。

11、窗口的重绘时不擦除原来的内容:新建CShape类用来保存线条的颜色,线宽,填充色等属性,在窗口大小发生变化时有OnDraw(CDC* pDC)函数进行重绘工作,重绘中调用了各个绘图函数的Draw(CDC *pDC)函数。

基于MFC的图形图像处理方法(DOC)

基于MFC的图形图像处理方法(DOC)

基于MFC的图形图像处理方法(DOC)基于MFC的图形图像处理——李明(08.2)2008200698 §1 MFC平台的简单应用一用C语言中自带的函数画点。

其步骤如下:1.建立一个工程:“文件”——>“新建”——>选中“”-——>””(在其中键入工程名称,如“TEST1”)——>(设置为自己想要存放的位置)——>“确定”——>“”——>“完成”——>“确定”。

2.左击“”即可出现所见工程中的所有类。

若要实现画图功能,则必须要在其中的“”类中的“”函数中加入我们要实现功能所需要执行的代码。

现在可以先后通过工具栏中的“”、“”按钮进行编译执行。

其结果如下:图一图一为空白的,那是因为我们没有在“”函数中加任何代码。

(每次编译执行时,应把“图一”所示界面关闭,否者进行编译执行会出错。

)3.利用C语言中自带的函数画一个点:双击“”->在函数“void CTEST1View::OnDraw(CDC* pDC)”提示的地方加上所要执行的代码,这里为:pDC->SetPixel(10,10,RGB(255,0,0));(该函数的前两个参数为所画点的位置坐标(x,y),第三个参数为其彩色值RGB三个分量各自的值)。

经“”、“”后,其结果如下:则当1x 1+=+i i x 时,m y y i i +=+1。

(1-5)为了减少误差积累,仅当|m|≤1是采用(1-6)的方法。

当|m|≥1时,应用1y 1+=+i i y 时,mx x i i 11+=+的方法。

(1-6)3:DDA 算法的实现: ①建立工程TEST4。

②添加类Cline :右击“”——>“New Class ”——>” ”的属性为“”;“”为“CLine ”——>“确定”。

③添加类Cline 的成员:右击“”——>” Add Member Variable …”——>” ”为“Cpoint ”; “”为“point1”; “”——>“确定”。

MFC绘图教程

MFC绘图教程

MFC绘图教程.txt MFC编程学习的基本目标编程学习的基本目标可以进行简单的基于MFC的图形界面编程的图形界面编程可以进行简单的基于理解Windows编程的基本概念。

编程的基本概念。

理解编程的基本概念鉴于教学时间进度限制,鉴于教学时间进度限制,更复杂的应用程序开发通过自学完成。

自学完成。

实现基本MFC应用程序需要掌握如下内容:应用程序需要掌握如下内容:实现基本应用程序需要掌握如下内容Windows编程基本概念编程基本概念文档/视图结构文档视图结构文档读写对话框及标准控件的使用菜单栏的使用绘图及鼠标消息的处理3/21/2011 2主要内容GDI与设备环境(DC)与设备环境()与设备环境用CDC绘图绘图应用举例绘图工具类3/21/20113图形设备接口(图形设备接口(GDI))Windows提供了一个称为图形设备接口提供了一个称为图形设备接口 (GraphicsDevice Interface,GDI)的抽象接口。

的抽象接口。

,的抽象接口 GDI 作为作为Windows的重要组成部分,负责管理用的重要组成部分,的重要组成部分户绘图操作时功能的转换。

户绘图操作时功能的转换。

用户通过调用GDI 函数与设备打交道,GDI 通过函数与设备打交道,用户通过调用不同设备提供的驱动程序将绘图语句转换为对应的绘图指令,避免了用户对硬件直接进行操作,的绘图指令,避免了用户对硬件直接进行操作,从而实现设备无关性(显示器或打印机)。

从而实现设备无关性(显示器或打印机)。

3/21/20114GDI的图形输出的图形输出应用程序可以使用GDI 创建如下图形输出应用程序可以使用矢量图形:画线和填充图形,包括点、直线、曲线、多矢量图形:画线和填充图形,包括点、直线、曲线、边形、扇形和矩形等。

边形、扇形和矩形等。

光栅图形:光栅图形:通过光栅图形函数对以位图形式存储的数据进行操作,包括各种位图和图标的输出。

进行操作,包括各种位图和图标的输出。

MFC绘图程序实验报告

MFC绘图程序实验报告

《面向对象课程设计》实验报告题目学生姓名学号专业班级指导老师20 年1月画图软件一.实验要求该程序设计是用MFC开发绘图软件。

此绘图软件可进行自由绘图和画规定图形,并能对图形进行颜色笔宽的编辑。

同时增加了添加背景与打开绘图文件的功能。

这个程序除了一般的绘制图形功能外还增加了自定义背景功能,使得用户可以简单便捷的进行切换背景操作,以达到美观的效果。

在背景上画图更加直接与便捷。

二、实验程序设计及结构1、需求分析(功能、类、成员)这个程序需要实现自由绘图的功能,并能绘制规定图形且能为图形变换颜色与笔宽。

其中主要在Cview类下进行操作。

其中成员函数有:afx_msg void Onfromfile(); //打开视图文件afx_msg void Onwidth2(); //设置笔宽2afx_msg void Oncolour(); //选择颜色afx_msg void OnLButtonDown(UINT nFlags, CPoint point); //鼠标按下操作afx_msg void OnLButtonUp(UINT nFlags, CPoint point); //鼠标弹起操作afx_msg void OnMouseMove(UINT nFlags, CPoint point); //鼠标移动操作afx_msg void Onwidth3(); //设置笔宽3afx_msg void Onwidth4(); //设置笔宽10afx_msg void rect(); //画矩形afx_msg void cricle() //画圆afx_msg void selfdraw(); //自由绘图成员变量有:CString filename;COLORREF m_color;int m_penwidth;short m_show_type;bool m_flag;bool m_isbuttondown;CPoint m_oldpoint;int m_draw_type;CPoint m_draw_originpt;CPoint m_draw_oldpt;设计结构(包括总体结构和数据结构)i)总体结构程序有五个菜单项,选择颜色、选择笔宽、画规定图形、自由绘图、插入背景。

第九章 使用MFC实现真实感图形绘制

第九章 使用MFC实现真实感图形绘制

第九章使用MFC实现真实感图形绘制第九章使用MFC实现真实感图形绘制真实感图形绘制是计算机图形学的一个重要组成部分。

它综合利用数学、物理学、计算机科学和其他学科知识在计算机图形设备上生成象彩色照片那样的真实感图形。

要用计算机图形设备绘制场景的真实感图形,就必须首先在计算机中建立该场景的模型,用这个模型来反映场景的特点和属性。

这一模型通常是由一批几何数据及数据之间的拓扑关系来表示的,这就是造型技术,它是真实感图形绘制技术的重要组成部分。

有了三维场景的模型,并给定了观察点和观察方向以后,就可以通过几何变换和投影变换在屏幕上显示该三维场景的二维图像。

为了使二维图像具有立体感,并尽可能逼真地显示出该物体在现实世界中被观察到的形象,就需要运用适当的光照模型,来模拟场景在现实世界中受到各种光源照射时的效果,这就是真实感图形的画面绘制技术,也就是真实感图形的生成技术。

用计算机在图形设备上生成连续色调的真实感图形大致可以分为以下四步:第一步,用数学方法建立所需三维场景的几何描述,并将它们输入至计算机。

这部分工作可由三维立体造型或曲面造型系统来完成。

场景的几何描述直接影响了图形的复杂性和图形绘制的计算耗费,因此选择合理的、有效的数据表示和输入手段是非常重要的。

第二步,将三维几何描述转换为二维投影图。

这可以通过对场景的投影变换来完成。

第三步,确定场景中的所有可见面,这需要使用隐藏面消除算法将被其他物体遮挡的不可见面消去。

第四步,计算场景中可见面的颜色,严格地说,就是根据基于光学物理的光照明模型计算可见面投射到观察者眼中的光亮度大小和色彩分量,并将它转换成适合图形设备的颜色值,从而确定投影画面上每一象素的颜色,最终生成图形。

前三步的相关知识在前面已经进行了介绍,本章将重点介绍如何通过MFC编程的方式,利用光照模型计算场景中可见面的光亮度和颜色,并绘制最终的真实感图形。

实际上,现在OpenGL和DirectX等图形函数库提供了很多支持真实感图形绘制的函数,使用它们可以更轻松的完成真实感图形绘制。

第九章 使用MFC实现真实感图形绘制

第九章 使用MFC实现真实感图形绘制
第二步,将三维几何描述转换为二维投影图。这可以通过对场景的投影变 换来完成。
第三步,确定场景中的所有可见面,这需要使用隐藏面消除算法将被其他 物体遮挡的不可见面消去。
第四步,计算场景中可见面的颜色,严格地说,就是根据基于光学物理的 光照明模型计算可见面投射到观察者眼中的光亮度大小和色彩分量,并将它转 换成适合图形设备的颜色值,从而确定投影画面上每一象素的颜色,最终生成 图形。
对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术关,系电,通力根1保过据护管生高线产中敷工资设艺料技高试术中卷0资不配料仅置试可技卷以术要解是求决指,吊机对顶组电层在气配进设置行备不继进规电行范保空高护载中高与资中带料资负试料荷卷试下问卷高题总中2体2资,配料而置试且时卷可,调保需控障要试各在验类最;管大对路限设习度备题内进到来行位确调。保整在机使管组其路高在敷中正设资常过料工程试况1卷中下安,与全要过,加度并强工且看作尽护下可1都关能可于地以管缩正路小常高故工中障作资高;料中对试资于卷料继连试电接卷保管破护口坏进处范行理围整高,核中或对资者定料对值试某,卷些审弯异核扁常与度高校固中对定资图盒料纸位试,置卷编.工保写况护复进层杂行防设自腐备动跨与处接装理地置,线高尤弯中其曲资要半料避径试免标卷错高调误等试高,方中要案资求,料技编试术写5、卷交重电保底要气护。设设装管备备置线4高、调动敷中电试作设资气高,技料课中并3术试、件资且中卷管中料拒包试路调试绝含验敷试卷动线方设技作槽案技术,、以术来管及避架系免等统不多启必项动要方高式案中,;资为对料解整试决套卷高启突中动然语过停文程机电中。气高因课中此件资,中料电管试力壁卷高薄电中、气资接设料口备试不进卷严行保等调护问试装题工置,作调合并试理且技利进术用行,管过要线关求敷运电设行力技高保术中护。资装线料置缆试做敷卷到设技准原术确则指灵:导活在。。分对对线于于盒调差处试动,过保当程护不中装同高置电中高压资中回料资路试料交卷试叉技卷时术调,问试应题技采,术用作是金为指属调发隔试电板人机进员一行,变隔需压开要器处在组理事在;前发同掌生一握内线图部槽 纸故内资障,料时强、,电设需回备要路制进须造行同厂外时家部切出电断具源习高高题中中电资资源料料,试试线卷卷缆试切敷验除设报从完告而毕与采,相用要关高进技中行术资检资料查料试和,卷检并主测且要处了保理解护。现装场置设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷数,其具体含义将会在介绍 光照模型时说明。

基于MFC的简单画图程序实验

基于MFC的简单画图程序实验

简单画图程序【实验目的】本实验目的是通过构建基于MFC的windows画图程序,使学生:(1) 理解MFC应用程序的运行机制(2) 掌握使用MFC构建Windows应用程序的基本结构及编程的基本方法(3) 理解和掌握MFC应用程序消息处理机制及应用(4) 掌握类向导(ClassWizard)的使用【实验要求】(1) 必须做好实验原理的预习。

(2) 需要对提供的程序代码进行分析,并明确实验时还应在何处添加哪些语句。

【实验环境】Microsoft Windows XPMicrosoft Visual C++ 6.01 基本功能描述1) 在单文档菜单中,在菜单行中可插入一个菜单项,命名为绘图,在下拉菜单中可分别设置绘制的图形形状,如直线、矩形及椭圆,线宽选项,有1-5可供选择,还可以设置线色以及填充色,通过弹出的颜色对话框选择需要的颜色,如果不选择线宽、线色以及填充色,则按默认的画笔,画刷来绘制选择的图形。

2) 选择好图形后,通过鼠标可以绘制出相应的直线,矩形或椭圆,鼠标的按下确定图形的起点,鼠标的拖动则确定了图形的终点,即通过鼠标的拖动来决定图形的大小,当鼠标弹起,此图形则绘制完毕。

3) 增添工具栏,设置绘制的图形形状,线色以及填充色,可更方便地选择相应的功能。

2 设计思路1) 对需要用到的变量进行初始化。

2) 选择相应的图形之后就响应相应的消息处理函数,给shape赋对应的值。

选择不同的线宽,线色与填充色,即可改变画笔或画刷的属性。

3) 鼠标的按下响应函数OnLButtonDown(),捕捉鼠标当前位置得到起点的坐标,鼠标的拖动响函数OnMouseMove()改变终点的坐标,鼠标的弹起响应OnLButtonUp(),确定终点坐标,刷新,得到绘制图形。

4) 选择图形或其它属性,可进行下一次绘制。

图1 程序流程图3 软件设计3.1 设计步骤1)创建单文档创建一个MFC AppWizard[exe]工程,命名为“yinshuyan”,如图2所示,并创建单文档,如图3所示。

VC++实验四 MFC图形绘制编程实验

VC++实验四 MFC图形绘制编程实验

实验四 MFC图形绘制编程实验一、实验目的(1) 熟悉Visual C++ 6.0开发环境;(2) 掌握MFC消息映射的操作步骤;(2) 掌握MFC图形输出的方法;(3) 理解设备环境、画笔、画刷的概念,掌握常用的绘图函数。

二、实验内容请编写程序,要求如下:(1) 定义一支黄色画笔,绘制一条线段;(1) 定义一支紫色画笔,绘制一条多段线;(3) 定义一支红色画笔,绘制一个正方形,并用适当的画刷填充图形内部;(4) 定义一支绿色画笔,绘制一个圆,并用适当的画刷填充图形内部;(5) 定义一支蓝色画笔,绘制一个正六边形,并用适当的画刷填充图形内部。

三、实验报告1.列出图形绘制程序代码清单:(1)在头文件Demo.h中:#include "afxwin.h"class CDemoWnd:public CFrameWnd{public:CDemoWnd();~CDemoWnd();public:LRESULT OnPaint(WPARAM wParam,LPARAM lParam);DECLARE_MESSAGE_MAP()public:int m_nX0;int m_nY0;int m_nX1;int m_nY1;};class CDemoApp:public CWinApp{public:BOOL InitInstance();};CDemoApp ThisApp;(2)在源文件Demo.cpp中:#include "Demo.h"CDemoWnd::CDemoWnd(){m_nX0 = 0;m_nY0 = 0;m_nX1 = 0;m_nY1 = 0;}CDemoWnd::~CDemoWnd(){}BEGIN_MESSAGE_MAP(CDemoWnd,CFrameWnd)ON_MESSAGE(WM_PAINT,OnPaint)END_MESSAGE_MAP()LRESULT CDemoWnd::OnPaint(WPARAM wParam,LPARAM lParam) {CPaintDC dc(this);CPen Pen1,*pOldPen1;Pen1.CreatePen(PS_SOLID,10,RGB(255,255,0));pOldPen1=dc.SelectObject(&Pen1);dc.SelectObject(&Pen1);dc.MoveTo(10,10);dc.LineTo(100,100);CPen Pen2,*pOldPen2;Pen2.CreatePen(PS_SOLID,4,RGB(255,0,255));pOldPen2=dc.SelectObject(&Pen2);dc.SelectObject(&Pen2);POINT pt1[]={{100,10},{10,180},{200,150}};dc.Polyline(pt1,3);CPen Pen3,*pOldPen3;dc.SelectStockObject(BLACK_BRUSH);Pen3.CreatePen(PS_SOLID,4,RGB(255,0,0));pOldPen3=dc.SelectObject(&Pen3);dc.SelectObject(&Pen3);dc.Rectangle(300,50,400,150);CPen Pen4,*pOldPen4;dc.SelectStockObject(GRAY_BRUSH);Pen4.CreatePen(PS_SOLID,4,RGB(0,255,0));pOldPen4=dc.SelectObject(&Pen4);dc.SelectObject(&Pen4);dc.Ellipse(500,200,700,400);CPen Pen5,*pOldPen5;Pen5.CreatePen(PS_SOLID,4,RGB(0,0,255));pOldPen5=dc.SelectObject(&Pen5);dc.SelectStockObject(DKGRAY_BRUSH);dc.SelectObject(&Pen5);POINT pt2[]={{250,250},{400,250},{475,379},{400,509},{250,509},{175,379}};dc.Polygon(pt2,6);return 0;}BOOL CDemoApp::InitInstance(){CDemoWnd *pMainWnd = new CDemoWnd();pMainWnd->Create(NULL,"Demo Mini-MFC");pMainWnd->ShowWindow(m_nCmdShow);pMainWnd->UpdateWindow();m_pMainWnd = pMainWnd;return TRUE;}2、程序运行结果:3、总结在MFC 程序中绘制图形的基本操作步骤:(1)获取图形设备接口。

基于MFC的绘图软件设计

基于MFC的绘图软件设计

摘要绘图软件在多种工作中都有着很多的运用,而当前很多办公中的中小型绘图软件的缺乏使得小型绘图软件的开发显得十分必要。

因此论文着眼于当前使用较多的C++语言作为软件的开发语言。

运用C++软件中的软件基础库类(MFC)进行实用的绘图软件的开发。

MFC作为C++封装技术的主要体现,不仅拥有C++语言在绘图方面上的各类优势,同时与Windows系统能够有较多的信息交互。

因此基于MFC的绘图软件可以较好的将被处理的图片从抽象变成直观。

同时使用MFC设计绘图软件的过程中运用图形设备接口(GDI)来与Windows进行互相的信息交互。

运用MFC技术编写出的绘图软件有着界面简洁、功能较多等诸多优点。

因此基于MFC的绘图软件设计为很多中小型企业或工作室的绘图提供一套较为完善的解决方案。

关键字:绘图软件,MFC1AbstractDrawing software in a variety of work has a lot of use, and many of the current office in the lack of small and medium drawing software is the use of graphics software development is very necessary. So the paper focuses on the current use of more C + + language as a software development tools. The use of C + + software in the software base library (MFC) for practical drawing software development. MFC as the main embodiment of C + + encapsulation technology, not only has the C ++ language in the drawing of various advantages, while the Windows system can have more information exchange. So MFC-based drawing software can be better to be processed from the abstract image into an intuitive. At the same time the use of MFC design graphics software in the process of using the graphical device interface (GDI) to communicate with each other Windows information. The use of MFC technology to write the graphics software has a simple interface, more features and many other advantages. So MFC-based drawing software design for many small and medium enterprises or studio drawings to provide a more complete solution.Keywords:Drawing software,MFC21、绪论1.1 课题来源及意义随着计算机绘图辅助设计系统(即CAD系统)的渐渐成熟,图形绘制软件已经成为学校,工厂及各种小型工作室等不可缺的一大工具,大型绘图软件AutoCad ,Solidworks,Pro/E,MatLab也被人们广泛使用,但由于占用资源过大,运行速度慢,界面操作较为复杂,不能很好满足大部分普通人需求。

用MFC绘制各种数学图形,如sin,cos等

用MFC绘制各种数学图形,如sin,cos等

用MFC绘制各种数学图形,如sin,cos等**理工大学C++面向对象课程设计报告院(系):计算机工程学院专业:计算机科学与技术学生姓名:__**班级计算111 学号: 2011070** 题目:设计绘制各种数学图形程序_起迄日期:_2013.6.23~2013.7.5 设计地点:计算机学院机房指导教师: *** 完成日期: 2013 年7月 5 日目录一、需求分析1.选做此课题的目的 (3)2.程序所实现的功能 (3)二、设计内容1.模块图 (3)2.主程序及其主要模块的流程图 (3)3.类图 (4)3.1表达式 (4)3.2 储存运算符的栈 (5)3.3储存运算数的栈 (5)3.4 圆 (5)3.5 椭圆 (6)3.6 三叶玫瑰线 (6)3.7 四叶玫瑰线 (7)3.8 阿基米德螺线 (7)3.9 心形线 (7)4.函数关系图 (8)5.编写程序代码 (9)三、调试分析1.实际完成的情况说明 (12)2.程序的性能分析 (12)3.上机过程中出现的问题及其解决方案 (12)4.程序中可以改进的地方说明 (13)四、用户手册 (13)五、设计总结 (15)六、参考文献 (15)七、附录 (15)一、需求分析1.选作此课题的目的在日常生活中我们常常需要解决一些复杂的数学问题,而这些数学问题的解答往往可以从它的函数图形上很直观、明了的表现出来,这时快捷方便的绘制出该数学函数的图形就显得尤为重要。

所以我们使用Microsoft 提供的MFC 类库来实现数学函数图形的绘制。

2 .程序所实现的功能本程序支持用户输入一般表达式,然后输出其对应的函数图形,例如:一次(二次……)函数,三角函数,双曲余弦,双曲正弦,双曲正切,幂函数,指数函数(以10为底,以e 为底)。

另外,还支持一些供选择的数学图形,例如:圆,椭圆,三叶玫瑰线,四叶玫瑰线,阿基米德螺线,心形线。

二、设计内容1.模块图2. 主程序及主要模块的流程图表达式特殊数学图形圆主界面椭圆三叶玫瑰线阿基米德螺线四叶玫瑰线心形线开始选择图形类型No确定Yes输入表达式或参数图形结束3.类图3.1 表达式CGraphDlgpublic:double Pow(double ,double ); //幂函数求值double Operate(double ,char ,double ); //表达式求值char Precede(char ,char); //判断操作符优先级int In(char ); //判断运算数和运算符void Coordinate(); //求点的集合double Calculate(CString ,double);CGraphDlg(CWnd* pParent = NULL);enum { IDD = IDD_GRAPH_DIALOG };protected:Virtual void DoDataExchange(CDataExchange* pDX); private: ICON m_hIcon;UINT m_num; //点的数量char *m_stop;CPtrArray m_ptrarray; //点的集合变量CComboBox m_type; //图形类型CString m_expression; //表达式3.2存储运算符的栈OPTRpublic:OPTR(); //缺省构造函数int InitOPTR(); //构造一个空栈char GetT op(); //返回栈顶元素int Push(char e); //进栈char Pop(); //出栈virtual ~OPTR(); //析构函数Public:char *base; //栈底指针char *top; //栈顶指针int size; //当前已分配的存储空间3.3存储运算数的栈OPNDpublic:OPND(); //缺省构造函数int InitOPND(); //构造一个空栈double GetTop(); //返回栈顶元素int Push(double e); //进栈double Pop(); //出栈virtual ~OPND(); //析构函数Public:double *base; //栈底指针double *top; //栈顶指针int size; //当前已分配的存储空间3.4 圆circlepublic:afx_msg void OnChangeEdit1();afx_msg void OnChangeEdit2();afx_msg void OnChangeEdit3();afx_msg void OnButton1();circle(CWnd* pParent = NULL);enum { IDD = IDD_DIALOG1 }; Public:double m_x; //圆心横坐标double m_y; //圆心纵坐标double m_r; //半径3.5椭圆ellipsepublic:afx_msg void OnChangeEdit1(); afx_msg void OnChangeEdit2(); afx_msg void OnChangeEdit3(); afx_msg void OnChangeEdit4(); afx_msg void OnButton1(); ellipse(CWnd* pParent = NULL); enum { IDD = IDD_DIALOG2 }; Public:double m_x; //椭圆中心横坐标double m_y; //椭圆中心纵坐标double m_lr; //长轴double m_sr; //短轴3.6 三叶玫瑰线sanyiepublic:afx_msg void OnChangeEdit1(); afx_msg void OnChangeEdit2(); afx_msg void OnButton1(); sanyie(CWnd* pParent = NULL); enum { IDD = IDD_DIALOG3 }; Public:double m_a; //系数adouble m_b; //角度θ3.7 四叶玫瑰线3.8 阿基米德螺线3.9 心形线siye public:afx_msg void OnChangeEdit1();afx_msg void OnChangeEdit2();afx_msg void OnButton1();siye(CWnd* pParent = NULL);enum { IDD = IDD_DIALOG4 }; Public:double m_a; //系数adouble m_b; //角度θajimide public:afx_msg void OnChangeEdit1();afx_msg void OnButton1();ajimide(CWnd* pParent = NULL); enum { IDD = IDD_DIALOG5 }; Public:double m_a; //系数adouble m_b; //角度θxinxingxian public:afx_msg void OnChangeEdit1();afx_msg void OnButton1(); xinxingxian(CWnd* pParent = NULL); enum { IDD = IDD_DIALOG6 }; Public:double m_a; //系数a4.函数关系图CGraphDlg::OnButton1() 类circle类ellipse类sanyie类siye 类ajimide类xinxingxianCGraphDlg::OnDrawing()circle::OnButton1()siye::OnButton1()ellipse::OnButton1()sanyie::OnButton1()ajimide::OnButton1()xinxingxian::OnButton1()CGraphDlg::Coordinate()CGraphDlg::Calculate(CString m_expression,double x)OPTR::Push(char ) CGraphDlg::Precede(char s,char c)CGraphDlg::In(char ch)OPND::GetTop()OPND::Pop()OPTR::GetTop()OPND::Push(double e)OPTR::InitOPTR() OPND::InitOPND()OPTR::GetTop()(箭头代表调用)CGraphDlg::Operate(double,char,double )CGraphDlg::Pow(double, double )5. 编写程序代码1.画坐标轴CClientDC dc(this);CRect rect;GetClientRect(&rect) ;dc.SetMapMode(MM_LOMETRIC) ; //设置映射模式;dc.SetWindowOrg(0,0) ; //设置屏幕窗口原点;dc.SetViewportOrg(CPoint(rect.right/2,rect.bottom/2)) ; //设置视口原点CPen pen1(PS_DOT,1,RGB(100,100,100)); //创建笔,并调整坐标颜色CPen *pOldPen = dc.SelectObject(&pen1); //更改笔并保存旧的笔for(int i=-900;i<=900;i+=50){dc.MoveTo (i,500);dc.LineTo (i,-500);}for(int j=-500;j<=500;j+=50){dc.MoveTo (-900,j);dc.LineTo (900,j);}dc.TextOut (10,500,'y'); //标记y轴dc.TextOut (870,0,'x'); //标记x轴dc.TextOut (0,0,'0'); //标记坐标原点dc.TextOut (-8,510,'^');dc.TextOut (900,25,'>');CPen pen(PS_SOLID,1,RGB(0,0,0));//创建笔,并调整坐标颜色pOldPen = dc.SelectObject(&pen);//更改笔并保存旧的笔dc.MoveTo (-900,0); //横坐标dc.LineTo (900,0);dc.MoveTo (0,-500); //纵坐标dc.LineTo (0,500);}2.选择图形类型//默认是表达式RedrawWindow();m_expression="";UpdateData(FALSE);CString text;m_type.GetWindowText(text);if(text=="圆"){circle d_circle;d_circle.DoModal(); //显示画圆的对话框}else if(text=="椭圆"){ellipse d_ellipse;d_ellipse.DoModal(); //显示画椭圆的对话框}else if(text=="三叶玫瑰线"){sanyie d_sanyie;d_sanyie.DoModal(); //显示画三叶玫瑰线的对话框}else if(text=="四叶玫瑰线"){siye d_siye;d_siye.DoModal(); //显示画四叶玫瑰线的对话框}else if(text=="阿基米德螺线"){ajimide d_ajimide;d_ajimide.DoModal(); //显示画阿基米德螺线的对话框} else if(text=="心形线"){xinxingxian d_xinxingxian;d_xinxingxian.DoModal(); //显示画心形线的对话框}3.根据表达式画出图形for(m_num-=1;m_num>0;m_num--) //从点集合中依次取出点并且相连{dc.MoveTo (((CPoint *)m_ptrarray.GetAt(m_num))->x,((CPoint *)m_ptrarray.GetAt(m_num))->y);dc.LineTo (((CPoint *)m_ptrarray.GetAt(m_num-1))->x,((CPoint *)m_ptrarray.GetAt(m_num-1))->y);}4. 画圆dc.Ellipse((m_x-m_r)*50,(m_y+m_r)*50,(m_x+m_r)*50,(m_y-m_r)*50); //调用Ellipse函数5. 画椭圆dc.Ellipse((m_x-m_lr)*50,(m_y+m_sr)*50,(m_x+m_lr)*50,(m_y-m_sr)*50);//调用Ellipse函数6. 画三叶玫瑰线double x=0,y=0;dc.MoveTo (0,0); //从原点开始画for(double p=-3.14;p<=3.14;p+=0.01) //计算点的同时画线{x=m_a*cos(3*(m_b+p))*cos(p);y=m_a*cos(3*(m_b+p))*sin(p);dc.LineTo(50*x,50*y);dc.MoveTo(50*x,50*y);dc.SelectObject(&pen);}7. 画四叶玫瑰线double x=0,y=0;dc.MoveTo (0,0); //从原点开始画for(double p=-3.14;p<=3.14;p+=0.01) //计算点的同时画线{x=m_a*sin(2*(m_b+p))*cos(p);y=m_a*sin(2*(m_b+p))*sin(p);dc.LineTo(50*x,50*y);dc.MoveTo(50*x,50*y);dc.SelectObject(&pen);}8. 画阿基米德螺线double p=-10;double x=0,y=0;x=m_a*p*cos(p);y=m_a*p*sin(p);dc.MoveTo (x*20,20*y);for( p=-10;p<=10;p+=0.01) //计算点的同时画线{x=m_a*p*cos(p);y=m_a*p*sin(p);dc.LineTo(20*x,20*y);dc.MoveTo(20*x,20*y);dc.SelectObject(&pen);}9. 画心形线double x=0,y=0;dc.MoveTo (0,0); //从原点开始画for(double p=-3.14;p<=3.14;p+=0.01) //计算点的同时画线{x=m_a*(1-cos(p))*cos(p);y=m_a*(1-cos(p))*sin(p);dc.LineTo(50*x,50*y);dc.MoveTo(50*x,50*y);dc.SelectObject(&pen);}三、调试分析1.实际完成的情况说明(完成的功能、支持的数据类型等)本程序支持用户选择数学图形类型并输入相应的参数,然后输出其对应的函数图形。

基于MFC下真实感图形实现

基于MFC下真实感图形实现

基于MFC下真实感图形实现摘要:计算机图形图像领域中,真实感只是计算机辅助人们表达场景的一种表达方式,能满足人的某一方面的需求(产生照片般真实的图像),真实感渲染追求的是逼真的模拟现实场景。

本文用Visual C++的MFC框架实现通过建立“真实感图形学”程序,包括消隐绘制几何球体类、颜色模型类、光照模型类、材质类、基于颜色缓冲区和深度缓冲区的直线基元和三角形基元类、基于z-buffer算法的场景深度消隐类等。

实现泛光灯和聚光灯下的光照线框球体、光照刻球体、光滑光照球体。

1、前言自二十世纪六十年代计算机图形学出现开始,对仿真真实世界的追求一直是图形学界不懈努力的目标。

经典的真实感图形学致力于产生仿真图像和视频,其对真实世界的再现达到照片的水平,并使人们无从分辨。

真实感图形学已经成为计算机图形学中的一个重要组成部分,在日常工作、学习和生活中已经有了非常广泛的应用。

它的基本要求就是在计算机中生成三维场景的真实感图形图像。

迄今为止,真实感图形学一般采用物理建模的方法,从物理模型出发,对场景的颜色、材质等属性进行模拟,并仿真光线和对象的交互,来产生真实的结果。

这和人们观察世界、摄影、摄像的过程是完全一致的。

在众多工作中,光线跟踪和辐射度算法已经成为真实感图形学的经典方法。

由于真实世界的丰富多样,并且自然界的种种过程极其复杂,并且难以预测,因此通过模拟真实世界来实现真实感渲染是一项极端复杂的工作。

在传统的基于物理模型的方法中,研究人员在定义场景时,对对象的材质种类和场景光照进行精挑细选,并由此产生令人信服的结果图像。

为了避免极端的计算复杂性,很多研究致力于采用特殊方法实现特定类别的对象的模拟,比如微观世界或者化学过程的仿真。

但是我们仍然无法给真实世界定义一个通用的模型。

本文的应用程序中对场景中的物体进行透视投影,并作隐藏面的消隐,然后计算可见面的光照明暗效果,得到场景的真实感图形显示。

2、绘制直线直线是最基本的图形元素,是构成复杂图形的基础,直线绘制算法的优劣对整个图形系统的效率和质量有着直接而重要的影响。

MFC实现简单画图形程序

MFC实现简单画图形程序

《MFC编程及应用》课程设计报告题目:简单画图形程序学号:姓名:指导老师:时间:评语:程序设计步骤:一、 建立基于对话框的应用程序框架;二、 CMy0910200155Dlg 类中关键新增变量的作用:CPtrArray pta; //用于保存已绘图形的相关信息。

CMemoryNode *pmN; //指向CMemoryNode 类的指针,程序运行过程中动态保存对象信息。

CMemoryNode CMemoryNode *pmn; *pmn; //指向CMemoryNode 类的指针,从文件中读取信息时动态创建类的对象。

COLORREF m_CurrentBrushColor; //用于存放当前画刷的颜色。

COLORREF m_CurrentPenColor; //用于存放当前画笔的颜色。

int num; // 用于存放从"Index.txt"文件中读取的数字。

int flag=0; //用于标识:当为1时,表示按下了”画图”按钮;当为2时,表示按下了”撤消”按钮;当为3时,表示按下了”加载历史”按钮,则从文件中读取信息。

int mark; //用于标识:当为0时,表示刚画过矩形;当为1时,表示刚画过圆角矩形;当为2时,表示刚画过椭圆。

int index; //用于存放pta 数组的容量。

int flag1=0; //用于标识,和flag 搭配,用来处理多种情况下的窗口重绘问题。

int ButtonState=0; //用于标识,是类CShow 和类CMy0910200155Dlg的一个接口,通过其值在1和0之间转换,来处理弹出式对话框的初次绘制和移动时的重绘问题。

三、 CMemoryNode 类中变量的作用:COLORREF BrushColor; COLORREF PenColor; int Mark; //以上三者为类CMemoryNode 的成员变量,的成员变量,分别用来保存分别用来保存 绘图时画刷颜色,画笔颜色和形状。

【计算机图形学课程】一.MFC基本绘图函数使用方法

【计算机图形学课程】一.MFC基本绘图函数使用方法

【计算机图形学课程】⼀.MFC基本绘图函数使⽤⽅法这是最近我《计算机图形学》课程实践编程课介绍的相关知识,主要是想通过MFC C++绘图,让学⽣体会下图形学相关的编程及简单的图形绘制,同时⾮常佩服学⽣的想象⼒,他们做得真的不错。

希望这篇基础⽂章对你有所帮助吧!尤其是有这门课程的学⽣或编程爱好者,如果⽂章存在错误或不⾜之处,还请海涵。

参考书籍:孔令德·《计算机图形学基础教程(Visual C++版)》学⽣绘制的图形还是⾮常有创新的,表⽰很满意,哈哈哈~⼀. MFC绘图基础知识 CDC类PS:这部分主要引⼊孔令德⽼师的知识,这篇⽂章以后⾯的编程为主。

VC++具有强⼤的绘图功能,虽然基于对话框的应⽤我推荐⼤家使⽤C# Winform程序,但是计算机图形和图像的基础知识,还是强烈推荐使⽤VC++ MFC实现。

这有助于让你深⼊的理解图形变换、图像处理等知识。

在Windows平台下,GDI(Graphics Device Interface)图形设备接⼝被抽象为上下⽂CDC类(Device Context,DC)。

Windows平台直接接收图形数据信息的不是显⽰器和打印机等硬件设备,⽽是CDC对象。

MFC中,CDC类定义设备上下⽂对象的基类,封装了所需的成员函数,调⽤CDC类的成员函数,绘制和打印图形及⽂字。

CDC类派⽣出CClientDC类、CMetaFileDC类、CPaintDC类和CWindowDC类,请读者⾃⾏学习,同时推荐阅读原书。

MFC常⽤CPoint、CRect、CSize等数据类型。

(1) CPoint类:存放点坐标(x,y);(2) CRect类:存放矩形左上顶点和右下⾓顶点的坐标(top、left、right、bottom),其中(top,left)为矩形的左上⾓点,(right,bottom)为矩形的右下⾓点;(3) CSzie类:存放矩形的宽度和⾼度的坐标(cx,cy),其中cx为矩形的宽度,cy为矩形的⾼度。

Visual C++ MFC的图形绘制

Visual C++ MFC的图形绘制

实验2 Visual C++ MFC的图形绘制一、实验目的1.了解Windows应用程序的特点。

2.掌握MFC类库中CDC类绘图函数的使用方法。

3.使用VisualC++开发简单Windows程序。

二、实验内容利用VisualC++6.0设计一个简易绘图板,完成简单的绘图功能。

三、实验指导1. 带菜单界面制作新建一个单文档类型的MFC AppWizard (exe)工程,工程取名为:Graphic。

为此程序添加一个子菜单,菜单名称为“绘图”,并为其添加六个菜单项,分别用来控制不同图形的绘制。

当用户选择其中的一个菜单项后,程序将按照当前的选择进行相应图形的绘制。

添加的六个菜单项的ID及名称如表1所示。

然后分别为这六个菜单项添加命令响应,本程序让视类(CGraphicView)对这些菜单命令进行响应,这六个响应函数的名称分别如表1所示。

在程序运行以后,当用户单击某个菜单项时,应该把用户的选择保存起来,以便随后的绘图操作使用。

因此在CGraphicView类中添加一个私有变量m_nDrawType;用来保存用户的选择,该变量的定义如下所述:private: UINT m_nDrawType;接着,在视类的构造函数中将此变量初始化为0,程序代码如下:CGraphicView::CGraphicView(){// TODO: add construction code herem_nDrawType=0;}利用switch/case语句,来分别完成相应图形的绘制。

当用户选择【绘图】菜单下的不同子菜单项时,将变量m_nDrawType设置为不同的值。

程序代码如下:void CGraphicView::OnDot(){// TODO: Add your command handler code herem_nDrawType=1;}void CGraphicView::OnLine(){// TODO: Add your command handler code herem_nDrawType=2;}void CGraphicView::OnRectangle(){// TODO: Add your command handler code herem_nDrawType=3;}void CGraphicView::OnEllipse(){// TODO: Add your command handler code herem_nDrawType=4;}void CGraphicView::OnShanxing(){// TODO: Add your command handler code herem_nDrawType=5;}void CGraphicView::OnLianxuxian(){// TODO: Add your command handler code herem_nDrawType=6;}2. 点、直线、矩形、椭圆的绘制对于直线、矩形和椭圆,在绘制时都可有两点来确定其图形。

矿产

矿产

矿产资源开发利用方案编写内容要求及审查大纲
矿产资源开发利用方案编写内容要求及《矿产资源开发利用方案》审查大纲一、概述
㈠矿区位置、隶属关系和企业性质。

如为改扩建矿山, 应说明矿山现状、
特点及存在的主要问题。

㈡编制依据
(1简述项目前期工作进展情况及与有关方面对项目的意向性协议情况。

(2 列出开发利用方案编制所依据的主要基础性资料的名称。

如经储量管理部门认定的矿区地质勘探报告、选矿试验报告、加工利用试验报告、工程地质初评资料、矿区水文资料和供水资料等。

对改、扩建矿山应有生产实际资料, 如矿山总平面现状图、矿床开拓系统图、采场现状图和主要采选设备清单等。

二、矿产品需求现状和预测
㈠该矿产在国内需求情况和市场供应情况
1、矿产品现状及加工利用趋向。

2、国内近、远期的需求量及主要销向预测。

㈡产品价格分析
1、国内矿产品价格现状。

2、矿产品价格稳定性及变化趋势。

三、矿产资源概况
㈠矿区总体概况
1、矿区总体规划情况。

2、矿区矿产资源概况。

3、该设计与矿区总体开发的关系。

㈡该设计项目的资源概况
1、矿床地质及构造特征。

2、矿床开采技术条件及水文地质条件。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第九章使用MFC实现真实感图形绘制真实感图形绘制是计算机图形学的一个重要组成部分。

它综合利用数学、物理学、计算机科学和其他学科知识在计算机图形设备上生成象彩色照片那样的真实感图形。

要用计算机图形设备绘制场景的真实感图形,就必须首先在计算机中建立该场景的模型,用这个模型来反映场景的特点和属性。

这一模型通常是由一批几何数据及数据之间的拓扑关系来表示的,这就是造型技术,它是真实感图形绘制技术的重要组成部分。

有了三维场景的模型,并给定了观察点和观察方向以后,就可以通过几何变换和投影变换在屏幕上显示该三维场景的二维图像。

为了使二维图像具有立体感,并尽可能逼真地显示出该物体在现实世界中被观察到的形象,就需要运用适当的光照模型,来模拟场景在现实世界中受到各种光源照射时的效果,这就是真实感图形的画面绘制技术,也就是真实感图形的生成技术。

用计算机在图形设备上生成连续色调的真实感图形大致可以分为以下四步:第一步,用数学方法建立所需三维场景的几何描述,并将它们输入至计算机。

这部分工作可由三维立体造型或曲面造型系统来完成。

场景的几何描述直接影响了图形的复杂性和图形绘制的计算耗费,因此选择合理的、有效的数据表示和输入手段是非常重要的。

第二步,将三维几何描述转换为二维投影图。

这可以通过对场景的投影变换来完成。

第三步,确定场景中的所有可见面,这需要使用隐藏面消除算法将被其他物体遮挡的不可见面消去。

第四步,计算场景中可见面的颜色,严格地说,就是根据基于光学物理的光照明模型计算可见面投射到观察者眼中的光亮度大小和色彩分量,并将它转换成适合图形设备的颜色值,从而确定投影画面上每一象素的颜色,最终生成图形。

前三步的相关知识在前面已经进行了介绍,本章将重点介绍如何通过MFC 编程的方式,利用光照模型计算场景中可见面的光亮度和颜色,并绘制最终的真实感图形。

实际上,现在OpenGL和DirectX等图形函数库提供了很多支持真实感图形绘制的函数,使用它们可以更轻松的完成真实感图形绘制。

本章仍采用最基本的MFC编程方式来实现真实感图形绘制,是为了让读者可以更好的体会和理解真实感图形绘制中用到的光照模型等相关知识的原理。

9.1演示程序使用的场景造型场景造型又叫几何造型,它是在计算机中建立的用于描述现实场景的几何模型,它是真实感图形生成的一个重要部分。

在真实感图形中,一个景物的场景造型体现了该景物的几何特征和景物属性。

场景造型的复杂程度直接决定了最终绘制的真实感图形的效果。

本章的重点在于光照模型的实现,所以本章中的演示程序没有创建复杂场景,只使用了一种景物——球体。

演示程序根据球体的函数方程,计算球体表面的参数点坐标,然后按这些参数点对球体表面作三角剖分,最后利用光照模型对剖分得到的三角面片计算光照并进行绘制。

9.1.1 球体造型球体表面的函数方程式如下:u r z z w wu r y y u wu r x x sin ],[cos cos ],[cos cos +=∈+=-∈+=0002022πππ 其中,坐标),,(000z y x 为球心坐标,而坐标),,(z y x 为球面上的参数点坐标,r 为半径,u 、w 分别为纬度和经度参数变量。

我们创建一个MFC 项目RealityDemo ,该应用程序作为本章中的演示程序。

在该应用程序中添加一个类CObject3D ,其基类为CObject 。

该类的实例对应场景中的一个景物。

为了定义景物,需要定义如下结构体://三维空间中点struct Point3D{double x;double y;double z;};//三角面struct TriSurface{int no;//所属景物序号Point3D p1,p2,p3;//三角面的顶点double xn,yn,zn;//三角面的法向量};//景物光照参数struct Param{double krd;//景物表面红色光漫反射率double kgd;//景物表面绿色光漫反射率double kbd;//景物表面蓝色光漫反射率double kra;//景物表面红色光泛光反射率double kga;//景物表面绿色光泛光反射率double kba;//景物表面蓝色光泛光反射率double krs;//景物表面红色光镜面反射率double kgs;//景物表面绿色光镜面反射率double kbs;//景物表面蓝光镜面反射率int n;//景物表面镜面高光指数};Point3D 定义了三维空间中的一点。

而TriSurface 则定义了一个三角面片。

结构体Param 中的各成员变量指定了景物的光照参数,其具体含义将会在介绍光照模型时说明。

我们在CObject3D 类中添加如下的成员变量和成员函数:public://球体表面三角剖分后得到的三角面列表CArray<TriSurface,TriSurface> m_SurfaceList;Param m_Param;//球体表面光照参数Point3D p3d[101][101];//球体表面参数点数组int countx,county;//生成的参数点在经度和纬度上的数量double bx,by,bz;//圆心坐标public://创建指定球心和半径的球体void CreateBall(double x0, double y0, double z0, double r);void SetSurfaceList();//对球体表面进行三角剖分void SetFVector(TriSurface* surface);//设置三角面的法向量void SetParam(Param param);//设置球体表面光照参数9.1.2生成球体表面参数点成员函数CreateBall用于生成球体表面的参数点,并按这些参数点对球体表面进行三角剖分,将剖分生成的三角面片存入到列表m_SurfaceList中,其中三角剖分由成员函数SetSurfaceList完成。

CreateBall函数的实现代码如下://创建一个球体void CObject3D::CreateBall(double x0, double y0, double z0, double r){int i=0,j;double pi = 3.1415926;bx = x0;by = y0;bz = z0;for (double u = -pi/2;u<pi/2+pi/32;u=u+pi/32){j = 0;for (double v = 0;v<2*pi-pi/32;v=v+pi/32){p3d[i][j].x = x0 + r * cos(u) * cos(v);p3d[i][j].y = y0 + r * cos(u) * sin(v);p3d[i][j].z = z0 + r * sin(u);j++;}i++;}countx = i;county = j;SetSurfaceList();}其中u和v的步长决定了产生的球体表面的参数点的数量。

countx和county 需要在类的构造函数中设置初始值为0。

程序中将生成的球体表面参数点存入到p3d数组中,这样做是为了方便对球体表面进行三角剖分。

9.1.3球体表面三角剖分对球体表面进行三角剖分采用如下方法。

设球体表面上一个参数点为P[i][j],则其经度上的下一个参数点为p[i+1][j],而纬度上的下一个参数点为p[i][j+1],再加上该点在对角线方向上的下一个参数点p[i+1][j+1],这四个点构成的区域可以剖分成两个三角面片。

第一个三角面片的顶点为p[i][j],p[i+1][j],p[i+1][j+1],第二个三角面片的顶点为p[i][j],p[i][j+1],p[i+1][j+1]。

在生成三角面片的同时需要计算该三角面片的法向量,因为在计算光照的时候需要用到此法向量。

平面上两个向量的叉乘积即为平面的法向量,其方向性满足右手定则,计算的时候需要注意法向量的方向应该是指向球外的。

执行三角剖分的函数SetSurfaceList和计算法向量的函数SetFVector实现代码如下://球体表面进行三角剖分void CObject3D::SetSurfaceList(){for (int i=0;i<countx-1;i++){for (int j=0;j<county;j++){TriSurface surface1;surface1.p1 = p3d[i][j];surface1.p2 = p3d[(i+1)%countx][(j+1)%county];surface1.p3 = p3d[(i+1)%countx][j];SetFVector(&surface1);m_SurfaceList.Add(surface1);TriSurface surface2;surface2.p1 = p3d[i][j];surface2.p2 = p3d[i][(j+1)%county];surface2.p3 = p3d[(i+1)%countx][(j+1)%county];SetFVector(&surface2);m_SurfaceList.Add(surface2);}}}//计算三角面的法向量void CObject3D::SetFVector(TriSurface* surface){double xu,yu,zu,xv,yv,zv,d;xu = surface->p2.x - surface->p1.x;yu = surface->p2.y - surface->p1.y;zu = surface->p2.z - surface->p1.z;xv = surface->p3.x - surface->p1.x;yv = surface->p3.y - surface->p1.y;zv = surface->p3.z - surface->p1.z;d = sqrt((yu * zv - yv * zu) * (yu * zv - yv * zu) +(zu * xv - zv * xu) * (zu * xv - zv * xu) +(xu * yv - xv * yu) * (xu * yv - xv * yu));surface->xn = (yu * zv - yv * zu) / d;surface->yn = (zu * xv - zv * xu) / d;surface->zn = (xu * yv - xv * yu) / d;}在计算三角面片的法向量时计算的是单位法向量。

相关文档
最新文档