《第2章简单图形软件包1.ppt》由会员分享,可在线阅读,更多相关《第2章简单图形软件包1.ppt(68页珍藏版)》请在三一办公上搜索。
1、第2章 一个简单的二维光栅图形软件包,SRGP(Simple Raster Graphics Package),2,知识点:扫描转换 图元的声明 图元的属性控制 获取用户输入的两种方法 简单的交互程序的结构 画布 裁剪窗口 位块拷贝 显示模式,3,要求:掌握扫描转换、画布、裁剪窗口等概念;掌握图元(点、直线段、折线、标记、圆弧、椭圆弧、字符)的含义及其参数指定方式;掌握如何对图元进行属性(线型、线宽、颜色等)控制;了解用来获取用户输入的两种基本方式:取样方式和事件驱动方式了解如何通过如上两种输入方式设计简单的交互式绘图程序;了解位块拷贝功能;掌握4种基本的显示模式:覆盖、或、异或、与。,4,矢
2、量显示(随机扫描显示器)和光栅显示是两种完全不同的图形显示技术 目前,光栅显示技术占主要地位 1、光栅显示可以用颜色或图案来填充一个区域;2、光栅显示以象素为单位进行读写和存储,可以实现对物体细节的描述;3、图形的任意部分均可以被移动和复制。,2.1 用图形软件包绘图2.2 基本的交互处理2.3 光栅操作,应用模型,应用程序,SRGP,图形硬件设备,输出流,输入流,2.1 用图形软件包绘图,图元的声明图元的属性填充图元及属性保存和恢复图元的属性字符,2.1 用图形软件包绘图,2.1.1 图元的声明绘图纸,屏幕,坐标系扫描转换:将顶点(参数表示的图形)转换为点阵(像素)表示的图形,2.1 用图形
3、软件包绘图,基本图元绘制:点、直线段、折线、多边形、圆弧、字符。数据类型:struct Point int x,y;typedef int*VertexCoordList;或typedef Point*VertexList;,1.点、直线段和折线Void PutPixel(int x,int y,int color);/画点函数,color:颜色值。Void LineCoord(int x0,int y0,int x1,int y1);Void Line(Point*pt1,Point*pt2);/画线函数,Void polylineCoord(int vertexCount,VertexCo
4、ordList xArray,VertexCoordList yArray);Void polyline(int vertexCount,VertexList vertices);/画折线函数。polyline(6,bowtieArray);,2.标记Void MarkerCoord(int x,int y);Void Marker(Point*pt);/端点做标记。3.多边形和矩形Void Polygon(int VertexCount,VertexList vertices);/画多边形。,,*,12,三种不同的方式:Void RectangleCoord(int leftx,int bo
5、ttom Y,int right X,int topY);Void RectanglePoint(Point*leftBottom,Point*rightTop);Void Rectangle(Rectangle*rect);/画矩形Typedef struct Point leftBottom,rightTop;Rectangle,4.圆弧和椭圆弧Void CircleArc(Point*center,int radius,int startAngle,int endAngle);/画圆弧Void EllipseArc(Rectangle*externRect,int startAngle,
6、int endAngle);/画椭圆,作为对比,vc提供了画图函数画点画线折线圆弧椭圆圆填充等,Vc绘图简介,15,绘图点,用坐标画点:pDC-SetPixelV(10,15,RGB(255,0,0);用点画点:CPoint Point;Point.x=10;Point.y=15;pDC-SetPixelV(Point,RGB(255,0,0);,画点举例,坐标,颜色,点,颜色,17,程序代码画线函数,X1,Y1,X2,Y2,用坐标画线:pDC-MoveTo(0,0);pDC-LineTo(100,150);,画线举例,坐标,用点画线:CPoint Point1;CPoint Point2;P
7、oint1.x=0;Point1.y=0;Point2.x=100;Point2.y=150;pDC-MoveTo(Point1);pDC-LineTo(Point2);,画线举例,点,Point1,Point2,例:,20,绘图圆弧函数,x1,y1,x2,y2,x3,y3,x4,y4,x3,y3和x4,y4为圆弧起点终点,x1,y1和x2,y2为圆弧的矩形框,可计算半径,逆时针方向,21,例:,ps,pe,圆弧举例,22,绘图椭圆函数(画整圆),绘图整圆,x1,y1,x2,y2,x1,y1和x2,y2为圆弧的矩形框,可计算半径,24,画整圆举例,例:,2.1.2 图元属性,图元的外观由属性决
8、定,属性是全局状态变量。1.线型和线宽Void SetLineStyle(enum LineStyle lineStyle);枚举变量 lineStyple预定义线型:CONTINUOUS(实线)、DASHED(虚线)、DOTTED(点线)Void SetLineWidth(int lineWidth);,2.1.2 图元属性,图元在显示时被扫描转换成离散的像素写入帧缓冲器中,线型控制可看作有选择地写像素的位屏蔽器.位屏蔽器为0表示帧缓存中相应的像素值不变(即透明),为1表示用线段的颜色值代替帧缓存中相应的像素值。,图元属性,2.颜色SRGP中,设置颜色属性有三种方式:三种指定颜色的方式通过查
9、色表索引值通过颜色名称通过红、绿、蓝三分量Void SetColorByName(cnum Colors colorName);/使用逻辑颜色名,实际对应的颜色取决于系统查色表,逐段定义线色号,图元属性,Void SetColor(int colorIndex);/直接使用整数值来指定,colorIndex即是指向查色表某表项的索引值Void SetColor(int red,int green,int blue);/直接赋颜色分量值(对真彩色系统而言),2.1.3 填充图元及其属性,封闭的图元有二种绘制方式-线画图:只画出边框;-填充图:填充其内部区域;Void FillRectangle(
10、Rectangle*rec);/矩形Void FillPolygon(int vertexCount,VertexList Vertices);/多边形Void FillEllipse(Rectangle*extentRect);/椭圆Void FillEllipseArc(Rectangle*extentRect,int startAngle,int endAngle);/扇形,区域填充属性,填充式样:,空心,实心,图案,区域填充属性,填充颜色,填充图案,填充方式设置(控制填充图元的外观)Void SetFillStyle(enum FillStyle fillstyle)/设置填充方式的函
11、数 FillStyle定义如下:enum FillStyleSOILD,/以当前前景色均匀填充图元BITMAP_PATTERN_OPAQUE,BITMAP_PATTERN_TRANSPARENT,/以规则排列的位图填充;PIXMAP_ PATTERN/以规则排列的像素图填充;位图:二值图像 像素图:多值图像SRGP提供位图/像素图资源表,2.1.3 填充图元及其属性(续),以规则排列的位图填充BITMAP_PATTERN_OPAQUE/不透明方式,对应位图中“1”的像素用前景色(即当前设定的颜色)显示;对应位图中“0”的像素用背景色显示。背景色由函数void SetBackgroundColo
12、r(int colorIndex)设定。BITMAP_PATTERN_TRANSPARENT/透明方式,对应位图中“1”的像素依然用前景色显示;对应位图中“0”的像素,颜色保持不变。,无论是以位图还是像素图填充图元,图元所呈现的颜色总依赖于当前系统查色表的内容,因为位图/像素图中保存的仅仅是颜色的索引值。,2.1.4 保存和恢复图元的属性,目的:为了提高程序的模块化程度 Void InquireAttributes(AttributeGroup*group);Void SetAttributes(AttributeGroup*group);/AttributeGroup 为SRGP定义的结构,
13、其中包括:前景色、背景色、线型、线宽、填充方式、查色表等SRGP支持的所有属性。,2.1.5 字符,属性:字体(宋体,楷体)、字形(粗体,斜体)、字型(7 X 9,16 X 24)、字间距、行间距。点阵字符的参数Void OutText(Point*origin,char*text)/产生一个字符,其中的x坐标标明字符串text中第一个字符的左边界,y坐标确定基线位置。Void SetFont(int fontindex)/设置当前的字体和字型,37,2.2.1 基本原则2.2.2 逻辑输入设备2.2.3 输入方式 请求 取样方式事件驱动方式2.2.4 设置输入方式属性,2.2 基本的交互处理
14、,38,提供简单一致的交互操作序列;(menu,button)交互的每一阶段,清晰显示可选项;样式简洁,选项有层次、简单;给用户适当的反馈(highlight,光标形状);允许用户取消操作(Undo),解决方法:菜单、按钮、加亮、变灰、光标变化等等,2.2.1 交互系统设计的基本原则:,39,2.2.2 逻辑输入设备,设计软件包要考虑设备无关性与软件可移植性SRGP所支持的逻辑输入设备有:定位设备 键盘设备(一般逻辑输入设备有几种?六种逻辑输入设备,即定位设备、笔划设备、字符串设备、定值设备、选择设备、拾取设备)逻辑输入设备到实际物理设备的映射由设备驱动程序完成,40,一般逻辑输入设备,主要逻
15、辑输入设备(交互任务):定位:单点定位、多点定位选择:菜单选择、图素拾取字符串:输入字符串数值:输入实数值,41,定位定位中的基本问题,定位设备用来输入一个位置坐标(x,y)坐标系统:用户坐标系、屏幕坐标系、物体坐标系分辨率:定位数据精度,精度较低可以采用局部放大进行精确定位网格约束:将鼠标位置定位在网格上反馈:显示定位数据或位置,42,定位定位中的基本问题,单点定位:每次输入一个点,完成一次交互输入。笔划定位:每次输入多个点,完成一次交互输入。,用于图形的输入点,43,选择功能,选择功能:选择菜单、命令(选择)选择几何图素(拾取),44,字符输入,字符输入向应用程序输入字符串可用的方法词、短
16、语、词组以词条形式提供选择键盘输入字符识别,45,数值输入,数值输入向应用程序输入实数值可用的方法键盘输入选择数字模拟数值方法数字、语音识别,对话框实现,46,数值输入,对话框实现,47,2.2.3 输入方式,输入控制方式:说明输入操作与应用程序之间的关系,与应用关系紧密3种方式:请求方式:效率低,但有时必须使用取样方式:取样输入设备的状态,效率不高易丢失信息事件方式:系统提供运行于后台的监控程序,监控每一个输入事件并将信息存入事件队列中。应用程序可以主动处理事件。,48,请求方式,应用程序与输入操作是串行关系,应用程序,用户操作,49,请求方式,应用程序向输入设备发出输入请求命令,这段应用程
17、序,等待用户输入数据,步骤(设定输入模式后),用户执行一个输入操作,应用程序得到数据,继续执行,应用:应用程序需要输入数据,以便计算,例如输入一个点,50,2.2.4 取样方式,应用程序按一定周期测试输入设备是否有输入,如果有输入,马上进行处理,优点:随时读入用户输入的数据,对用户的动作给出实时反馈,缺点:在两个检测周期内,会丢失数据,51,设置输入设备的输入方式:Void SetInputMode(enum Device inputDevice,enum InputMode inputMode)枚举变量Device与InputMode的定义为:enum DeviceLOCATOR,/定位设备
18、KEYBOARD,/键盘设备;enum InputMode INACTIVE,/非激活状态SAMPLE,/取样方式EVENT;/事件驱动方式,2.2.4 取样方式,指定设备类型,指定设备方式,举例:设定位设备为取样方式SetInputMode(LOCATOR,SAMPLE);,52,定位设备:输入的信息分为3部分:光标当前的位置各个键的状态(UP还是DOWN)哪个键(左键还是右键)发生了状态改变?信息获取函数Void SampleLocator(LocatorMeasure,*measure);,2.2.4 取样方式,53,2.2.5 事件驱动方式,应用程序与输入操作是并行关系,应用程序,输入
19、动作,输入动作,输入动作,用户操作,54,2.2.5 事件驱动方式,应用程序随时查询输入队列是否有事件,如果有事件,应用程序转去处理事件,步骤(设定输入模式后),如果无事件,应用程序将挂起,等待事件。如果在指定的时间内,没有事件发生,将返回应用程序,取出事件,放入事件记录中,返回这个事件的设备值参数,从事件记录中取出数据,应用程序转去执行,55,2.2.5 事件驱动方式,应用:应用于异步输入数据的情况 优点:既不丢失数据,因为用户所有的输入操作都存入队列中,提高交互输入的速度;又具有随机性,用户随时输入,56,2.2.5 事件驱动方式,基于事件驱动方法的程序结构:初始化输入设备;dowaitE
20、vent(event);/*等待事件发生*/switch(event)/*处理事件*/case EVENT1:procedure1;break;case EVENT2:procedure2;break;while(TRUE);,57,2.2.6 设置输入设备的属性,设置输入设备的输入方式Void SetLocatorEchoType(enum EchoType echoType);/定位设备反馈方式的设置echoType取值:1.NO_ECHO 无反馈2.CURSOR 光标反馈/SRGP将各种形状的光标存储在一张资源表中,通过调用 Void SetCursor(int cursorIndex)
21、;来选择所需光标,58,2.2.6 设置输入设备的属性,3.RUBBER_LINE/RUBBER_RECT 橡皮筋线/橡皮筋矩形,由二点确定:锚点与当前光标点。锚点是固定的,锚点由函数void SetLocatorEchoRubberAnchor(Point*anchor)设置。当前光标点的位置随用户的输入而变化。,锚点,当前点,锚点,当前点,59,定位设备的各种反馈方式示例 p38 nmt 图2.11函数 Void SetLocatorMeasure(Point*position);/设置光标位置,2.2.6 设置输入设备的属性,60,键盘设备无反馈方式的属性Void SetKeyboard
22、EchoOrigin(Point*origin)/用来设置初始化时屏幕上显示输入字符串的基点。当键盘设备被激活时,缺省的状态为空串。下面键盘状态设置函数可改变缺省状态:Void SetKeyboardMeasure(char*keyMeasure)/keyMeasure代表一个字符串,2.2.6 设置输入设备的属性,61,2.3 光栅操作,2.3.1 画布2.3.2 裁剪窗口2.3.3 位块拷贝2.3.4 显示模式,62,画布(Canvas)是抽象的数据类型,用来保存菜单和屏幕上一块图像的图元称为画布。用户可以在其中画图包括一个像素图和一些控制信息具有独立的坐标系系统可以同时有多个画布,只有一
23、个处于激活状态屏幕是一个特殊的画布,唯一被显示的画布。绘图命令的作用对象是处于激活状态的画布,2.3.1 画布,63,例如点取菜单的过程:1.把菜单将要覆盖的屏幕区域保存起来2.把系统保存的菜单拷贝到屏幕上3.恢复屏幕区域,把保存的象素重新拷贝到屏幕上可用于菜单或其他象素区域有变化时的处理,2.3.1 画布,64,裁剪窗口为什么裁剪?为了描述图形对象,我们必须存储它的全部信息,但有时为了达到分区描述或重点描述某一部分的目的,往往将要描述的部分置于一个窗口内,而将窗口外的部分“剪掉”,这个处理过程叫做裁剪 内裁剪:保留窗口之内的图形外裁剪:保留窗口之外的图形 void SetClipRectan
24、gle(Rectangle*clipRect);,2.3.2 裁剪窗口,65,位块拷贝:将源画布中的矩形区域内的象素块拷贝到目标区域中,目标区域是位于当前激活画布内的一个矩形区域。void CopyPixel(int sourceCanvasID,Rectangle*sourceRec,Point*destCorner),2.3.3 位块拷贝,66,显示模式光栅运算与显示模式4种简单的显示模式覆盖/Replace或/Or异或/Xor与/AndS 源区域D 目标区域OP 光栅运算,二值图像间在各种显示模式下的运算结果,2.3.4 显示模式,67,光栅运算,异或的用途:用于光标的移动、橡胶线和加亮菜单。,11001001Xor 11111111-00110110Xor 11111111-11001001,光栅运算同样适用于多值图像,表现为相应单元间的按位逻辑运算。,68,2.4 小结,简单二维光栅图形软件包存在的问题:1 坐标系:整型坐标系,对高精度图形对象无能为力;需要把实际的坐标系(浮点数)映射到设备坐标系。2 图形的存储与恢复:对图形的比例、平移后如何绘制?图形修改后的刷新功能,