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