绘图系统设计及实现教学教材Word文档下载推荐.docx
《绘图系统设计及实现教学教材Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《绘图系统设计及实现教学教材Word文档下载推荐.docx(17页珍藏版)》请在冰豆网上搜索。
主机由中央处理器(CPU)和内存储器(简称内存)组成,是整个计算机绘图系统的核心。
衡量一个主机性能的指标中相互要有两项:
CPU性能和内存容量。
1.CPU性能
CPU的性能决定着计算机的数据处理能力、运算精度和速度。
CPU的性能通常用每秒可执行的指令数目或进行浮点运算的速度指标来衡量,其单位符号为MI/S(每秒处理1百万条指令)和GI/S(每秒处理10亿条指令)。
目前,CPU的速度已达到160GI/S以上。
一般情况下,用芯片的时钟频率来表示运算速度更为普遍,时钟频率越高,运算速度越快。
2.内存容量
内存是存放运算程序、原始数据、计算结果等内容的记忆装置。
如果内存容量过小,将直接影响计算机绘图软件系统的运行效果。
因为,内存容量越大,主机能容纳和处理的信息量也就越大。
(二)外存储器
外存储器简称为外存,虽然内存储器可以直接和运算器、控制器交换信息,存取速度很快,但内存储器成本较高,且其容量受到CPU直接寻址能力的限制。
外存作为内存的后援,是计算机绘图系统将大量程序、数据库、图形库存放在外存器中,待需要时再调入内存进行处理。
外存储器通常包括硬盘、软盘、光盘等。
(三)图形输入设备
在计算机绘图作业过程中,不仅要求用户能够快速输入图形,而且还要求能够将输入的图形以人机交互方式进行修改,以及对输入的图形进行图形变换(如缩放、平移、旋转)等操作。
因此,图形输入设备在计算机绘图硬件系统中占有重要的地位。
目前,计算机绘图系统常用的输入设备有键盘、鼠标、扫描仪等。
(四)图形输出设备
图形输出设备包括图形显示器、绘图仪、打印机等。
图形显示器是计算机绘图系统中最为重要的硬件设备之一,主要用于图形图像的显示和人机交互操作,是一种交互式的图形显示设备,其主要部件是阴极射线管(CRT)。
它有3种类型:
直接存储管式显示器、射线刷新式显示器、光栅扫描式显示器。
目前,交互式图形系统采用的主流显示器是基于CRT的光栅扫描式显示器。
其工作原理与电视机相似,不同之处在于电视机利用摄像机产生的模拟信号构成屏幕上的图像,而光栅扫描式显示器则利用计算机产生的数字信号构成屏幕上的图像。
衡量显示器性能的主要指标是分辨率和显示速度。
对于光栅扫描式显示器而言,沿水平和垂直方向单位长度上所能识别的最大光点数称为分辨率(光点也称为像素)。
对于相同尺寸的屏幕,点数越多,距离越小,分辨率就越高,显示的图形也越精细。
显示速度同显示器在输出图形时采用的分辨率以及计算机本身处理图形的速度有关。
从人机工程学的角度来看,通常应满足人眼观察图形时不出现闪烁这一基本要求,图形屏幕的刷新速度应不低于30帧/秒。
随着人们对显示器轻型化、薄型化以及大尺寸的要求,目前,液晶显示器和等离子显示器的应用越来越多。
由于这些显示器的制造成本逐渐降低,已呈现出取代基于CRT的光栅扫描式显示器的趋势。
绘图仪、打印机等也是目前常用的图形输出设备。
目前,常用的绘图仪为滚筒式绘图仪,这种绘图仪具有结构简单紧凑、图纸长度不受限制、价格便宜、占用工作面积小等优点。
常用的打印机主要有针式、喷墨、激光打印机等。
三、软件系统概述
计算机软件是指控制计算机运行,并使计算机发挥最大功效的各种程序、数据及文档的集合。
在计算机绘图系统中,软件配置水平决定着整个计算机绘图系统的性能优劣。
因此可以说硬件是计算机绘图系统的物质基础,而软件则是计算机绘图系统的核心。
从计算机绘图系统的发展趋势来看,软件占据着愈来愈重要的地位,目前,系统配置中的软件成本已经超过了硬件。
目前而言,计算机绘图系统的软件可以分为3个层次,即系统软件、支撑软件和应用软件。
系统软件是与计算机硬件直接关联的软件,一般由专业的软件开发人员研制,它起着扩充计算机的功能以及合理调度与使用计算机的作用。
系统软件有2个特点:
一是公用性,无论哪个应用领域都要用到它;
二是基础性,各种支撑软件及应用软件都需要在系统软件的支撑下运行。
支撑软件是在系统软件的基础上研制的,它包括进行计算机绘图作业时所需的各种通用软件。
应用软件则是在系统软件及支撑软件支持下,为实现某个应用领域内的特定任务而开发的软件。
下面分别对这3类软件进行具体介绍。
(一)系统软件
系统软件主要用于计算机的管理、维护、控制、运行,以及计算机程序的编译、装载和运行。
系统软件包括操作系统和编译系统。
操作系统主要承担对计算机的管理工作,其主要功能包括文件管理(建立、存储、删除、检索文件)、外部设备管理(管理计算机的输入、输出等外部硬件设备)、内存分配管理、作业管理和中断管理。
操作系统的种类很多,在工作站上主要采用UNIX、Windows2000/NT/XP等;
在微机上主要采用UNIX的变种XENIX、ONIX、VENIX,以及Windows系列操作系统。
编译系统的作用是将用高级语言编写的程序翻译成计算机能够直接执行的机器指令。
有了编译系统,用户就可以用接近于人类自然语言和数学语言的方式编写程序,而翻译成机器指令的工作则由编译系统完成。
这样就可以使非计算机专业的各类工程技术人员很容易地用计算机来实现其绘图目的。
目前,国内外广泛应用的高级语言FORTRAN、PASCAL、C/C++、VisualBasic、LISP等均有相应的编译系统[2]。
(二)支撑软件
支撑软件是计算机绘图软件系统中的核心,是为满足计算机绘图工作中一些用户的共同需要而开发的通用软件。
近30多年来,由于计算机应用领域迅速扩大,支撑软件的开发研制有了很大的进展,推出了种类繁多的商品化支撑软件。
(三)计算机绘图应用软件
应用软件是在系统软件、支撑软件的基础上,针对某一专门应用领域而开发的软件。
这类软件通常由用户结合当前绘图工作的需要自行研究开发或委托开发商进行开发,此项工作又称为“二次开发”。
能否充分发挥已有计算机绘图系统的功能,应用软件的技术开发工作是很重要的,也是计算机绘图从业人员的主要任务之一
四、图形操作的基本知识介绍
(一)CD和CDC类的介绍
CDC是设备环境类的基类直接由CObject派生。
是GDI的关键元素,它代表了物理设备。
每一个C++设备环境对象都有相对应Windows设备环境,并通过一个32位类型的HDC句柄来标识。
CDC类的虚拟性使我们可以很容易的做到编写同时适用于多种设备的代码。
例如OnDraw函数的pDC->
TextOut(0,0,"
Hello"
);
既可以适用于显示器、还可以适用于打印预览和打印,只需要在CView:
:
OnDraw函数的pDC参数指向不同的对象类[3]。
CClientDC和CWindowDC是显示设备环境类,都是由CDC派生而来,区别在于CClientDC是窗口的客户区不包括边框、标题栏和菜单栏,(0,0)指客户区域的左上角。
CWindowDC的(0,0)指整个屏幕的左上角,这意味着我们可以在显示器的任意地方绘图,包括窗口边框、标题栏和菜单栏等等。
CWindowDC一般应用在框架窗口,而不是视图窗口。
CDC对象被创建后一定要在合适的时候将它删除掉,如果忘记了删除设备环境对象则会造成内存丢失。
如何做才能避免出现这个问题呢,我们应该在堆栈中构造对象。
看例子
//例子
voidCMyView:
OnLButtonDown(UINTnFlags,CPointpoint)
{
CRectrect;
CClientDCdc(this);
//在堆栈中构造设备环境对象,用一个窗口指针this作参数。
dc.GetClipBox(rect);
//GetClipBox函数是一个虚函数,作用是可以获得选定区域的尺寸
}
//析构函数在函数返回时自动调用,也就完成对设备环境对象的删除。
书上还给出了另一种写法:
OnLButtonDown(UINTnFlags,CPointpoint)
{
CDC*pDC=GetDC();
//通过调用CWnd的GetDC()函数获得设备环境指针
pDC->
GetClipBox(rect);
//可以获得选定区域的尺寸
ReleaseDC(pDC);
//一定不能忘记,释放设备环境。
(书上写错了)
创建的设备环境对象具有一些默认的特性,通过CDC类的成员函数可以设定这些特性。
例如前一篇笔记用到的刷子、映射模式等等。
我们还可以通过重载SelectObject函数将GDI对象选进设备环境中。
(二)CDI和CGdiobject类
GDI对象是通过CGdiObject派生类的C++对象来表示的[4]。
CBrush是一个GDI的派生类,它在MFC中的层次结构是这样的:
CObject派生CGdiObject派生CBrush,明白了吧。
CGdiObject是所有GDI对象的抽象基类。
下面列出的是GDI派生类的列表:
CBitmap:
位图是一种位矩阵,每一个显示象素都对应于其中的一个或多个位,可以用来表示图象,也可以用来创建刷子
CBrush:
刷子定义了一种位图形式的象素,可以用来对区域内部填充颜色。
CFont:
字体是一种具有某种风格和尺寸的所有字符的完整集合,常常被作为资源,其中一些依赖某种设备。
CPalette:
调色板是一种颜色映射接口,它允许应用程序在不影响其他应用程序的前提下,可以充分利用输出设备的颜色描绘能力。
CPen:
笔是一种用来画线及绘制有形边框的工具,可以指定它的颜色及宽度,并可以指定画虚线、点线还是实线。
CRgn:
区域是由多边形、椭圆二者组合形成的一种范围,可以用来进行填充、裁剪、鼠标点中测试等等。
以上很容易理解,可以用WINDOWS的画图帮助我们理解。
CGdiObject类很眼生,看过很多代码就没有看到过它,原因是由于CGdiObject类是所有GDI对象类的虚拟基类,所以我们不必创建CGdiObject类的对象,可以直接构造它的派生类的对象,例如这样
CPennewPen(PS_DASHDOTDOT,2,(COLORREF)0);
//黑色的笔宽度为2
但需要注意的是CFont和CRgn的对象建立需要先调用默认的构造函数来构造C++对象,然后再调用相应的创建函数如:
CreateFont或CreatePolygonRgn等。
CGdiObject类有一个虚拟的析构函数,它派生类的析构函数需要将与C++对象相关联的GDI对象删除掉,一定要在退出程序之前把构造的CGdiObject派生类对象干掉。
因为一个没有释放的GDI对象会占用很多的内存。
让我们用一个例子跟踪一下GDI对象
voidCMy10View:
OnDraw(CDC*pDC)
MoveTo(10,10);
LineTo(110,10);
CPennewPen(PS_DASHDOTDOT,10,(COLORREF)192);
//红色的笔宽度为10
CPen*pOldPen=pDC->
SelectObject(&
newPen);
//在将新对象选进设备环境的同时返回指向前一次被选对象的指针。
作用保存原来的对象,以便完成任务时恢复它。
MoveTo(10,20);
LineTo(110,20);
SelectObject(pOldPen);
//把原来的对象恢复
MoveTo(10,30);
LineTo(110,30);
屏幕上应该显示三条线,第一条和第三条一样颜色和粗细因为他们都是用的设备环境默认的CPen对象,第二条是一条用我们自己设定的CPen对象。
我们可以看出在将新对象选进设备环境的同时返回指向前一次被选对象的指针。
作用保存原来的对
象,以便完成任务时恢复它。
Windows还包含有一些可以利用的库存对象,它们不会被删除,因为Windows对企图删除它们的动作不予理睬。
我们可以用SelectStockObject函数将它们选进设备环境。
下面列出的是所有的有关刷子、笔、字体和调色板的库存对象。
由于SelectObject函数返回的GDIC++对象指针具有临时性,当程序的空闲处理阶段或者控制函数返回时应用程序框架会将临时的C++对象删除,我们不能简单的把这一指针保存在类的数据成员中,而应该借助GetSafeHdc函数将它转化为Windows的句柄,以便持久的保存GDI的标识。
HPENm_hPen;
//一个指向CPen对象的指针
COLORREF)192);
//在将新对象选进设备环境的同时返回指向前一次被选对象的指针。
m_hPen=(HPEN)pOldPen->
GetSafeHandle();
//获得并保存原来对象的句柄
SelectObject(CPen:
FromHandle(m_hPen));
//把原来的对象恢复,和例子7-2不同的是通过句柄
补充一下IGDI派生类的Windowshandletype列表
CPenHPEN
CBrushHBRUSH
CFontHFONT
CBitmapHBITMA
CRgnHRGN
(三)图形操作中颜色的变化
标准的VGA显示卡使用的是8位颜色寄存器,所以它可以表示出262144种颜色,然而由于视频内存的限制、标准的VGA只能采用4位颜色代码,一次只能同时显示16种标准纯色。
太少了不是吗?
如何获得更加丰富的色彩呢,面向颜色的GDI函数可以使我们获得更多的颜色。
每一种WINDOWS的颜色都是通过8位RGB值的组合来表示,面向颜色的GDI函数可以接收32位的COLORREF参数,这种类型的参数包含了8位的红、绿、蓝颜色值。
WINDOWS的RGB宏可以将8位的红绿蓝值转化成COLORREF参数,经过模糊处理可以得到更多的颜色。
我们可以这样创建刷子[5]:
CBrushbrush(RGB(128,128,192));
例子
voidCMy81View:
OnDraw(CDC*pDC)
SetBkColor(RGB(255,0,0));
SetTextColor(RGB(198,198,198));
TextOut(10,10,);
在OnDraw(CDC*pDC)函数中设定文本的背景色和前景色,我们试着改变RGB宏的数值,会发现SetBkColor和SetTextColor函数并不总是显示模糊色,如果模糊色过于复杂,它们会选择与之相近的纯色来显示。
书上是这样说的。
以目前的硬件设备来说我们可以在1024X768的方式下获得24位真彩色,这意味着我们可以通过RGB宏获得任何我们想要的颜色,其实我们的肉眼已经不能分辨它们的区别了。
其实256色已经足够作出很精美的画面了。
下面我们来看看字体。
字体是GDI对象,和其他GDI对象一样它可以按比例缩放,被裁剪,可以被选进设备环境,并可以被释放和删除。
书上对于字体部分描述实在令我不愿意读,我想大家可能也是这样的心情。
那好我们便不去读它,直接用一个例子来理解字体。
例子
1)建立一个新MFCAppWizard(exe)项目“82”,除选择单文档外其余全用默认项。
2)重载My82View类的OnPrepareDC函数
voidCMy82View:
OnPrepareDC(CDC*pDC,CPrintInfo*pInfo)
SetMapMode(MM_ANISOTROPIC);
//应该还记得此种映射模式是X,Y的比例因子可以独立变化
SetWindowExt(1440,1440);
//将映射模式设置成逻辑twips即一个逻辑单位等于1/1440逻辑英寸。
SetViewportExt(pDC->
GetDeviceCaps(LOGPIXELSX),-pDC->
GetDeviceCaps(LOGPIXELSY));
用SetWindowExt和SetViewportExt定义比例GetDeviceCaps函数可以获得各种显示参数,典型的参数如下:
在640X480分辨率下:
HORZSIZE物理宽度(毫米)320
VERTSIZE物理高度(毫米)240
HORZRES象素宽度640
VERTRES象素高度480
LOGPIXEXSX每逻辑英寸的水平点数96
LOGPIXEXSY每逻辑英寸的垂直点数96
3)加入一个Private类型的辅助函数ShowFont用来显示文本。
可以用AddMemberFunction的方法加入,也可以直接修改代码
在82View.h中加入
private:
voidShowFont(CDC*pDC,int&
nPos,intnPoints);
//以下为原生成代码,不需改变
......
}
在82View.cpp中加入
ShowFont(CDC*pDC,int&
nPos,intnPoints)
TEXTMETRICtm;
TEXTMETRIC结构包含字体的所有逻辑单位信息原型如下:
typedefstructtagTEXTMETRIC{/*tm*/
inttmHeight;
inttmAscent;
inttmDescent;
inttmInternalLeading;
inttmExternalLeading;
inttmAveCharWidth;
inttmMaxCharWidth;
inttmWeight;
BYTEtmItalic;
BYTEtmUnderlined;
BYTEtmStruckOut;
BYTEtmFirstChar;
BYTEtmLastChar;
BYTEtmDefaultChar;
BYTEtmBreakChar;
BYTEtmPitchAndFamily;
inttmOverhang;
inttmDigitizedAspectX;
inttmDigitizedAspectY;
}TEXTMETRIC;
CFontfontText;
CStringstrText;
CSizesizeText;
ANSI_CHARSET,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECI