第四章二维填充与多边形扫描转化
第4章 多边形的扫描转换与区域填充

4.2.2 扫描线填充算法
三、存在问题
交点的个数必须是偶数才能保证填充的正确性。 存在问题: 当扫描线与多边形的顶点相交时,会出现异常情况。 问题1:如何取舍交点,保证交点正确配对?
扫描线2 与P1相交,P1,P1,E 扫描线7 与P6相交,P6,F,G
4.2.2 扫描线填充算法
4.1 矩形填充
为了减少函数调用的次数,每条扫描线上的[xmin,xmax]区间可 以用画线函数填充,其程序如下:
4.1 矩形填充
存在问题: 如果两个矩形共享一条边:
(1)如果象素的中心落在某个矩形区域内,则它属于该区域。 (2)如果将中心落在其共享边界的像素看成是同时属于两个矩形 图元区域,那么,落在共享边界上的像素就会被重画两次。 (3)如果将中心落在其共享边界的像素看成是不属于任何区域, 那么,中心落在共享边界上的像素就会被丢失。
处理措施:
如果像素的中心落在矩形边界的左方或下方时,该像素属于矩形, 否则不属于该多边形区域,也就是说,如果象素的中心落在矩形 边界的右方或上方时,该象素不属于矩形区域。
4.2 多边形扫描转换
4.2.1 逐点判断算法
基本思想:
逐个判断绘图窗口内的像素,确定它们是否在多边形区
域内部,从而求出位于多边形区域内的像素的集合。实现 扫描转换多边形最简单方法就是逐点判断。
实际上该数据表示了一条扫描线与某条边的交点,将这些交点链接 起来,就可以直接得到要求的所有交点。在填充过程中,为每一条 扫描线建立相应的活性边表,它表示了该扫描线要求交点的那些边, 在实用中每一条边的活性边表的信息与上一条边的活性边表的信息 有继承性,再结合ET表使得建立十分方便。
4.2.2 扫描线填充算法
第四章 多边形填充

class CBucket { public: CBucket(); virtual ~CBucket(); public: int ScanLine; CAET *p; CBucket *next; }; 桶类
感知光强 实际光强
马赫带
填充多边形
多边形填充的主要算法是扫描线算法。先确定多边形 覆盖的扫描线条数,对每一条扫描线,计算扫描线与多 边形边界的交点区间,如果能判断该区间在多边形内部, 则将其内的像素绘制为指定的颜色。扫描线算法在处理 每条扫描线时,需要与多边形的所有边求交,处理效率 很低。改进的算法是有效边表算法。
}
4.2.5 算法步骤
输入:顶点数组 CPoint Point[7];//定义多边形,7个 顶点 算法 (1)根据顶点计算多边形最低点y值 (scanMin)和多边形最高点y值(scanMax); (2)建立桶表和边表; 建立桶表: i从scanMin到scanMax的循环, 将i赋给scanLine, 指针p为空,各节点相联
4.2
有效边表填充算法
4.2.1 填充原理
有效边表填充算法通过维护边表和有效边表,避开 了扫描线与多边形所有边求交的复杂运算。填充原理是 按照扫描线从小到大的移动顺序,计算当前扫描线与有 效边的交点,然后把这些交点按x值递增的顺序进行排序、 配对,以确定填充区间,最后用指定颜色填充区间内的 所有像素,即完成填充工作。有效边表填充算法已成为 目前最为有效的多边形填充算法之一。
CG04

