1、第一章 计算机图形学和图形系统基本知识1.1 计算机图形学的概念计算机图形学(Computer Graphics)是研究怎样用数字计算机生成、处理和显示图形的一门学科。图形的具体应用范围很广,但是从基本的处理技术看只有两类,一类是线条,如工程图、地图、曲线图表等;另一类是明暗图,与照片相似。为了生成图形,首先要有原始数据或数学模型,如工程人员构思的草图,地形航测的判读数据,飞机的总体方案模型,企业经营的月统计资料等等。这些数字化的输入经过计算机处理后变成图形输出。下面是几个图形学中的基本概念:计算机图形:用计算机生成、处理和显示图形的学科;由几何数据和几何模型,利用计算机进行显示并存储,并可以
2、进行修改、完善以及有关操作的过程;图象处理:将客观世界中原来存在的物体影象处理成新的数字化图象的相关技术;如 CT 扫描、X 射线探伤等;模式识别:对所输入的图象进行分析和识别,找出其中蕴涵的内在联系或抽象模型;如邮政分检设备、地形地貌识别等;计算几何:研究几何模型和数据处理的学科,讨论几何形体的计算机表示、分析和综合,研究如何方便灵活、有效地建立几何形体的数学模型以及在计算机中更好地存贮和管理这些模型数据;1.2 计算机图形学的发展计算机图形学的研究起源于麻省理工学院。从 50 年代初到 60 年代中,麻省理工学院积极从事现代计算机辅助设计制造技术的开拓性研究。1952 年在它的伺服构实验室
3、里诞生了世界上第一台数控铣床的原型。1957 年美国空军将第一批三坐标数控铣床装备了飞机工厂。大型精密数控绘图机也同时诞生。接着麻省理工学院发展了 APT 数控加工自动编程语言,这是目前国际上最通用的加工编程工具。1964 年孔斯(Steve Coons)在这里提出了用小块曲面片组合表示自由型曲面时使曲面片边界上达到任意高次连续阶的理论方法,此方法得到工业界和学术界的极大推崇,称之为孔斯曲面。孔斯和法国雷诺汽车公司的贝齐埃(Pierre Bzier)并列被称为现代计算机辅助几何设计技术的奠基人。第一台光笔交互式图形显示器 1962 年在麻省理工学院林肯实验室研制成功,这是 Lvan Suthe
4、rland 以博士论文形式完成的研究课题。在美国工业界,研制交互图形显示器的工作也在平行开展。其中最重要的是 IBM 公司。在1964 年秋它推出了自己的设计方案。以后经过改进,成为 IBM 2250 显示器。这是 IBM 计算机上正式提供工业界使用的第一代刷新式随机扫描图形终端。它使用光笔作为交互输入手段,并且配有一组 32 个功能键,以便调用程序中的相应功能模块。洛克希德飞机公司利用 IBM 2250 开发的 CADAM 绘图加工系统,从 1974 年起向外界转让,成为 IBM 主机上目前应用最广的 CADCAM 软件。IBM 2250 在 1978 年前后改型为 IBM 3250,但在原
5、理上并无明显变化。1984 年又改型为IBM 5080,采用光栅扫描技术,带彩色,有局部处理能力,并可以用旋钮直接放大、平移、旋转画面。光笔也改为电笔,与输入板配合使用,并操纵屏面上的光标。60 年代末、70 年代初,美国 Tektronix 公司发展了存贮管技术。显示器型号先后有4006,4010,4012 等。Tektronix 4014 曾经是 70 年代末 CAD 和工程分析中应用最广的图形终端。它的屏面尺寸是 19 英寸,画面线条清晰,分辨率可以达到 40963072,价格不到刷新式同类显示器的一半。一次输入显示命令后可以保留画面一小时,因此编程简单,复杂的画面不会象刷新式显示器那样
6、出现闪烁。它的缺点是不能局部动态修改显示画面。光栅扫描型显示器采用电视机的类似工作原理,最初主要用作图象处理。屏面象素的分辨率不很高,大多用 512512,但是色彩层次十分丰富,可以高 24 个二进制位,即红绿蓝三原色各占 8 位,各有 28256 种层次,最终组合成 224 种色彩或灰度等级。当分辨率低时,这类显示器显示线条的效果不很好,有明显的锯齿形,而且要作向量到点阵的相互转换,交互响应速度受到一定影响。图形显示缓冲器占用的存贮量大。到了 80 年代初,个人计算机象 Apple,IBMPC 以及 Apollo,SUN 等工程工作站问世,并迅速得到广大用户的欢迎,销售量激增。在这些设计中,
7、主机和图形显示器融为一体,都用光栅扫描型显示,并呆以同时生成高质量的线型图和逼真的彩色明暗图。由于大规模集成电路技术的发展和专用图形处理芯片的出现,使得光栅扫描型显示的质量越来越好,价格越来越低,现已成为图形显示器的当前常规形式。在工程设计中,联网的分布式工作站的应用也正在逐渐取代分时形式的大型主机连接几十个图形终端的结构。在图形显示技术发展的里程碑中,需要提出两家公司的产品,这就是 Evans 计算机图形核心系统 GKS(Graphics Kernel System);程序员层次交互式图形系统 PHIGS(Programmers Herarchical Interactive Graphic
8、s System);初始图形交换规范 IGES(Initial Graphics Exchange Specification),1983 年,美国国家标准局;等等。1)GKSGKS(Graphics Kernal System)提供了在应用程序和图形输入输出设备之间的功能接口,定义了一个独立于语言的图形核心系统,在具体应用中,必须符合所使用语言的约定方式,把 GKS 嵌入到相应的语言之中。GKS 在图形应用中的地位如图 2.3.1 所示。图中每个层次可以调用下一层次的功能。对于应用程序员来说,通常使用面向应用层、依赖语言的接口层以及操作系统等资源。为了使图形应用程序获得更高的可移植性,GKS
9、 的体系结构具有可更换设备驱动程序的元文件等特点。GKS的体系结构如 2.2.3 所示。其中氖的图形资源都必须由 GKS 控制, 应用程序(DDPi)不得旁路 GKS 而直接使用图形资源。GKS 在应用程序和图形输入输出设备之间 提供了功能接口,它包括一系列交互和非交互式图形设备的全部图形处理功能,大致分为以下十类。(1)控制功能:执行打开、并闭 GKS 以及使工作站进入或退出活动状态和删除工作站等;(2)输出功能:确定输出图形类型;(3)输出属性:图素的各种属性以及各种图素在工作站上的表现方式;(4)变换功能:实现规格化变换和工作站变换;(5)图段功能:对图形进行生成、删除、复制以及实现图段
10、属性控制;(6)输入功能:对各种输入设备初始化,设备工作方式、确定请求、采样和事件输入;(7)询问功能:查询 GKS 描述表、状态表、出错表、工作站描述表、图素表等,查询 GKS 状态值、级别、工作站类型、状态以及描述表,图段状态等内容;(8)实用程序:实现 GKS 的几何变换等;(9)元文件处理;(10)出错处理。GKS 作为一个二维图形的功能描述,它独立于图形设备和各种高级语言,定义了用高级评议编写应用程序与图形程序包的接口。在任何配有 GKS 的图形软件中,只要有一个上述功能子程序作为应用程序的接口,用户就可以根据自己的需要,在应用程序中调用 GKS 的各种功能,这样编制出来的应用程序可
11、方便地在具有 GKS 的不同图形系统之间移植。2)PHIGSPHIGS(Programmers Hierarchical Interactive Graphics System)是 ISO 1986 年公布的计算机图形系统标准,标准号是 ISO IS 9592。从其名称上看,包含以下三个含义。其一,是向 应用程序 员提供的控制图形设备的图形系统接口;其二,图形数据按层次结构组织,使多层次的应用模型能方便地应用 PHIGS 进行描述;其三,提供了 动态修改和绘制显示图形数据的手段。PHIGS 是为具有高度动态性,交互性的三维图形应用而设计的图形软件工具库,其最主要的特点是能够在系统中高效率地描述
12、应用模型,迅速修改图表模型的数据,并能绘制显示修改后的图形模型,它也是在程序与图形设备之间提供了一种功能接口。在图形数据组织上,它建立了独立于工作站的中心结构存储区与图形档案管理文件;在图形操作上,它建立了适应网状的图形结构模式的各种操作;在图素的设置上,它既考虑了址维与三维的结合,也满足矢量与光栅图形设备的特点。PHIGS 由 328 个用户功能子程序构成,按其内容可分为:控制、输出图元、设置属性、结构、变换、结构管理与显示、档案管理、输入、图形元文件、查询、错误控制及特殊接口功能模块。各模块相对独立,一个模块仅通过系统的公共数据结构与其他模块间相连。各模块调用的公共子程序集中在一个公共子程
13、序模块中,从而整个系统的逻辑结构清晰,且没有重复的程序功能,从而便于逐个模块地进行程序开发,并可利用已经测试通过的程序模块对正在高度的程序模块进行验证,也为整个PHIGS 的开 发提供了方便。3)GLGL(Graphics Library)是近年来在工作站上广泛 应用的一个工业标准图形程序库,按其功能可划分为如下几类:1基本图素。包括点、直线、多边形、三角形、三角形风格、矩形、圆和圆弧、字符、曲线和曲面以及读写象素等。2坐标变换。支持旋 转、平移、比例 变换以及窗口视图变换、投影 变换和裁剪,同时支持用户定义的各种变。3设置属性和显示方式。可定义 选择线型、填充图案、字体和光标,可设置 RGB
14、 和 颜色表两种选色方式以及明暗效果、双缓冲、各种位图等多种绘图方式。4输入输出。用于启动输入输出设备,并 对 相应的事件队列进行处理。5真实图形显示。 这里有消除隐藏线、面、光照处理和深度排队。GL 在 UNIX 操作系统下运行,具有 C,Fortran,Pascal 三种语言联编形式。GL 和其他三维图形标准相比具有以下特点:(1)图元丰富除具有一般图元外,还具有 B 样条曲线、 Bezier 曲面、NURBS 曲面等。(2)颜色GL 肯有 RGB 和颜色索引两种方式,有 Gourand 和 Phong 光照模型,使表面显示的亮度与色彩变化柔和。(3)Z 缓 冲技术是在每个象素上附加一个
15、24 位或 48 位的表示 Z 值的缓冲存储器,这对曲线曲面的消隐,亮度随度变化的处理,提高图形处理效率等都具有重要作用。(4)光源光源的强芭、颜色、物体的反方向、 镜面反射系数、漫反射系数等都影响到一定光源照射下物体最终的显示效果。GL 提供了充分的光源处理能力,使用户能得到非常生动的图象。(5)GL 和 X 窗口GL 既可 单独运行,也可在 X 窗口环境下运行, 进而可支持网络上的用户。4)CGRMCGRM(Computer Graphics Reference Model)是 ISO 讨论的计算机图形国际标准,其号是 ISOIEC DIS 11072。为了总结计算机图形标准化的现有成果,
16、 为下一小的标准化工作提供指导性框架,从而提出了制定CGRM 标准的要求。CGRM 定义了一个框架结构,它可用来比 较现有的和 来的计算机图形标准,描述它们之间的关系,从而为计算机图形的用户和计算机图形软件的开发者提供有关方面的重要信息。CGRM 用五个抽明的层次来定义计算机图形,分别称为构造、虚拟、 观察、 逻辑和物理环境(仿造于OSI 网 络的七层模型)。其中构造 层最高、物理 层最低、低层为高层提供服务,应用软件则建立在构造环境之上。CGRM 还定义了对每层数据元的操作。CGRM 采用输出原语来定义计算机图形的输入,通过一个存储器可以把输入信息集成为应用程序所需的形式。人概念看,在已收到
17、的输入和已产生的输出之音的联接由应用程序来处理,应用程序也可以把此事委托某个环境来处理。为了允许构造复杂的图形,CGRM 定义了一个集合存储器,由此可得到输入信息的项,从低层环境中的输入信息组合出高一层环境中的新的输入信息。具体说,CGRM 标准可用于以下几方面。(1)提炼和确认计算机图形的要求;(2)确诊计算机图形标准和外部接口的要求;(3)根据计算机图形的需求来发展模型;(4)确定新的计算机图形标准的体系;(5)对计算机图形标准进行比较;第二章 基本图形的生成与计算2.1 直线的生成算法在光栅显示器的荧光屏上生成一个对象,实质上是往帧缓存寄存器的相应单元中填入数据。画一条从(x1, y1)
18、到(x2, y2)的直线,实质上是一个发现最佳逼近直线的象素序列,并填入色彩数据的过程。这个过程也称为直线光栅化。本节介绍在光栅显示器上直线光栅化的最常用的两种算法:直线 DDA 算法和直线 Bresenham 算法。2.1.1 直线的 DDA 算法DDA 是数字微分分析式(Digital Differential Analyzer)的缩写。设直线之起点为(x1,y1) ,终点为(x2,y2) ,则斜率 m 为:m = 直线中的每一点坐标都可以由前一点坐标变化一个增量(Dx, Dy)而得到,即表示为递归式:xi+1=xi+Dxyi+1=yi+Dy并有关系:Dy = m Dx递归式的初值为直线的
19、起点(x1, y1) ,这样,就可以用加法来生成一条直线。具体方法是:图 2.1.1 直线方向的 8 个象限图 2.1.1表 2.1.1象限 |dx|dy|? D x D y1a1b2a2b3a3b4a4b 11/m-1-1/m-1-1/m11/mm1m1-m-1-m-1按照直线从(x1,y1)到(x2,y2)的方向不同,分为 8 个象限(图 2.1.1) 。对于方向在第 1a 象限内的直线而言,D x=1,D y=m。对于方向在第 1b 象限内的直线而言,取值Dy=1, Dx=1/m。各象限中直线生成时 Dx, Dy 的取值列在表 2.1.1 之中。研究表中的数据,可以发现两个规律:1、当|
20、dx|dy|时|D x|=1, |D y|=m;否则:Dx=1/m,|Dy|=12、Dx, Dy 的符号与 dx, dy 的符号相同。这两条规律可以导致程序的简化。由上述方法写成的程序如程序 2.1.1 所示。其中 steps 变量的设置,以及 D x=dx/steps; D y=dy/steps 等语句,正是利用了上述两条规律,使得程序变得简练。使用 DDA 算法,每生成一条直线做两次除法,每画线中一点做两次加法。因此,用 DDA法生成直线的速度是相当快的。dda_line (xa, ya, xb, yb, c)int xa, ya, xb, yb, c;float delta_x, del
21、ta_y, x, y;int dx, dy, steps, k;dx=xb-xa;dy=yb-ya;if (abs(dx)abs(dy) steps=abs(dx);else steps=abs (dy);delta_x=(float)dx / (float)steps;delta_y=(float)dy / (float)steps;x=xa;y=ya;set_pixel(x, y, c);for (k=1; k0,则 yi+1=yi+1,否则 yi+1=yi。因此算法的关键在于简便地求出 d1-d2 的符号。将式(2.1.1) 、 (2.1.2) 、 (2.1.3)代入 d1-d2,得d1
22、-d2=2y-2yi-1=2 (xi+1)-2yi+2b-1用 dx 乘等式两边,并以 Pi=dx(d1-d2)代入上述等式,得Pi=2xidy-2yidx+2dy+dx(2b-1) (2.1.4)d1-d2 是我们用以判断符号的误差。由于在 1a 象限,dx 总大于 0,所以 Pi 仍旧可以用作判断符号的误差。Pi-1 为:Pi+1=Pi+2dy-2dx(yi+1-yi) (2.1.5)误差的初值 P1,可将 x1, y1,和 b 代入式(2.1.4)中的 xi, yi 而得到:P1=2dy-dx综述上面的推导,第 1a 象限内的直线 Bresenham 算法思想如下:1、画点(x1, y2
23、); dx=x2-x1; dy=y2-y1;计算误差初值 P1=2dy-dx; i=1;2、求直线的下一点位置:xi+1=xi+1;if Pi0 则 yi+1=yi+1;否则 yi+1=yi;3、画点(xi+1, yi-1) ;4、求下一个误差 Pi+1;if Pi0 则 Pi+1=Pi+2dy-2dx;否则 Pi+1=Pi+2dy;5、i=i+1; if i|dy|为分支,并分别将 2a, 3a象限的直线和 3b, 4b 象限的直线变换到 1a, 4a 和 2b, 1b 方向去,以求得程序处理的简洁。void line (x1, y1, x2, y2, c)int x1, y1, x2, y
24、2, c;int dx;int dy;int x;int y;int p;int const1;int const2;int inc;int tmp;dx=x2-x1;dy=y2-y1;if (dx*dy=0) /*准备 x 或 y 的单位递变值。*/inc=1;elseinc=-1;if (abs(dx)abs(dy)if(dx0)tmp=x1; /*将 2a, 3a 象限方向*/x1=x2; /*的直线变换到 1a, 4a*/x2=tmp;tmp=y1; /*象限方向去*/y1=y2;dx=-dy;dy=-dy;p=2*dy-dx;const1=2*dy; /*注意此时误差的*/const
25、2=2*(dy-dy); /*变化参数取值. */x=x1;y=y1;set_pixel(x, y, c);while (xx2)x+;if (p0)p+=const1;elsey+=inc;p+=const2;set_piexl(x, y, c);else if (dy0)tmp=x1; /* 将 3b, 4b 象限方向的*/x1=x2; /*直线变换到 2b, 1b */x2=tmp; /*象限方向去. */tmp=y1;y1=y2;dx=-dy;dy=-dy;p=2*dx-dy; /*注意此时误差的*/const1=2*dx; /*变化参数取值. */const2=2*(dx-dy);x
26、=x1;y=y1;set_pixel (x, y, c);while (yy2)y+;if(p0)p+=const1;elsex+=inc;p+=const2;set_pixel (x, y, c);程序 2.1.2 适用于直线所有八个方向的 Bresenham 直线生成算法2.2 圆的生成算法 2.2.1 基础知识给 出 圆 心 坐 标 xc, yc,和 半 径 r,逐 点 画 出 一 个 圆 周 的 公 式 有 下 列 两 种 :1、直 角 坐 标 法 :(x-xc)2+(y-yc)2=r2由 上 式 导 出y=当 x-xc 从 -r 到 r 作 加 1 递 增 时 ,就 可 以 求 出
27、对 应 的 圆 周 点 的 y 坐 标 。但 是 这 样 求 出 的 圆 周 上的 点 是 不 均 匀 的 ;|x-xc|越 大 ,对 应 生 成 圆 周 点 之 间 的 圆 周 距 离 也 就 越 长 。因 此 ,所 生 成 的 圆 不美 观 。.2、极 坐 标 法 :x=xc+rcosy=yc+rsin当 从 0 度 到 360 作 加 1 递 增 时 ,由 此 式 便 可 求 出 圆 周 上 均 匀 分 布 的 360 个 点 的 x, y 坐 标 。利 用 圆 周 坐 标 的 对 称 性 ,此 算 法 还 可 以 简 化 :将 圆 周 分 为 8 个 象 限 (图 2.2.1)。只 要
28、 将 第 1a 象限 中 的 圆 周 光 栅 点 求 出 ,其 余 7 部 分 圆 周 就 可 以 通 过 对 称 法 则 计 算 出 来 。图 2.2.1 给 出 了 圆 心在 0,0 点 时 的 对 称 变 换 法 则 。但 即 使 作 了 如 此 简 化 ,用 上 述 公 式 每 算 一 点 ,都 要 经 过 三 角 函数 计 算 ,仍 有 相 当 大 的 计 算 量 。图 2.2.1 圆心在 0,0 点圆周生成时的对称变换在 计 算 机 中 上 述 两 个 公 式 所 示 的 方 法 生 成 圆 周 都 颇 费 时 ,下 面 介 绍 的 算 法 则 要 简 捷 得 多 。2.2.2 圆
29、的 Bresenham 算法设 圆 之 半 径 为 r。先 考 虑 圆 心 在 (0,0),并 从 x=0, y=r 开 始 的 顺 时 针 方 向 的 1/8 圆 周 的 生 成 过 程 。在 这 种 情 况 下 ,x 每 步 增 加 1,从 x=0 开 始 ,到 x=y 结 束 。即 有 :xi+1=xi+1相 应 的 yi+1 则 在 两 种 可 能 中 选 择 :yi+1=yi,或 者 yi+1=yi-1选 择 的 原 则 是 考 察 精 确 值 y 靠 近 yi 还 是 靠 近 yi-1(图 2.2.2),计 算 式 为 :y2=r2-(xi+1)2d1=yi2-y2=yi2-r2+
30、(xi+1)2d2=y2-(yi-1)2=r2-(xi+1)2-(yi-1)2图 2.2.2 y 的位置令 pi=d1-d2,并 代 入 d1, d2,则 有pi=2(xi+1)2+yi2+(yi-1)2-2r2 (2.2.1)pi 称 为 误 差 。如 果 pi0 则 yi+1=yi,否 则 yi+1=yi-1。pi 的 递 归 式 为 :pi+1=pi+4xi+6+2(yi2+1-yi2)-2(yi+1-yi) (2.2.2)pi 的 初 值 由 式 (2.6)代 入 xi=0, yi=r 而 得p1=3-2r (2.2.3)根 据 上 面 的 推 导 ,圆 周 生 成 算 法 思 想 为
31、 :1、求 误 差 初 值 ,p1=3-2r; i=1;画 点 (0, r);2、求 下 一 个 光 栅 位 置 :xi+1=xi+1;if pi0 则 yi+1=yi;否 则 yi+1=yi-1;3、画 点 (xi+1, yi+1)4、计 算 下 一 个 误 差 :if pi0 则 pi+1=pi+4xi+6;否 则 pi+1=pi+4(xi-yi)+10;5、i=i+1; if x=y 则 end;否 则 返 2。虽 然 式 (2.2.2)式 表 示 pi+1 的 算 法 似 乎 很 复 杂 ,但 因 为 yi+1 只 能 取 值 yi 或 yi-1,因 此 在 算 法中 ,第 4 步 的
32、 算 式 变 得 很 简 单 ,只 须 作 加 法 和 4 的 乘 法 。因 此 圆 的 Bresenham 算 法 运 行 速 度 也是 很 快 的 ,并 适 宜 于 硬 件 实 现 。圆 的 Bresenham 算 法 的 程 序 实 现 见 程 序 2.2.1。circle (xc, yc, radius, c)int xc, yc, radius, c;int x, y, p;x=0;y=radius;p=3-2*radius;while (xy)plot_circle_points(xc, yc, x, y, c);if (p0) p=p+4*x+6;elsep=p+4*(x-y)+
33、10;y-=1;x+=1;if (x= =y)plot_circle_points(xc, yc, x, y, c);plot_circle_points(xc, yc, x, y, c)int xc, yc, x, y, c;set_pixel(xc+x, yc+y, c);set_pixel(xc+x, yc+y, c);set_pixel(xc+x, yc-y, c);set_pixel(xc-x, yc-y, c);set_pixel(xc+y, yc+x, c);set_pixel(xc-y, yc+x, c);set_pixel(xc+y, yc-x, c);set_pixel(x
34、c-y, yc-x, c);程序 2.2.1 Bresenham 的圆生成算法2.3 区域填充算法 2.3.1 基础知识区 域 填 充 即 给 出 一 个 区 域 的 边 界 ,要 求 对 边 界 范 围 内 的 所 有 象 素单 元 赋 予 指 定 的 颜 色 代 码 。区 域 填 充 中 最 常 用 的 是 多 边 形 填 色 ,本 节 中 我 们 就 以 此 为 例 讨 论 区 域 填 充 算 法 。多 边 形 填 色 即 给 出 一 个 多 边 形 的 边 界 ,要 求 对 多 边 形 边 界 范 围 的所 有 象 素 单 元 赋 予 指 定 的 色 代 码 。要 完 成 这 个 任
35、务 ,一 个 首 要 的问 题 ,是 判 断 一 个 象 素 是 在 多 边 形 内 还 是 外 。数 学 上 提 供 的 方 法是 “扫 描 交 点 的 奇 偶 数 判 断 ”法 :1、将 多 边 形 画 在 纸 上 。2、用 一 根 水 平 扫 描 线 自 左 而 右 通 过 多 边 形 而 与 多 边 形 之 边 界 相交 。扫 描 线 与 边 界 相 交 奇 次 数 后 进 入 该 多 边 形 ,相 交 偶 次 数 后 走出 该 多 边 形 。图 2.3.1 示 出 这 类 情 况 :扫 描 线 与 多 边 形 相 交 四 点 。相 交 a 点 之 后 入 多 边 形 ;交 b 点 (
36、第 2 交 点 )之 后 出 多 边 形 ;交 c点 (第 3 交 点 )之 后 又 入 多 边 形 ;交 d 点 (第 4 交 点 )之 后 又 出 多 边形 。上 述 方 法 似 乎 能 完 满 地 解 决 问 题 ,但 事 实 并 非 如 此 ,因 为 直 线 在光 栅 化 后 变 成 了 占 有 单 位 空 间 的 离 散 点 。图 2.3.1 中 的 A 点 处 和B、C 处 ,在 光 栅 化 后 变 成 图 2.3.2 所 示 的 情 况 。此 时 ,使 用 上 述 判断 法 则 ,在 A、B、C 处 发 现 错 判 现 象 。在 A 处 ,扫 描 线 通 过 一 点后 以 为 入
37、 多 边 形 ,其 实 此 时 已 出 多 边 形 。结 果 是 在 A 点 之 后 的 扫描 线 段 上 全 都 错 误 地 填 上 色 。在 B 和 C 处 ,因 为 光 栅 化 后 ,使 得扫 描 线 通 过 交 点 的 个 数 发 生 变 化 而 同 样 导 致 填 色 错 误 。因 此 ,原始 的 奇 偶 判 断 方 法 需 要 加 以 周 密 地 改 善 ,才 能 成 为 计 算 机 中 实 用的 填 色 算 法 。图 2.3.1 图 2.3.2填 色 算 法 分 为 两 大 类 :1、扫 描 线 填 色 (Scan-Line Filling)算 法 。这 类 算 法 建 立 在
38、多 边 形边 边 界 的 矢 量 形 式 数 据 之 上 ,可 用 于 程 序 填 色 ,也 可 用 交 互 填 色 。2、种 子 填 色 (Seed Filling)算 法 。这 类 算 法 建 立 在 多 边 形 边 边 界 的图 象 形 式 数 据 之 上 ,并 还 需 提 供 多 边 形 界 内 一 点 的 坐 标 。所 以 ,它 一 般 只 能 用 于 人 机 交 互 填 色 ,而 难 以 用 于 程 序 填 色 。.3.2 扫描线填色算法一 、算 法 的 基 本 思 想多 边 形 以 n, x_array, y_array 形 式 给 出 ,其 中 x_array,y_array 中 存 放 着 多 边 形 的 n 个 顶 点 的 x, y 坐 标 。扫 描 线 填 色 算 法 的 基 本 思 想 是 :