第3章〖5〗Chapter 3计算机图形学3.1计算机图形学概述〖4/5〗3.1.1计算机图形学相关概念〖2〗1. 计算机图形定义CG(Computer Graphics)是计算机图形的缩写。计算机图形学是随着计算机的发展,特别是图形显示器的发展而产生和发展起来的,它是计算机技术、电视技术、图形图像处理技术相互结合的结果。它既包括技术也包括艺术,几乎囊括了当今计算机时代中所有的视觉艺术创作活动,如三维动画、影视特效、平面设计、网页设计、多媒体技术、印前设计、建筑设计、工业造型设计等创作图,如图3.1所示。现在,CG的概念正在扩大,由CG和虚拟现实技术制作的媒体文化都可以归于CG的范畴。人们使用计算机或手机处理日常事务时,首先看到的便是图形化的人机交互界面,这便是计算机带给人们最直接的感受,社会需求反过来又推动了计算机图形学的快速发展。截至目前,它已经形成一个可观的经济产业。 图3.1CG创作图 计算机图形学是一门研究如何运用计算机表示、生成、处理和显示图形的学科。其研究内容非常广泛,如图形硬件、图形标准、图形交互技术、光栅图形生成算法、曲线曲面造型、实体造型、真实感图形计算与显示算法、非真实感绘制、计算机动画、自然景物仿真等。图形主要分为以下两类: ①基于线框模型描述的几何图形,主要特点是一种基于三角形网格表示的线框图形。②基于表面模型描述的真实感图形。绘制真实感的图形需要通过建模软件建立场景的几何模型,再利用一些适合的光照模型来计算场景在虚拟的光源、纹理、材质属性下的光照效果。 图形的表示方法一直都是计算机图形学关注的主要问题。其表示方法通常分为参数法和点阵法两种。参数法是在设计阶段建立几何模型时需要用形状参数和属性参数来描述图形的一种方法,这里的形状参数可以是直线段的起点、终点等几何参数。属性参数又包括对应的直线段的颜色、明暗等非几何参数。点阵法是在绘制阶段就用具有颜色信息的像素点阵来表示图形的一种方法。总体来说,对计算机图形学的学习就是将图形的表示方法从参数法转换到点阵法的一个过程。 〖1〗〖2〗〖1〗〖3〗2. 计算机图形学发展史 20世纪中期,第一台图形显示器诞生了,该显示器由美国麻省理工学院研制而成,作为旋风Ⅰ号计算机(图3.2)的附件,其功能是用来显示简单的图形,并不具备交互功能。后来,美国卡尔康公司在原来联机的数字记录仪基础上将其改进为滚筒式绘图仪。格伯公司将原来的数控机床改进为平板式绘图仪。纵观20世纪中期,计算机图形学发展的主要特点是受到计算机设备的限制比较大,机器语言的编程主要用于科学计算,因此相关图形设备仅仅具有输出功能,计算机图形学处于准备和酝酿时期。后来,美国麻省理工学院的林肯实验室在“旋风”计算机上开发了空中防御体系,第一次使用了具有指挥和控制功能的阴极射线管的显示器,操作者可以用笔在屏幕上指出被确定的目标。它预示着交互式计算机图形学的正式诞生。 20世纪中后期,美国麻省理工学院的史蒂夫教授提出了一种新的理论,即通过插值四条任意的边界曲线来构造曲面。同时,法国雷诺汽车公司的工程师贝塞尔发展了贝塞尔曲线(图3.3),以及贝塞尔曲面的理论(贝塞尔曲线也是一直延续到现在非常重要的知识点),并将其成功地用于几何外形设计,与此同时开发了UNISURF系统,用于汽车外形设计。 图3.2旋风Ⅰ号 图3.3贝塞尔曲线图 之后,计算机图形学的发展步入到了一个重要的历史时期。由于光栅显示器的产生,光栅图形学算法迅速发展起来。类似裁剪、消隐、区域填充等的基本图形学概念及其算法纷纷诞生,计算机图形学开始进入到第一个兴盛的时期。布克奈特提出了第一个光反射模型。高洛德提出“漫反射模型+插值”的思想,被称为高洛德明暗处理。这些模型的提出可以算是真实感图形学最早的开创性工作。后续相继出现了英国剑桥大学CAD小组的Build系统、美国罗切斯特大学的PADL1系统等实体造型系统。这两个重要的进展是真实感图形和实体造型技术产生的关键。 随后,怀特提出了一个怀特模型,也就是光透视模型,并给出了光线跟踪算法的范例,实现怀特模型。美国康奈尔大学和日本广岛大学的学者分别将热辐射工程中的辐射度方法引入到计算机图形学中,用辐射度方法成功模拟了理想漫反射表面间的多重漫反射效果。光线跟踪算法和辐射度算法的提出标志着真实感图形的显示算法已逐渐成熟。超大规模集成电路的发展为图形学的飞速发展奠定了物质基础。随着计算机运算能力的提高、图形处理速度的加快,图形学的各个研究方向得到充分发展,已广泛应用于动画、科学计算可视化、影视娱乐等各个领域。 3.1.2计算机图形学的应用领域〖2〗1. 计算机图形学与游戏计算机游戏是新兴的娱乐形式,其最大的特色就是能够为游戏参与者提供一个虚拟的空间,从一定程度上可以让人摆脱现实世界中的自我,也可以称为一种沉浸感。当然,计算机游戏的更新技术来自于计算机图形学,其中包括了地形生成、天空和纹理构建、角色动画系统、粒子特效、自然景物的模拟、游戏中的交互系统等。计算机游戏推动着计算机图形学的发展,而计算机图形学也为计算机游戏提供了强大的技术支持。例如,二维计算机游戏的视角比较简单,玩家都是以一种正交投影方式游戏,该方式显示的物体不会根据距离发生变化,因此只涉及二维的屏幕坐标(x,y);三维计算机游戏的视角一般都是透视视角,也就是物体会根据距离收缩,即远小近大,类似于人眼。这种视角就涉及坐标转换问题,需要将屏幕坐标与世界坐标相互转换才能实现。二维游戏、三维游戏和手机游戏如图3.4所示。 图3.4二维游戏、三维游戏、手机游戏截图 2. 计算机图形学与艺术 动画是计算机艺术的典型代表,是建立在计算机图形基础之上的影视作品,对图形的处理技术要求比较高,部分动画作品如图3.5所示。实际上,动画就是对一幅幅静图3.5部分动画作品止的图画进行一定的处理,以动态形式展现出来。最早的计算机动画就是在传统卡通片的基础上发展起来的。如今,动画制作方式有轴变形、几何建模、混合叠加等,人们更倾向采用建立在物理模型基础上制作动画的方式。这种方式的特点是以弹性力学和流体力学计算出最合适的动画模式,从而达到有效的仿真效果。 3. 计算机图形学与设计 计算机辅助设计和计算机辅助制造是计算机图形学在设计领域中运用最早也是最广泛的两种技术。典型的代表产品为AutoCAD系统软件。目前,工程建筑、机械产品设计、飞机、汽车、轮船和电子器件等产品的开发几乎都使用AutoCAD软件设计。部分AutoCAD作品如图3.6所示。 图3.6部分AutoCAD作品 4. 计算机图形学与虚拟现实 虚拟现实技术实现方式是利用计算机模拟生成一个三维的虚拟世界,跟现实世界可以一样,也可以不一样。使用者使用外置设备(一般指穿戴头盔),沉浸在其中,并获得视觉、听觉、触觉等感官的刺激,在这个过程中借助数据手套、传感器等专业设备与该环境中的人物或物体进行互动,以体验身临其境的感觉。抛开设备的重量感,如何使用户完全沉浸在模拟世界中,就是计算机图形学要解决的问题,其中包括真实感体验、渲染技术等。虚拟现实概念图如图3.7所示。 图3.7虚拟现实概念图 3.2计算机图形工具软件〖4/5〗3.2.1计算机图形非代码类工具以上详细介绍了计算机图形学的定义、发展史以及应用。那么,该用什么样的工具学习计算机图形学?用什么工具来实现想要的图形?下面针对这两个问题介绍一些工具和软件。 1. 位图图形处理软件 (1) Photoshop。 Photoshop是Adobe公司旗下最出名的图像处理软件之一,它的主要特点是功能强大,可以完成市面上其他类似软件所有的功能,操作比较简单,无需专业的美术功底也可以制作出美丽的效果。其应用领域主要有平面设计、修复照片、广告摄影、影像创意、艺术文字、绘画、绘制或处理三维贴图、图标制作、界面设计、影视后期制作等领域。 (2) Painter。 Painter是Corel公司生产的一款图形处理软件,它的主要特点是拥有全面和逼真的仿自然画笔。它具有上百种绘画工具,有超过30种不同的笔刷种类,能够模拟各种画笔的丰富效果,是素描和绘画的优质选择。它广泛应用于动漫设计、绘画制作、美术仿真、建筑设计等领域。 2. 矢量图图形软件 (1) CorelDRAW。 CorelDRAW是Corel公司开发的一款功能强大的矢量图形设计软件。它融合了绘制与编辑、动画制作、位图转换、高品质输出等强大功能;具有相当多的形状和曲线工具;支持组合、调整多个单独形状;属性栏为画面调整和修改提供良好的服务。 (2) Illustrator。 Illustrator是Adobe公司推出的专业矢量绘图工具。它与Adobe Flash整合在一起,其路径、锚点、渐层、剪裁遮色片和符号均保持不变。此外也保留图层、群组和物件名称,能够更快速和流畅地在 Illustrator 中绘图。其应用在手绘、动漫、UI设计及印刷等领域。 (3) Freehand。 Freehand是Adobe公司一个功能强大的平面矢量图形设计软件。它绘制漫画主要用到形状、路径、渐变色填充、混合等工具和功能。其应用领域主要有广告创意、书籍海报、机械制图、建筑蓝图等。 3. 二维动画设计软件 Flash是由Macromedia公司推出的交互式矢量图设计工具,后被Adobe公司收购。它的功能有绘图和编辑图形、动画和动作、矢量设计、交互等。其应用领域主要有移动互联网相关的矢量动画设计、应用程序开发、界面开发、游戏开发、多媒体娱乐等。 4. 三维动画设计软件 (1) 3ds Max。 3ds Max是Autodesk公司旗下优秀的电脑三维动画、模型和渲染软件。它不仅可以制作静态模型,也可以绑定动作,但最主要的应用还是在建筑方面。其应用领域主要有影视、建筑装饰、游戏和设计领域等。 (2) Maya。 Maya是Autodesk公司出品的三维动画制作软件,它不仅可以制作简单的三维模型,还可以与数字化布料模拟、毛发渲染、运动匹配技术相结合。特别是对人物或动物的动作绑定,通过动作调节参数,以达到完美的运动效果。其应用领域主要有现实世界的模拟与仿真,特别是毛发、布料、波浪等;网站资源开发;影视特效;游戏设计及开发学习内容等。 (3) After Effects。 After Effects是Adobe公司生产的一款视频后期合成软件,它专门制作影视后期的特效,提供数百种预设的效果和动画。其应用领域主要有影视制作、商业广告、合成影像、后期制作等。 3.2.2计算机图形代码类实现工具〖2〗1. MFCMFC(Microsoft Foundation Classes)是微软基础类库的简称,是微软公司实现的一个C++类库,主要封装了大部分Windows API函数,VC++是微软公司开发的C/C++的集成开发环境。MFC除了是一个类库以外,还是一个框架,在VC++里新建一个MFC的工程,开发环境会自动产生许多文件,同时也会自动生成若干动态链接库,也就是dll文件。与此同时,MFC的内核是封装好的,所以代码中无法查看编辑文件,这样开发人员就可以专心考虑程序的逻辑,而不是做一些重复的工作。 2. Linux下常用的框架Qt Qt是Qt公司开发的一个跨平台的图形用户界面应用程序开发框架。它既可以开发GUI程序,也可以用于开发非GUI程序,比如服务器。Qt是面向对象的框架,使用特殊的代码生成扩展以及一些宏,易于扩展,允许组件编程。跨平台集成开发环境Qt Creator 3.1.0的正式发布,实现了对iOS的完全支持,新增WinRT、Beautifier等插件,废弃了无Python接口的GDB调试支持,集成了基于Clang的C/C++代码模块,并对Android支持做出了调整,至此实现了全面支持iOS、Android。 3. GTK+ GTK(GIMP Toolkit)是一个跨平台的图形工具包,按LGPL(Lesser General Public License)许可协议发布的。虽然最初是为GIMP写的,但早已发展为一个功能强大、设计灵活的通用图形库。特别是被GNOME选中,使得GTK+广为流传,成为Linux下开发图形界面应用程序的主流开发工具之一。当然,GTK+并不要求必须运行在Linux上,事实上,目前GTK+已经有了成功的Windows版本。 以上3款代码类软件都有其针对的领域和优点,可以根据需要选择合适的软件组合。适合的软件可以使工作得心应手,效率更高。多种软件综合使用,相互补充,可以发挥各自的优势。 3.3Visual Studio 2012软件介绍及实例〖4/5〗3.3.1Visual Studio 2012软件介绍〖2〗1. Visual C++简介Visual C++是微软提供的C++开发工具,简称VC++。它与C++的根本区别就在于C++是语言,而VC++是用C++语言编写程序的工具平台。VC++不仅是一个编译器,更是一个集成开发环境,包括编辑器、调试器和编译器等,它一般包含在Visual Studio中。Visual Studio包含了VB、VC++、C#等编译环境。自微软发布Visual Studio.NET以来,建立了在.NET框架上的代码托管机制,一个项目可以支持多种语言开发的组件。VC++同样被扩展为支持代码托管机制的开发环境,所以.NET Framework是必需的,也就不再有VC++的独立安装程序,不过可以在安装Visual Studio时只选择VC++进行安装。 2. 版本选择 随着VC++版本的更新,对C++标准的支持越来越好,对各种技术的支持也越来越完善。但同时新版本所需的资源也越来越多,对处理器和内存的要求越来越高。本章将使用Visual Studio 2012,它的类库和开发技术都是最完善的。 3. 界面介绍 Visual Studio 2012的开始界面如图3.8所示。注意要养成良好的习惯,按照程序的功能或内容来设置文件名和文件路径,放在一个专门的文件夹中。 图3.8Visual Studio的开始界面 单击新建项目后弹出图3.9所示对话框。这里需要选择项目类型,并决定项目存放的位置。也可以在页面的左上角单击文件→新建→项目,选择新建的项目类型。 图3.9新建项目对话框 接下来介绍常用功能。设计窗体时,工具箱是一个所见即所得的工具,可以直接在里面拖曳控件。首先打开视图→工具箱,然后将其固定在窗口的左端,如图3.10所示。 图3.10工具箱界面 在资源管理器中可以找到程序的所有文件,单击视图→解决方案资源管理器,如图3.11所示。这时就会出现解决方案资源管理器的界面,选择相应的控件即可打开编辑。 图3.11解决方案资源管理器选项 添加控件完成后开始编写程序,进入代码的编写窗口中。单击并选中要编写的控件,然后双击或直接按F7键跳转到代码界面。当程序设计好或编写到一半,想要查看一下程序运行的情况,可以单击“调试”按钮,或直接按F5键或Ctrl+F5键(常用于控制台程序)。单击停止调试即可回到编辑状态。程序调试界面如图3.12所示。 图3.12程序调试界面 3.3.2MFC实例教程 本节讲解代码方面的理论知识。首先讲解关于类的知识点,再讲解代码的内容,“//”符号后面是对代码的解释。 1. 类的概念 类是面向对象程序设计中的概念,也是面向对象编程的基础。简单来说,类是对现实生活中一类具有共同特征的事物的抽象。类是抽象的,不具体的。就像有些东西可以归为一类,比如狗、猫、猪。它们都是动物,就可以将其归为一类。而猫、狗就可以成为动物类中的一个对象。一组经过用户自定义的类会使这个程序更加简洁。类的内部封装了方法,它们用于更方便地操作类自身的成员。 2. CDC类的定义 CDC类提供处理显示器或打印机等设备上下文的成员,以及处理与窗口客户区对应的显示上下文的成员。通过CDC类的成员函数进行所有的绘图。CDC类派生了CClientDC、CMetaFileDC、CPaintDC和CWindowDC四个子类,每个子类都有其对应的功能,如表3.1所示。它还为获取和设置绘图属性、处理视点、窗口扩展、转换坐标、处理区域、粘贴、绘制直线及绘制简单椭圆和多边形等形状提供了成员函数。使用CDC对象时首先要构造它,然后再调用成员函数。续表表3.1CDC派生的4个子类 类名拓 展 内 容CClientDC① CClientDC类只能在客户区绘图; ② 所谓客户区,指窗口区域中去掉边框、标题栏、菜单栏、工具栏、状态栏等之外的部分,它是用户可以操作的区域; ③ 使用CClientDC绘图时,一般要调用GetClientRect()函数来获取客户区域的大小; ④ CClientDC类在构造函数中调用Windows API函数GetDC(),在析构时响应ReleaseDC(); ⑤ CClientDC类的窗口句柄保存在成员变量m_hWnd,为构造CClientDC,需将CWnd作为参数传递给构造函数 CWindowDC① CWindowDC对象在构造时调用Windows API函数GetWindowDC(),在析构时调用相应的API函数ReleaseDC(),这意味着CWindowDC对象可访问CWnd所指向的为整个全屏幕区域; ② CWindowDC允许在显示器的任意位置绘图。坐标原点在整个窗口的左上角。 ③ 使用CWindowDC绘图时,一般要调用GetWindowRect()函数来获取整个应用程序窗口区域的大小; ④ CWindowDC类的窗口句柄保存在成员变量m_hWnd,为构造CClientDC,需将CWnd作为参数传递给构造函数CPaintDC① 通常CPaintDC用来响应WM_PAINT消息。一般应用在OnPaint()函数; ② CClientDC也是从CDC派生出来的。构造时自动调用GetDC()函数,析构时自动调用ReleaseDC()函数,一般应用于客户区窗口的绘制; ③ CPaintDC只能在WM_PAINT消息中使用,用于有重画消息发出时才使用的内存设备环境,而CClientDC和客户区相关,有重画消息发出时才使用的内存设备环境,可在任何地方使用; ④ 在处理窗口重画时,必须使用CPaintDC,否则WM_PAINT消息无法从消息队列中清除,将引起不断的窗口重画CMetaFileDC① 在应用程序中,有一些图像是需要经常重复显示的。这样的图形最好事先绘制好,形成一个文件,并存储在内存中,用到它时直接打开就可以了,这种图形文件叫作图元文件; ② 制作图元文件需要一个特殊的设备描述环境CMetaFileDC类。它也是由CDC类继承来的,因此包含了CDC类的所有绘图方法; ③ 一般先在视图类的OnCreate()函数中创建图元文件。具体做法为先定义一个CMetaFileDC类的对象,然后用该对象的Create()函数创建它,该函数的原型为BOOL Create(LPCTSTR lpszFilename=NULL); ④ 接下来使用由CDC继承的绘图方法绘制图元文件,最后使用Close()函数结束绘制,并保存该图元文件到类的数据成员中(该数据成员的类型应为HMETAFILE)。 ⑤ 需要显示该图元文件时,使用CDC类的成员函数PlayMetaFile()。不再使用该图元文件时,要用函数DeleteMetaFile()将其删除3. 常用绘图类 CPoint、CRect、CSize是对Windows的POINT、RECT、SIZE结构体的封装,因此可以很方便地使用其成员和变量,如表3.2所示。表3.2常用绘图类及结构定义 类名结 构 定 义CPoint类存放二维点坐标(x,y)。POINT结构体的定义为: typedef struct tagPOINT { LONG x;//点的x坐标 LONG y;//点的y坐标 } POINT,PPOINT;CRect类存放矩形左上角点和右下角点的坐标,对应的RECT结构体定义为: typedf struect _RECT {LONG left;//左上角点的x坐标 LONG top;//左上角点的y坐标 LONG right;//右下角点的x坐标 LONG bottom;//右下角点的y坐标 }RECT,PRECT;CSize类存放矩形x方向的长度和y方向的长度(cx,cy)。对应的SIZE结构体定义为: typedef struct tagSIZE { LONG cx;//矩形的宽度 LONG cy;//矩形的高度 }SIZE,PSIZE;4. 绘图工具类(表3.3)表3.3绘图工具类及其用法 绘图工具类名用 法 及 内 容CGdiObjectGDI绘图工具的基类,一般不能够直接使用CBitmap封装了一个GDI位图,提供位图操作的接口CBrush封装了GDI的画刷,可以选作设备上下文的当前画刷,用于填充封闭图形的内部CFont封装了GDI字体,可以选作设备上下文的当前字体CPalette封装了GDI调色板,提供应用程序和显示器之间的颜色接口CPen封装了GDI画笔,可以选作设备上下文的当前画笔,用来绘制图形边缘的线CRgn封装了一个Windows的GDI区域,这一块区域用作某一窗口中的一个椭圆或多边形区域5. 映射模式 什么是映射模式呢?就是把图形显示在屏幕坐标系中的过程。根据映射模式的不同,也可以分为逻辑坐标和设备坐标。当然,MFC也提供了几种不同的映射模式来适应不同的需求。这包括MM_TEXT、MM_LOMETRIC、MM_HIMETRIC、MM_LOENGLISH、MM_HIENGLISH、MM_TWIPS、MM_ISOTROPIC、MM_ANISOTROPIC等模式。注意,在默认情况下,一般使用的设备坐标系为MM_TEXT,其特点是坐标原点位于客户区左上角,x轴水平向右,y轴垂直向下,坐标基本单位为一个像素。 使用映射模式时也需要对应的映射函数。使用各向同性的映射模式MM_ISOTROPIC、各向异性的映射模式MM_ANISOTROPIC时,需要调用的映射函数是SetWindowExt()和SetViewportExt(),它们可以用来改变窗口和视图区域的设置。其余模式则不需要调用。而MM_TEXT、MM_LOMETRIC、MM_HIMETRIC、MM_LOENGLISH、MM_HIENGLISH、MM_TWIPS等映射模式主要应用于使用物理单位(英寸/毫米)来绘图的情况。 这几种映射模式都是写在OnDraw函数中,下面以MM_ANISOTROPIC模式为例。Void CTestView::OnDraw(CDCpDC) { CTestDocpDoc=GetDocument(); ASSERT_VALID(pDoc); CRect rect;//此语句表示声明了一个客户区为矩形的面板 GetClientRect(&rect);//在声明好的客户区中获取其坐标 pDC->SetMapMode(MM_ANISOTROPIC);//SetMapMode为映射模式中的方法 ... }6. GDI对象的使用 GDI是图形设备接口(Graphics Device Interface 或Graphical Device Interface)的简称,是微软公司的视窗操作系统(Microsoft Windows)的三大内核部件之一,也是微软视窗系统表征图形对象的标准。 在MFC中需要使用GDI对象,具体内容如表3.4所示。 7. MFC图形绘制实例 MFC有几种常见的绘图方法,包括OnDraw()成员函数可以直接绘图、使用菜单绘图、使用自定义函数绘图等。在即将讲解的案例中,绘图方法以使用OnDraw()成员函数直接绘图为主,并且通过CDC类中的主要几种绘图成员函数来绘制简单的图形。 实例一: 绘制像素点。 知识点: MFC在Visual Studio 2012中的使用方法。 CDC类成员中绘制像素点的函数使用。 OnDraw()函数的绘制过程。 MFC中语法的基本编写方式。 步骤1: 打开Visual Studio 2012软件,新建名为ProjectOne的项目,选择MFC应用程序并单击“确定”按钮,弹出界面如图3.13所示。 图3.13建立MFC项目 步骤2: 在应用程序类型里选择单个文档,项目类型为MFC标准,然后单击“完成”按钮即可,向导界面如图3.14所示。 图3.14MFC应用向导 步骤3: 进入项目界面,左边包括程序源文件(cpp)、头文件(.h)和资源文件(.ico、.bmp等),如图3.15所示。接下来使用头文件下的ProjectOneView.h和源文件下的ProjectOneView.cpp两个文件。然后双击ProjectOneView.cpp,在右侧代码编写面板处找到OnDraw()函数。 图3.15程序文件 步骤4:如果在OnDraw()函数里直接编写代码,会出现错误,需要将图3.16中箭头所指的/和/去掉,目的是注销一些语句。完成此项工作后,就可以在OnDraw()函数里面正常编写绘制像素点的代码了,详细代码如下。 图3.16注释部分 Void CProjectOneView::OnDraw(CDC pDC) { CProjectOneDoc pDoc =GetDocument(); ASSERT_VALID(pDoc); If(!pDoc) return; //TODO: 在此处为本机数据添加绘制代码 COLORREF clr;//声明一个COLORREF类型的变量,名字为clr,用来存放像素点的颜色 int x=20,y=20;//定义了两个整型的参数x、y并赋值 pDC->SetPixelV(x,y,RGB(0,255,0)); //SetPixelV是绘制像素点的方法,代表在(20,20)处绘制红色点 Clr=pDC->GetPixel(x,y);//将绘制好的点颜色赋值给clr pDC->SetPixelV(x+100,y,clr);//绘制第二个点 }步骤5: 单击工具栏的按钮进行程序调试。目的是在(20,20)和(20+100,20)这两处坐标绘制像素点1、像素点2。由于绘制的是像素点,所以特别小,图3.17所示是放大后显示出来的效果。图3.17像素点示意图 实例二: 绘制面(矩形)。 知识点: 画笔的声明。 画笔类型的了解。 矩形函数。 MFC中参数的熟练运用。 步骤1: 依旧在OnDraw()函数里面编写代码。编写前需要考虑两点: 矩形4个点的确定,矩形边缘线条和内部颜色填充分别需要画笔和笔刷。这能使编程思路更加清晰。具体代码和注释如下。void CProjectOneView::OnDraw(CDCpDC) { CProjectOneDocpDoc =GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // TODO:在此处为本机数据添加绘制代码 CPen NewPen,pOldPen;//声明一个新画笔对象和原画笔指针 NewPen.CreatePen(PS_SOLID,1,RGB(255,0,0));//创建一个新的1像素宽的红色实线画笔;PS_SOLID代表画笔的样式 pOldPen=pDC->SelectObject(&NewPen);//将创建的新画笔选入设备上下文中,以便程序读取 CBrush NewBrush,pOldBrush;//声明新的笔刷对象和原笔刷指针。填充矩形内部 NewBrush.CreateSolidBrush(RGB(249,104,240));//创建实体的粉色笔刷来填充矩形 pOldBrush=pDC->SelectObject(&NewBrush);//同样将新建的笔刷也选入设备上下文 pDC->Rectangle(100,100,600,300);//绘制矩形,Rectangle是绘制矩形的方法,括号里的参数代表矩形(4个坐标)的位置 pDC->SelectObject(pOldBrush);//以上语句已绘制完成,本语句代表恢复原有笔刷 NewBrush.DeleteObject();//因为绘制完成,所以要清理掉之前的笔刷,否则会占用内存 pDC->SelectObject(pOldPen);//同样恢复原有画笔 NewPen.DeleteObject();//最后再删除画笔 }步骤2: 运行项目,效果如图3.18所示。 图3.18粉色矩形示意图 注意: 本程序用到了画笔类型(PS_SOLID)实现画笔。表3.5所示为几款常用的画笔。表3.5常用画笔 画 笔 样 式线 条 样 式宽度值PS_SOLID实线随意指定PS_DASH虚线1或者更小PS_DOT点线1或者更小PS_DASHDOT点画线1或者更小PS_DASHDOTDOT双点画线1或者更小PS_NULL不可见线随意指定PS_INSIDEFRAME内框架线随意指定课后习题〖*2〗1. 填空题(1) 图形的表示方法有和。 (2) 第一台图形显示器是由研制而成的。 (3) 提出了第一个光反射模型。 (4) 高洛德提出的思想,被称为高洛德明暗处理。 (5) 根据映射模式的不同,映射模式也可以分为和。 2. 简答题 (1) 参数法的定义是什么? (2) 点阵法的定义是什么? (3) 纵观20世纪中期,计算机图形学发展的主要特点是什么? (4) 类的概念是什么? (5) 什么是映射模式呢? 3. 实践题 请根据之前所学,运用MFC绘制一个椭圆。椭圆的绘制方法为Ellipse(int x1,int y1,int x2,int y2)。 参考文献 \[1\]孔令德.计算机图形学: 基于MFC三维图形开发\[M\]. 2版. 北京: 清华大学出版社,2021. \[2\]陆玲. Visual C++数字图像处理\[M\]. 2版. 北京: 中国电力出版社,2021. \[3\]孔令德.计算机图形学\[M\].北京: 清华大学出版社,2021. \[4\]任哲. MFC Windows应用程序设计\[M\]. 3版. 北京: 清华大学出版社,2013.