9/73
4.3.1 逐点判断法
基本原理
判断绘图窗口内的像素是否位于多边形内,若是,则 用指定颜色绘制该像素 如何判断点在多边形的内外关系?
射线法
问题
(xmax, ymax)
累计角度法*
编码法*
P1 P2
(xmin, ymin)
10/73
4.3.1 点判断法
算法
假设判断点是否在多边形内的函数为IsInside()
如何识别多边形的凸凹性
方法1:观察多边形边的延长线是否划分顶点在两侧 方法2:向量的叉积 每条边建立一个向量,测试相邻边的叉积z坐标的正负 (1)如果叉积同号,那么是凸多边形 (2)如果叉积不同号,那么是凹多边形
(E1×E2 )z > 0 (E2×E3 )z > 0 (E3×E4 )z < 0 (E4×E5 )z > 0 (E5×E6 )z > 0 (E6×E1 )z > 0
11 7 5/4
11 12 11 12 8 7 -5 11
0^ 0^
12 0 ^
11 12 0 ^ 33/73
11 33/4 5/4
4.3.2 扫描线算法
思考问题
算法如何体现连贯性? 对凸多边形而言,算法是否可以简化?如何简化? 对三角形而言,算法如何简化?
三角形广泛应用于物体建模
30/73
4.3.2 扫描线算法
实例
(a) Y=6对应的活性边表 (b) Y=7对应的活性边表
31/73
4.3.2 扫描线算法
算法(Scan-Line Algorithm)
1、建立ET; 2、将扫描线纵坐标y的初值臵为ET中非空 元素的最小序号,如图中,y=1; 3、臵AEL为空; 4、执行下列步骤直至ET和AEL都为空. 4.1、如ET中的第y类非空,则将其中的所有 边取出并插入AEL中; 4.2、如果有新边插入AEL,则对AEL中各边排序; 4.3、对AEL中的边两两配对,(1和2为一对,3和4为一对,…), 将每对边中x坐标按规则取整,获得有效的填充区段,再填充. 4.4、将当前扫描线纵坐标 y 值递增1; 4.5、将AEL中满足y = ymax边删去(因为每条边被看作下闭上开 的); 4.6、对AEL中剩下的每一条边的x递增deltax,即x = x+deltax.
计算机图形学——多边形的扫描转换(基本光栅图形算法)

计算机图形学——多边形的扫描转换(基本光栅图形算法)⼀、多边形扫描转换在光栅图形中,区域是由【相连的】像素组成的集合,这些像素具有【相同的】属性值或者它们位于某边界线的内部1、光栅图形的⼀个基本问题是把多边形的顶点表⽰转换为点阵表⽰。
这种转换成为多边形的扫描转换。
2、多边形的扫描转换与区域填充问题是怎样在离散的像素集上表⽰⼀个连续的⼆维图形。
3、多边形有两种重要的表⽰⽅法:(1)顶点表⽰:⽤多边形的定点序列来表⽰多边形优点:直观、⼏何意义强、占内存少、易于进⾏⼏何变换缺点:没有明确指出那些象素在多边形内,故不能直接⽤于上⾊(2)点阵表⽰:是⽤位于多边形内的象素集合来刻画多边形缺点:丢失了许多⼏何信息(eg:边界、顶点等)但是【点阵表⽰是光栅显⽰系统显⽰时所需的表现形式。
】多边形的扫描转换就是把多边形的顶点表⽰转换为点阵表⽰,即从多边形的给定边界出发,求出位于其内部的各个像素,并将帧缓冲器内的各个对应元素设置相应的灰度或颜⾊。
实际上就是多边形内的区域的着⾊过程。
4、多边形分类⼆、X扫描线算法X扫描线算法填充多边形的基本思想是按扫描线顺序,计算扫描线与多边形的相交区间,再⽤要求的颜⾊显⽰这些区间的象素,即完成填充⼯作。
区间的端点可以通过计算扫描线与多边形边界线的交点获得。
如扫描线y=3与多边形的边界相交于4点(2,3)、(4,3)、(7,3)、(9,3)这四个点定义了扫描线从x=2到x=4,从x=7到x=9两个落在多边形内的区间,该区间内像素应取填充⾊。
算法的核⼼是按x递增顺序排列交点的x坐标序列。
由此可得到扫描线算法步骤如下:算法步骤:1.确定多边形所占有的最⼤扫描线数,得到多边形定点的最⼩最⼤值(y min和y max);2.从y min到ymax每次⽤⼀条扫描线进⾏填充;3.对⼀条扫描线填充的过程分为四个步骤:a)求交点;b)把所有交点按递增顺序排序;c)交点配对(第⼀个和第⼆个,第三个和第四个);d)区间填⾊。
计算机图形学5多边形扫描转换和区域填充

可编辑ppt
1
一、多边形的扫描转换
前面讲的画直线是一维图形的光栅化,就是如何在计算机 屏幕上即在一个离散的像素集上表示一个连续的图形。而多 边形的扫描转换和区域填充这个问题是怎么样在离散的像素 集上表示一个连续的二维图形。
多边形有两种重要的表示方法:顶点表示和点阵表示。
P2
当扫描线与多边形顶点相 交时,会出现异常情况。
解决方案: (1)、若共享顶点的两条 边分别落在扫描线的两边, 交点只算一个;
y
12 11 10
9 8 7 6 5 4 3 2 1
1 2 3 4 5 6 7 8 9 10 11 12 x
与多边形顶点相交的交点的处理
(2)若共享顶点的两条边在扫描线的同一边,这 时交点作为零个或两个。
凸多边形 凹多边形 含内环的多边形
有关概念
1) 区域:一组相邻而且又相连的像素,而且具有 相同属性的封闭区域。 2)种类:①单域 ②复合域
3) 区域填充:以某种属性对整个区域进行设置的过
程。
可编辑ppt
6
逐点判断填充算法
区域填充的基本(初级)方法:逐点判断填充算法
逐点判断绘图窗口内的每一个像素; 若在区域的内部:用指定的属性设置该点; 否则不予处理;
光栅图形的一个基本问题是把多边形的顶点表示转换为点阵 表示。这种转换称为多边形的扫描转换。
为什么叫扫描转换?因为光栅显示器是逐行扫描!
区域填充:指先将区域的一点赋予指定的颜色,然后将该颜 色扩展到整个区域的过程。
可编辑ppt
4
多边形分为凸多边形、凹多边形、含内环的多边 形等: (1)凸多边形 任意两顶点间的连线均在多边形内。 (2)凹多边形 任意两顶点间的连线有不在多边形内的部分。
第四章多边形的转换

数据结构与实现步骤
如何计算下一条扫描线与边的交点。
直线方程:ax+by+c = 0 当前交点坐标:(xi, yi) 下一交点坐标:(xi+1,yi+1) xi+1= ((-byi+1)-c)/a = ((-byi+1)-c)/a =xi-b/a=xi+1/mi 活动边表中需要存放的信息: x:当前扫描线与边的交点 dx=-b/a:从当前扫描线到下一条扫描线之间的x增量 ymax:边所交的最高扫描线
数据结构与实现步骤
所有的边和扫描线求交,效率很低。因为一条扫 描线往往只和少数几条边相交。 如何判断多边形的一条边与扫描线是否相交? 与当前扫描线相交的边称为活性边(active edge),把它们按与扫描线交点x坐标递增的顺 序存入一个链表中,边的活化链表 ( AEL, Active edge table)。它记录了多边形边沿扫 描线的交点序列。 只需对当前扫描线的活动边表作更新,即可得到 下一条扫描线的活动边表。
扫描线的连贯性
1)设L是偶数。 2)在该扫描线上,只有区段 (xeik,xeik+1),k=1,3,5,…,L-1位于多边形P内, 其余区段都在P外。 以上性质称为扫描线的连贯性,它是多边形 区域连贯性在一条扫描线上的反映。
边的连贯性
设d为一整数,并且d=e-1,并且 yi0≥d≥yin。设位于 扫描线y=d上的交点序列为xdj1,xdj2,xdj3,…,xdjk 现在来讨论扫描线d,e交点序列之间的关系。若多 边形P的边Pr-1Pr与扫描线y=e,y=d都相交,则交点序列 中对应元素xer,xdr满足下列关系: xer= xdr + 1/mr (1) 其中mr为边Pr-1Pr的斜率。
多边形扫描转换与区域填充技巧

Rotational method: Align each edge with the x axis
2020/11/22
多边形的扫描转换和区域填充技巧
11
多边形扫描转换
逐点判断算法 扫描线填充算法 边缘填充算法
2020/11/22
多边形的扫描转换和区域填充技巧
12
逐点判断算法
实现扫描转换多边形最简单的算法是逐 点判断,即判断一个像素是否在多边形 内部,是则填充颜色,否则放弃
ymax
2020/11/22
ymin xmin
多边形的扫描转换和区域填充技巧
xmax
6
ymax
ymin 如何完成填充
的?? xmin
xmax
如何实现算法??
ymax
填充前 填充后
2020/11/22
ymin xmin
多边形的扫描转换和区域填充技巧
xmax
7
矩形扫描转换算法
FillRect(Rect *rect, int color) { int x,y; for (y=rect->ymin;y<=rect->ymax,y++)
第5章
2020/11/22
多边形的扫描转换和区域填充技巧
提出问题
上一章讲述了如何生成点、线和圆等 基本几何构造。
本章重点如何在指定的输出设备上构 造多边形域、像素数组等高级图元
2020/11/22
多边形的扫描转换和区域填充技巧
2
主要内容 主要内容
矩形填充 内外测试 多边形扫描转换 区域填充 多边形扫描转换与区域填充的区别 反走样
2020/11/22
多边形的扫描转换和区域填充技巧
图形学CG第4章扫描转换分析

基本思想是:
首先用模板定义各种图案;然后,修改填充的扫描转换算
法,即在确定了区域内一个象素之后,不是马上往该象素填
色,而是先查询模板位图的对应位置,若对应位置有图案的
象素,即图案的对应位置为1时,填充颜色,否则,不改变
2021/6/4 该象素的值。
36
算法要求: 区域是连通的。一个封闭区域确定以后,填充要解决的 问题是如何确定填充的象素以及如何高效地填充。
2021/6/4
25
1. 区域的表示
区域表示方法:内点表示和边界表示。
内点表示:枚举出区域内部的所有象素,内部的所 有象素着同一个颜色,边界象素着与内部象素不 同的颜色。
边界表示:枚举出边界上所有的象素,边界上的所
2021/6/4
14
数据结构: 边表(Edge Table, ET): (1)按下端点的纵坐标(y)对所有边作桶分类. (2)再按与扫描线交点x坐标递增的顺序存放在一个链
表中,此链表称为有效边表。 有效边表的每个结点: x,ymax,1/k,next x:边的下端点的x坐标,ymax:边的上端点的y坐标 k:边的斜率, next:指向下一条边的指针.
2021/6/4
18
解决顶点交点计为1时的情形:
扫描线y+1 扫描线y 扫描线y-1
(a)原图
(b)缩短ymax的边 (c)缩短ymin的边
图5-28 将多边形的某些边缩短以分离那些应 计为1个交点的顶点
2021/6/4
19
2021/6/4
y
12
p1
11
10
9
p0
p6
8
7
p2
ch4多边形扫描&区域填充(3)

4向连通区域和8向连通区域
四个方向运动
八个方向运动
四连通区域
八连通区域
表示内点
表示边界点
2.3.2.1区域填充的递归算 法
内点表示的4连通区域的递归填充算法:
void FloodFill4(int x,int y,int oldcolor,int newcolor) { if(getpixel(x,y)==oldcolor) //属于区域内点 oldcolor { drawpixel(x,y,newcolor); FloodFill4(x,y+1,oldcolor,newcolor); FloodFill4(x,y-1,oldcolor,newcolor); FloodFill4(x-1,y,oldcolor,newcolor); FloodFill4(x+1,y,oldcolor,newcolor); } }
2.3.2.2区域填充的扫描线算法
算法步骤:
首先填充种子点所在扫描线上的位于给定区 域的一个区段 然后确定与这一区段相连通的上、下两条扫 描线上位于给定区域内的区段,并依次保存 下来。 反复这个过程,直到填充结束。
(1)初始化:堆栈置空。将种子点(x,y)入栈。 (2)出栈:若栈空则结束。否则取栈顶元素(x,y),以y作为 当前扫描线。 (3)填充并确定种子点所在区段:从种子点(x,y)出发,沿 当前扫描线向左、右两个方向填充,直到边界。分别标记区 段的左、右端点坐标为xl和xr。 (4)并确定新的种子点:在区间[xl,xr]中检查与当前扫描线y 上、下相邻的两条扫描线上的象素。若存在非边界、未填充 的象素,则把每一区间的最右象素作为种子点压入堆栈,返 回第(2)步。 上述算法对于每一个待填充区段,只需压栈一次;因此, 扫描线填充算法提高了区域填充的效率。
第4章多边形填充算法

E2
E5
E3 E4
边缘填充算法示意图
1.边缘填充算法(正负相消法) 基本原理是:对每一条扫描线,依次求与多边形各边 的交点,将该扫描线上交点右边的所有像素求补。多 边形所有边处理完毕,填充即完成。
优点:简单易行 缺点:多边形外的像素处 理过多,输入输出量大
算法改进
• ቤተ መጻሕፍቲ ባይዱ围盒 • 栅栏
带包围盒的多边形
第4章 多边形填充算法
4.3 边缘填充算法
4.3.1 填充原理
• 求出多边形的每条边与扫描线的交点 • 将交点右侧的所有像素颜色全部取为补
色。 • 按任意顺序处理完多边形的所有边。
4.3.2 填充过程
假定边的访问顺序为E0、E1、E2、E3、E4、E5和E6。
P1(x1,y1)
E1
E0
E6
P0(x0,y0)
缺点:某些像素被重复取补
3.边标志填充算法
基本思想:先用一种特殊的颜色在帧缓存中将多边形 的边界(水平边除外)勾画出来,然后将着色的像素点依x 坐标递增的顺序两两配对,再将每一对像素所构成的扫描线 区间内的所有像素置为填充色。
3.边标志填充算法
①打标记:对多边形边界所在像素置一个特殊标志。按照 “下闭上开”的原则处理局部最低点为两个交点,局部 最高点为0个交点。
② 填充:对于每条与多边形相交的扫描线,依照“左闭 右开”的原则从左至右逐个访问该扫描线上的像素,并 着色。
3.边标志填充算法
栅栏填充算法
栅栏:一条过多边形顶点且与扫描线垂直的直线,它将 多边形分成两半,只要将栅栏与多边形之间的像素求补 即可。
缺点:某些像素被重复取补
栅栏填充算法
基本原理:对于每条扫描线与多边形的交点,将交点与栅栏 之间的扫描线上的像素取补,也就是说,若交点位于栅 栏左边,则将交点之右、栅栏之左的所有像素取补;若 交点位于栅栏右边,则将栅栏之右、交点之左的所有像 素取补。
多边形的扫描转换和区域填充技巧

如何进行多 边形填充?
2020/1/21
20/82
Scan-Line Polygon-Filling
Determine the intersection positions of the region boundaries with the scan lines
Apply fill colors to each section of a scan line that lies inside the fill region (odd-even rule)
2020/1/21
ห้องสมุดไป่ตู้
提出问题
上一章讲述了如何生成点、线和圆等 基本几何构造。
本章重点如何在指定的输出设备上构 造多边形域、像素数组等高级图元
2020/1/21
2/82
主要内容 主要内容
矩形填充 内外测试 多边形扫描转换 区域填充 多边形扫描转换与区域填充的区别 反走样
ymax
2020/1/21
ymin xmin
xmax
6/82
2020/1/21
ymax
ymin 如何完成填充
的?? xmin
xmax
如何实现算法??
ymax
填充前 填充后
ymin xmin
xmax
7/82
矩形扫描转换算法
FillRect(Rect *rect, int color) { int x,y; for (y=rect->ymin;y<=rect->ymax,y++)
2020/1/21
26/82
填充步骤
(1)求交点 (2)交点排序
如何 高(3)效交点率配对 求交(4点)区?间填色
多边形的扫描转换与区域填充

多边形的扫描转换与区域填充在计算机图形学中,多边形有两种重要的表示方法:顶点表示和点阵表示。
顶点表示是用多边形的顶点序列来表示多边形。
这种表示直观、几何意义强、占内存少,易于进行几何变换,但由于它没有明确指出哪些象素在多边形内,故不能直接用于面着色;点阵表示是用位于多边形内的象素集合来刻画多边形。
这种表示丢失了许多几何信息,但便于帧缓冲器表示图形,是面着色所需要的图形表示形式。
光栅图形的一个基本问题是把多边形的顶点表示转换为点阵表示,这种转换称为多边形的扫描转换。
区域填充则是指先将在点阵表示的多边形区域内的一点(称为种子点)赋予指定的颜色和灰度,然后将这种颜色和灰度扩展到整个区域内的过程。
多边形的扫描转换多边形扫描转换算法对多边形的形状没有限制,但多边形的边界必须时封闭的,且不自交。
我们可以将多边形分为三种:凸多边形、凹多边形、含内环的多边形。
所谓凸多边形是指任意两顶点间的连线均在多边形内;凹多边形是指任意两顶点间的连线有不在多边形内的部分;而含内环的多边形则是指多边形内再套有多边形,多边形内的多边形也叫内环,内环之间不能相交。
多边形的扫描转换与区域填充扫描线算法:扫描线算法是按扫描线顺序,计算扫描线与多边形的相交区间,再用要求的颜色显示这些区间的象素,完成转换工作。
区间的端点可以通过计算扫描线与多边形边界线的交点获得。
对于一条扫描线,多边形的扫描转换过程可以分为四个步骤:(1)求交:计算扫描线与多边形各边的交点;(2)排序:把所有交点按x值递增顺序排序;(3)配对:第一个与第二个,第三个与第四个等等;每对交点代表扫描线与多边形的一个相交区间,(4)着色:把相交区间内的象素置成多边形颜色,把相交区间外的象素置成背景色。
图2.3.2 一个多边形与若干扫描线为了提高效率,在处理一条扫描线时,仅对与它相交的多边形的边进行求交运算。
我们把与当前扫描线相交的边称为活性边,并把它们按与扫描线交点x坐标递增的顺序存放在一个链表中,称此链表为活性边表(AET)。
第四讲二维图形填充

区域填充 有序边表算法 边填充算法 边标志算法 种子填充算法 圆域的填充 线宽与线型的处理 直线线宽的处理(笔型:线、方形) 圆弧线宽的处理(笔型:线、方形) 线型的处理
内容摘要
字符 矢量字符 点阵字符 字型技术 字符裁剪 反走样基础 提高分辩率 简单的区域反走样算法 卷积积分与反走样算法 半色调技术
直线线宽的处理 线刷子原理
为用正方形刷子绘制的具有宽度的线条。用方形刷子所得的线条比用线刷子所绘制的线条要粗一些。与线刷子类似,用方刷子绘制的线条始末端也是水平或垂直的,且线宽与线条方向有关。与线刷子的情形相反,对于水平线与垂直线,线宽最小,而对于斜率为1的线条,线宽最大,为垂直(水平)的2 倍。实现正方形刷子最简单的办法是,把方形中心对准单象素宽的线条上各个象素,并把方形内的象素全部置成线条颜色。这种简单方法将会重复地写象素。这是因为对应于相邻象素的方形一般会重迭。为了避免重复写象素,可以采用与活性边表类似的技术。
如左图
活性边与活性边表处理方法
一个多边形与若干扫描线。
为了计算每条扫描线与多边形各边的交点,最简单的方法是把多边形的所有边放在一个表中。在处理每条扫描线时,按顺序从表中取出所有的边,分别与扫描线求交点。这样处理效率很低。这是因为一条扫描线往往只与少数几条边相交,甚至与整个多边形都不相交。若在处理每条扫描线时,不分青红皂白地把所有边都拿来与扫描线求交点,则其中绝大多数都是徒劳无用的。如果采用活性边表,则可减少许多计算。 扫描线依次变化为1,2,3,4,5,6,7,8,…... x是边与当前扫描线的交点; x是该边从当前扫描线到下一扫描线之间x增量; ymax是边所交的最高扫描线号。 在上述的交点x坐标更新和新边插入之前,必须把那些与当前扫描线相交,而与下一条扫描线不再相交的边,从活性边表(AET)中删除出去。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
着色的平面 多边形
线框多边形物体
填充多边形物体
5.1多边形的扫描转换
5.1.1概念 多边形分为凸多边形、凹多边形、含内
环的多边形。
• 多边形的表示方法 –顶点表示
–点阵表示
• 顶点表示:用多边形顶点的序列来刻划多 边形。 优点:直观、几何意义强、占内存少; 缺点:难以判断哪些像素位于多边形内部, 不能直接用于面着色。
y=yik y=yik+1
算法步骤:
(1)确定多边形所占有的最大扫描线数。即得 到多边形顶点的最小和最大y值。(Ymin和 Ymax)
(2)从y=ymin到y=ymax:每次用一条扫描线填充。 (3)填充步骤: • 求交:计算扫描线与多边形各边的交点。 • 排序:所有交点按递增的顺序排序。 • 交点配对:第一个与第二个,第三个与第四
•假定非水平边与扫描线y=e 相交,交点的横坐标为x, 规则如下
●规则1: X为小数,即交点落于扫描线上两个相邻 像素之间 (a)交点位于左边之上,向右取整 (b)交点位于右边之上,向左取整
●规则2:
边界上象素的取舍问题,避免填充扩大 化。
●解决方法:
边界象素:规定落在右上边界的象素 不予填充。
P3 P4 6 3 -2
AET指针 扫描线2
P3 P4 4 3 -2
AET指针 扫描线3
P4 P5 260
(x, ymax,Δx, next)
P3 P2 6 5 0.5 ^
P3 P2 6.5 5 0.5 ^
P3 P2 7 5 0.5 ^
活动边表的例子
AET指针 扫描线4
AET指针 扫描线5
AET指针 扫描线6
第五章 多边形的扫描转换 与区域填充
教学内容: 1、多边形扫描转换:
通过确定穿越区域的扫描线的覆 盖去件来填充。 2、区域填充:
是从给定的位置开始涂描直到指 定的边界条件为止。
• 关于光栅图形
– 本质:点阵表示 – 特点:面着色,画面明暗自然、色彩丰富 – 与线框图相比:更加生动、直观、真实感强
线框平面多 边形
二、改进的有效边表算法(Y-连贯性算法)
(1)有效边(Active Edge):与该扫描线 相关的多边形的边。
Pi+1 Pi
边的相关性: 扫描线Yi+1 若pi(xi,yi),则有 扫描线Yi pi+1(xi+1,yi+1),其中
xi+1=xi+1/k,yi+1=yi+1
两边的相关性为每条边建立一个边记录, 其结点内容为:
在ET表中:
•与X轴平行的边不计入 •顶点:如前法则相同。
(3)有效边表(活动边表):AET(Active Edge Table)
将有效边按与扫描线交点x坐标递增的顺序 存放在一个链表中,称此链表为AET。
结点内容为:
X
ymax 1/k
next
其中x为当前扫描线与边的交点
活动边表的例子
AET指针 扫描线1
P4 P5 26 0
P4 P5 260
P5 P1 274
P3 P2 7.5 5 0.5 ^
P2 P1 8 7 -1 ^
P2 P1 8 7 -1 ^
(4)算法实现步骤
这样,当建立了边的分类表ET后,扫描线算法可 按下列步骤进行: (1)取扫描线纵坐标y的初始值为ET中非空 元素的最小序号。 (2)将边的活化链表AEL设置为空。 (3)按从下到上的顺序对纵坐标值为y的扫 描线(当前扫描线)执行下列步骤,直到边的 分类表ET和边的活化链表都变成空为止。
具体实现时,只要对扫描线与多边形的 相交区间左闭右开
●规则3:
扫描线与多边形的顶点相交时,交点的取舍, 保证交点正确配对。
●解决方法:
检查两相邻边在扫描线的哪一侧。
只要检查顶点的两条边的另外两个端点的 Y值,两个Y值中大于交法 基本思想:按扫描线顺序,计算扫描线与 多边形的相交区间(像素),再用相应的 颜色(或图案)显示这些像素。
–两种方法:扫描线算法;边界标 志法。
多边形的顶 点表示
多边形的点 阵表示
5.1.2 扫描线算法
• 扫描线算法 –目标:利用相邻像素之间的连贯性, 提高算法效率 –处理对象:非自交多边形 (边与边 之间除了顶点外无其它交点)
–交点的取整规则 •要求:使生成的像素全部位于多边 形之内 –用于线画图元扫描转换的四舍五 入原则导致部分像素位于多边形 之外,从而不可用
C)将边的活化链表AEL中满足y=ymax的边删去。 D)将边的活化链表AEL剩下的每一条边的x域累
X|ymin
ymax 1/k
next
(2)边表(ET:Edge Table):是一个包含 多边形全部边记录的表。
边表
^
P5 P1
274 ^
P2 P1 8 7 -1 ^
^
P4 P5
26 0 ^
^
P3 P4
P3 P2
6 3 -2
6 5 0.5 ^
•纵向链表的构造:长度为最大扫描线数。 •将相关边(该扫描线)的记录接点链入。 •一个结点(纵向链)有多个相关边时,按x|ymin 由小到大的顺序;如果x|ymin相等,则按1/k由 小到大的顺序。
A)如边分类表ET中的第y类元素非空,则将属 于该类的所有边从ET中取出并插入边的活化 链表中,AEL中的各边按照x值(当x值相等时, 按Δx值)递增方向排序。
B)若相对于当前扫描线,边的活化链表AEL非 空,则将AEL中的边两两依次配对,即1,2边 为一对,3,4边为一对,依次类推。每一对 边与当前扫描线的交点所构成的区段位于多 边形内,依次对这些区段上的点(象素)按 多边形属性着色。
个等,每对交点代表扫描线与多边行的一个 相交区间。 • 区间填色:把这些相交区间内的像素置成不 同于背景的填充色。
存在的问题:
当扫描线与多边形顶点相交时,交点 的取舍问题.
解决的方法:
• 共享顶点的两条边分别落在扫描线 的两边,则交点只算一个.
• 共享顶点的两条边在扫描线的一侧, 则交点算0或者2个.
点阵表示:用位于多边形内的象素的集 合来刻划多边形。
缺点:失去了许多重要的几何信息;
优点:便于运用帧缓冲存储器表示图形, 易于面着色。
–多边形的扫描转换:
把多边形的顶点表示转换为点 阵表示,也就是从多边形的给定 边界出发,求出位于其内部的各 个象素,并给帧缓冲器内的各个 对应元素设置相应的灰度和颜色, 通常称这种转换为多边形的扫描 转换。