线填充种子填充线宽和线型
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
着色;广泛应用于各种几何造型系统; 点阵表示:用位于多边形内的象素的集合来刻划多边形 特点:失去了许多重要的几何信息(边界、顶点等);
易于面着色;光栅显示系统显示时所需的表示形式;
光栅系统中两种基本的区域填充算法
针对采用顶点表示的多边形 通过确定横越区域的扫描线的覆盖间隔来填充
的多边形扫描转换区域填充算法,主要填充简单多 边形、圆、椭圆以及其它简单的曲线。
(2)八向连通方法:指的是区域内每一个像 素,可以通过左、右、上、下、左上、右上、 左下、右下这八个方向的移动的组合来到达。
种子填充算法(四向算法):允许从四个方
向寻找下一象素,栈结构实现。 算法:种子象素入栈(先进后出),当栈非空时,
重复执行: 栈顶象素出栈; 将出栈象素置成多边形色;
扫描线填充算法小结
扫描线填充算法实质,基本概念,具体实现:
区域填充的过程(2W)、扫描线填充的基本过程,两个 问题、两个连贯性、有序边(表)、活化边(表)、边 的结构、判断顺序。
二、种子填充算法
多边形表示方法
顶点表示 点阵表示
顶点表示:用多边形顶点的序列来刻划多边形 特点:直观、几何意义强、占内存少;不能直接用于面
0^
e5
10 7 -5/3
e3
11 12 0 ∧
e4
11 7 5/4 ∧
10 2 0 ∧
e6 e0
4 5 -1
e2
5 7 5/4 ∧
活化边表
Y=5
e6
10 2 0
e3
11 12 0 ∧
Y=6
e6
10 2 0
e3
11 12 0 ∧
活化边表的建立 有序边表
8^ 7^ 6^ 5^ 4^ 3^ 2^ 1^ 0^
3.4 区域填充算法 3.5 线宽与线型的处理
1、理解掌握面域填充的概念,区域多边形的 分类,面域填充的步骤;
2、理解扫描线填充算法的实质,掌握扫描线填 充算法的过程;
3、了解种子填充算法和图案填充算法。
4、掌握线宽的处理以及线型的分类。
一、扫描线填充算法
1、扫描线填充算法的实质
区域是指相互连通的一组像素的集合。
Y=6
10
Y=7
10
11
e5
10 7 -5/3
e3
11 12 0 ∧
e4
11 7 5/4 ∧
10 2 0 ∧
e6 e0
4 5 -1
e2
5 7 5/4 ∧
活化边表
e6
e3
20
11 12 0 ∧
e6
e5
e4
20
e3
10 7 -5/3
11 7 5/4
12 0 ∧
Y=1
e0
4
Y=2
5
-1
e0
4 4 -1
Y=3
注意: 1 边的分类; 2 边的排序(如果x坐标相 等,则按Δx排序); 3 边的结构;
8^
7
6
^ ^
5^
4
扫描 3
^ ^
线号 2 ^
1^
0^
e5
10 7 -5/3
e3
11 12 0 ∧
10 2 0 ∧
e6 e0
4 5 -1
e4
11 7 5/4 ∧
e2
5 7 5/4 ∧
活化边表的建立 通过有序边,利用边的连贯性建立活化
1^
0^
e5
10 7 -5/3
e3
11 12 0 ∧
e4
11 7 5/4 ∧
10 2 0 ∧
e6 e0
4 5 -1
e2
5 7 5/4 ∧
活化边表
Y=4
10
Y=5
10
e6
20
e6
20
e2
5 43/4 5/4 ∧
e3
11 12 0 ∧
活化边表的建立 有序边表
8^ 7^ 6^ 5^ 4^ 3^ 2^
1^
d)将当前扫描线的纵坐标值y累加1,即y:=y+1。y的增加 e)若相对于当前扫描线,活化边表AEL非空,则将AEL中的
边两两依次配对,即1,2边为一对,3,4边为一对,依 次类推。每一对边与当前扫描线的交点所构成的区段位 于多边形内,依次对这些区段上的点(象素)按多边形 属性着色。象素填充
Polygonfill(polydef,color)
a)如有序边表ET中的第y类元素非空,则将属于该类的所 有边从ET中取出并插入第y类扫描线的活化边表中,AEL 中的各边按照x值(当x值相等时,按Δx值)递增方向 排序。边的增加和排序
b)将活化边表AEL中满足y=ymax的边删去。边的删除
c)将活化边表AEL剩下的每一条边的x域累加Δx,即 x:=x+Δx。x的增加
扫描线填充步骤
(1) 求交点,即计算扫描线与多 边形各边的交点。
(2) 排序,由于交点不一定由左 到右求出,因此将求出的交 点按 x 坐标值排序。
(3) 交点配对,1与2,3… …, 每对表示一个区间。
9
8
7
6
12
3
4
5
4
3
2
1
0 0 1 2 3 4 5 6 7 8 9 10 11
(4) 区间填充
算出交点;划分区间;分配颜色。
问题一:扫描线与顶点相交时,交点个数的取舍?
0次 0次
9
8
交点的取舍: 比较交点与两边上其余
7 6
两顶点y值大小,确定交点个数取0、1、 5
2。
4
3
2
如果大于交点y值个数为2,则交点取 1
两次,该点填充。
0 0 1 2 3 4 5 6 7 8 9 10 11
1次
2次
通常是由一个封闭的轮廓来定义,处于一个封 闭轮廓线内的所有像素点即构成了一个区域。
例如:矩形、圆、椭圆、多边形等等。
区域---多边形
(凸、凹)、圆、 椭圆、带孔的。
区域填充---如何用一种颜色或图案
填充二维区域。
区域填充分两步:
确定需要填充那些像素
确定需要那些颜色值(图案)
9 8 7 6 5 4 3 2 1 0
——扫描线填充算法 针对采用点阵表示的多边形
从给定的位置开始图描着色直到达制定的边界 条件为止的区域填充算法,主要具有复杂情况的边 界情况。——种子填充算法
1、简单种子填充算法
基本原理:从多边形区域内部的一点出发找到区
域内的所有像素,常用于交互式绘图。
4
3
2
S1
1
0 012345
基本思路:程序开始,先检测该点的颜色,如果
e4
11 7 5/4 ∧
10 2 0 ∧
e6 e0
4 5 -1
e2
5 7 5/4 ∧
活化边表
Y=3
e0
4 3 -1
Y=4
e6
10 2 0
e2
5 38/4 5/4 ∧
ee2 0
45 432/4 5-/14 ∧
e2
5 43/4 5/4 ∧
活化边表的建立 有序边表
8^ 7^ 6^ 5^ 4^ 3^ 2^
e0
4 3 -1
Y=4
e6
10 2 0
Y=5
e6
10 2 0
Y=6
e6
10
Y=7
10
20
e6
20
e3
11 12 0 ∧
e2
5
7 e25/4 ∧
5 33/4 5/4 ∧
e2
5 38/4 5/4 ∧
e2
5 43/4 5/4 ∧
e3
11 12 0 ∧
e3
11 12 0 ∧
e5
10 7 -5/3
活化边表
e4
如果大于交点y值个数为0,则交点取零次,该点不填充。
如果大于交点y值个数为1,则交点取一次。
问题二:多边形边界象素的取舍?
长方形面积S=(4-1)*(3-1)=6 按照扫描线填充算法填充后
为什么扩大化?
3 2 1
0 1234
S1=4*3=12
图形对象是用有限多个离散的像素表示, 图形有大小、面积,但是点只有位置, 而像素不仅有位置,还有大小。对于边 界象素全部填充造成扩大化。
边结构
x D x LINK
上端点 当前扫描线 扫描线 y坐标 与边的交点 间x增量
原理:建立在图形的空间连贯性(边的连贯性)和扫描线的连贯性基
础上,计算图形封闭区域边界与扫描线交点,将扫描线分成区间,并对 区间进行填充。
算法:活化边表法 --
通过 单向链接表 的操作得
到扫描线与边的交点。
有序边表的建立
11 7 5/4
算法具体实现步骤
一、建立扫描线的有序边表(ET) 二、根据有序边表建立活化边表(AEL)
(1)取扫描线纵坐标y的初始值为ET中非空元素的最小序号。
(2)将扫描线的活化边表AEL设置为空。
(3)按从下到上的顺序对纵坐标值为y的扫描线(当前扫描 线)执行下列步骤,直到有序边表ET和活化边表AEL都 变成空为止。
5
0^
Y=1
e0 活化边表
4 5 -1
5
Y=2
e0
e4
7 5/4 ∧
e2
7 5/4 ∧
e2
7 5/4 ∧
e2
Y=3
4 4 -1
e0
4 3 -1
5 33/4 5/4 ∧
e2
5 38/4 5/4 ∧
活化边表的建立 有序边表
8^ 7^ 6^ 5^ 4^ 3^ 2^
1^
0^
e5
10 7 -5/3
e3
11 12 0 ∧
边表。它记录了多边形边沿扫描线的交点序 列。
注意: 1 边的删除(将满足 ymax=y的边删除); 2 边的增加; 3 边的排序; 4 X值的累加; 5 边的结构;
活化边表的建立 有序边表
8^
e5
7^
10 7 -5/3
11
6^
e3
5^
11 12 0 ∧
4^ 3^
2^
10 2 0 ∧
e6 e0
1^
4 5 -1
如何刻画多边形的边
一、边的分类
有序边—在当前扫描线第一次出现的边。
有序边表ET(Edge Table)—按有序边与扫描线交点x坐 标递增的顺序存放在一个链表中。仅对非水平边分析,对 应于一条扫描线。
活化边(活性边)—与当前扫描线相交的多边形的边。
活化边表(活性边表)AEL(Active Edge List)—按活化 边与扫描线交点x坐标递增的顺序存放在一个链表中。对 应于一条扫描线。
“左闭右开”、“下闭上开”
3 2 1 0 1234
S2=3*2=6
2、扫描线填充算法具体实现
两个连贯性
扫描线的连贯性
当前扫描线与各边的交点顺序,与 下一条扫描线与各边的交点顺序很 可能相同或类似。
边的连贯性
9 8 7 6 5 4 3 2 1 0
0 1 2 3 4 5 6 7 8 9 10 11
xer= xdr + 1/kr yer= ydr + 1 kr为边的斜率 减少求扫描线和多边形各边的交点的计算量
按上、下、左、右的顺序检查与出栈象素相邻 的四个象素,若其中某个象素不在边界上且未 置成多边形色,则把该象素入栈。
可用于填充带内孔的平面区域。
• 例 : 多 边 形 由 P0P1P2P3P4 构 成 , P0(1,5)P1(5,5)P2(7,3)P3(7,1)P4(1,1)
• 设种子点为(3,3),搜索的方向是上、 下、左、右。依此类推,最后像素被选 中并填充的次序如图中箭头所示 (画图)
0 1 2 3 4 5 6 7 8 9 10 11
逐点判断法
逐个判断绘图窗口内的像素:
逐点判断的算法虽然程序简单,但不可取。原 因是速度太慢,主要是由于该算法割断了各象 素之间的联系,孤立地考察各象素与多边形的 内外关系,使得几十万甚至几百万个象素都要 一一判别,每次判别又要多次求交点,需要做 大量的乘除运算,花费很多时间。
缺点: (1) 有些象素会入栈多次,降低算法效率;
栈结构占空间。
(2) 递归执行,算法简单,但效率不高, 区域内每一象素都引起一次递归,进/出 栈,费时费内存。
改进算法,减少递归次数。 解决方法是用扫描线种子填充算法;
2、扫描线种子填充算法
–目标:减少递归层次 –适用于边界表示的4连通区域 算法思想:在任意不间断区间中只取一个种 子像素(不间断区间指在一条扫描线上一组 相邻像素),填充当前扫描线上的该段区间; 然后确定与这一区段相邻的上下两条扫描线 上位于区域内的区段,并依次把它们保存起 来,反复进行这个过程,直到所保存的个区 段都填充完毕。
二、边的结构
• 边的结构有四个域组成(除指针外顺序可以相互交换): • ymax 边的上端点的y坐标(y的最大值); • x 在ET中表示边的下端点的x坐标,在AEL中则表示边与扫 描线的交点的x坐标; • Δx 边的斜率的倒数(到下一条扫描线x的增量); • next 指向下一条边的指针。
y max
遍历AET表,把配对交点之间的区间(左闭右开)上的各象素(x,y),用
drawpixel(x,y,color)改写象素颜色值;
遍历AET表,把ymax=i的结点从AET表中删除,并把 ymin>I结点的x值递增dx;
若允许多边形的边自相交,则用冒泡排序法对AET表重新排序;
}
}/*Polygonfill*/
它与边界色和填充色均不相同,就用填充色填充该点, 然后检测相邻位置,以确定它们是否是边界色和填充 色,若不是,就填充该相邻点。这个过程延续到已经 检测完区域边界范围内的所有像素为止。
4
3
2
S1
1
0 012345
从当前点检测相邻像素有两种方法:
(1)四向连通方法:指的是从区域上一点出 发,可通过四个方向,即上、下、左、右移 动和组合,在不越出区域的前提下,到达区 域内的任意像素;
Int color; 多边形定义,polydef;
算法伪程序
{
for(各条扫描线I)
{
wenku.baidu.com
初始化新边表表头指针NET[i];
把 ymin=I的边放进表NET[i];
}
y=最低扫描线号;
初始化活化边表AET为空;
for(各条扫描线i)
{
把新边表NET[i]中的边结点用插入排序法插入AET表,使之按x坐标递增顺序排列;
易于面着色;光栅显示系统显示时所需的表示形式;
光栅系统中两种基本的区域填充算法
针对采用顶点表示的多边形 通过确定横越区域的扫描线的覆盖间隔来填充
的多边形扫描转换区域填充算法,主要填充简单多 边形、圆、椭圆以及其它简单的曲线。
(2)八向连通方法:指的是区域内每一个像 素,可以通过左、右、上、下、左上、右上、 左下、右下这八个方向的移动的组合来到达。
种子填充算法(四向算法):允许从四个方
向寻找下一象素,栈结构实现。 算法:种子象素入栈(先进后出),当栈非空时,
重复执行: 栈顶象素出栈; 将出栈象素置成多边形色;
扫描线填充算法小结
扫描线填充算法实质,基本概念,具体实现:
区域填充的过程(2W)、扫描线填充的基本过程,两个 问题、两个连贯性、有序边(表)、活化边(表)、边 的结构、判断顺序。
二、种子填充算法
多边形表示方法
顶点表示 点阵表示
顶点表示:用多边形顶点的序列来刻划多边形 特点:直观、几何意义强、占内存少;不能直接用于面
0^
e5
10 7 -5/3
e3
11 12 0 ∧
e4
11 7 5/4 ∧
10 2 0 ∧
e6 e0
4 5 -1
e2
5 7 5/4 ∧
活化边表
Y=5
e6
10 2 0
e3
11 12 0 ∧
Y=6
e6
10 2 0
e3
11 12 0 ∧
活化边表的建立 有序边表
8^ 7^ 6^ 5^ 4^ 3^ 2^ 1^ 0^
3.4 区域填充算法 3.5 线宽与线型的处理
1、理解掌握面域填充的概念,区域多边形的 分类,面域填充的步骤;
2、理解扫描线填充算法的实质,掌握扫描线填 充算法的过程;
3、了解种子填充算法和图案填充算法。
4、掌握线宽的处理以及线型的分类。
一、扫描线填充算法
1、扫描线填充算法的实质
区域是指相互连通的一组像素的集合。
Y=6
10
Y=7
10
11
e5
10 7 -5/3
e3
11 12 0 ∧
e4
11 7 5/4 ∧
10 2 0 ∧
e6 e0
4 5 -1
e2
5 7 5/4 ∧
活化边表
e6
e3
20
11 12 0 ∧
e6
e5
e4
20
e3
10 7 -5/3
11 7 5/4
12 0 ∧
Y=1
e0
4
Y=2
5
-1
e0
4 4 -1
Y=3
注意: 1 边的分类; 2 边的排序(如果x坐标相 等,则按Δx排序); 3 边的结构;
8^
7
6
^ ^
5^
4
扫描 3
^ ^
线号 2 ^
1^
0^
e5
10 7 -5/3
e3
11 12 0 ∧
10 2 0 ∧
e6 e0
4 5 -1
e4
11 7 5/4 ∧
e2
5 7 5/4 ∧
活化边表的建立 通过有序边,利用边的连贯性建立活化
1^
0^
e5
10 7 -5/3
e3
11 12 0 ∧
e4
11 7 5/4 ∧
10 2 0 ∧
e6 e0
4 5 -1
e2
5 7 5/4 ∧
活化边表
Y=4
10
Y=5
10
e6
20
e6
20
e2
5 43/4 5/4 ∧
e3
11 12 0 ∧
活化边表的建立 有序边表
8^ 7^ 6^ 5^ 4^ 3^ 2^
1^
d)将当前扫描线的纵坐标值y累加1,即y:=y+1。y的增加 e)若相对于当前扫描线,活化边表AEL非空,则将AEL中的
边两两依次配对,即1,2边为一对,3,4边为一对,依 次类推。每一对边与当前扫描线的交点所构成的区段位 于多边形内,依次对这些区段上的点(象素)按多边形 属性着色。象素填充
Polygonfill(polydef,color)
a)如有序边表ET中的第y类元素非空,则将属于该类的所 有边从ET中取出并插入第y类扫描线的活化边表中,AEL 中的各边按照x值(当x值相等时,按Δx值)递增方向 排序。边的增加和排序
b)将活化边表AEL中满足y=ymax的边删去。边的删除
c)将活化边表AEL剩下的每一条边的x域累加Δx,即 x:=x+Δx。x的增加
扫描线填充步骤
(1) 求交点,即计算扫描线与多 边形各边的交点。
(2) 排序,由于交点不一定由左 到右求出,因此将求出的交 点按 x 坐标值排序。
(3) 交点配对,1与2,3… …, 每对表示一个区间。
9
8
7
6
12
3
4
5
4
3
2
1
0 0 1 2 3 4 5 6 7 8 9 10 11
(4) 区间填充
算出交点;划分区间;分配颜色。
问题一:扫描线与顶点相交时,交点个数的取舍?
0次 0次
9
8
交点的取舍: 比较交点与两边上其余
7 6
两顶点y值大小,确定交点个数取0、1、 5
2。
4
3
2
如果大于交点y值个数为2,则交点取 1
两次,该点填充。
0 0 1 2 3 4 5 6 7 8 9 10 11
1次
2次
通常是由一个封闭的轮廓来定义,处于一个封 闭轮廓线内的所有像素点即构成了一个区域。
例如:矩形、圆、椭圆、多边形等等。
区域---多边形
(凸、凹)、圆、 椭圆、带孔的。
区域填充---如何用一种颜色或图案
填充二维区域。
区域填充分两步:
确定需要填充那些像素
确定需要那些颜色值(图案)
9 8 7 6 5 4 3 2 1 0
——扫描线填充算法 针对采用点阵表示的多边形
从给定的位置开始图描着色直到达制定的边界 条件为止的区域填充算法,主要具有复杂情况的边 界情况。——种子填充算法
1、简单种子填充算法
基本原理:从多边形区域内部的一点出发找到区
域内的所有像素,常用于交互式绘图。
4
3
2
S1
1
0 012345
基本思路:程序开始,先检测该点的颜色,如果
e4
11 7 5/4 ∧
10 2 0 ∧
e6 e0
4 5 -1
e2
5 7 5/4 ∧
活化边表
Y=3
e0
4 3 -1
Y=4
e6
10 2 0
e2
5 38/4 5/4 ∧
ee2 0
45 432/4 5-/14 ∧
e2
5 43/4 5/4 ∧
活化边表的建立 有序边表
8^ 7^ 6^ 5^ 4^ 3^ 2^
e0
4 3 -1
Y=4
e6
10 2 0
Y=5
e6
10 2 0
Y=6
e6
10
Y=7
10
20
e6
20
e3
11 12 0 ∧
e2
5
7 e25/4 ∧
5 33/4 5/4 ∧
e2
5 38/4 5/4 ∧
e2
5 43/4 5/4 ∧
e3
11 12 0 ∧
e3
11 12 0 ∧
e5
10 7 -5/3
活化边表
e4
如果大于交点y值个数为0,则交点取零次,该点不填充。
如果大于交点y值个数为1,则交点取一次。
问题二:多边形边界象素的取舍?
长方形面积S=(4-1)*(3-1)=6 按照扫描线填充算法填充后
为什么扩大化?
3 2 1
0 1234
S1=4*3=12
图形对象是用有限多个离散的像素表示, 图形有大小、面积,但是点只有位置, 而像素不仅有位置,还有大小。对于边 界象素全部填充造成扩大化。
边结构
x D x LINK
上端点 当前扫描线 扫描线 y坐标 与边的交点 间x增量
原理:建立在图形的空间连贯性(边的连贯性)和扫描线的连贯性基
础上,计算图形封闭区域边界与扫描线交点,将扫描线分成区间,并对 区间进行填充。
算法:活化边表法 --
通过 单向链接表 的操作得
到扫描线与边的交点。
有序边表的建立
11 7 5/4
算法具体实现步骤
一、建立扫描线的有序边表(ET) 二、根据有序边表建立活化边表(AEL)
(1)取扫描线纵坐标y的初始值为ET中非空元素的最小序号。
(2)将扫描线的活化边表AEL设置为空。
(3)按从下到上的顺序对纵坐标值为y的扫描线(当前扫描 线)执行下列步骤,直到有序边表ET和活化边表AEL都 变成空为止。
5
0^
Y=1
e0 活化边表
4 5 -1
5
Y=2
e0
e4
7 5/4 ∧
e2
7 5/4 ∧
e2
7 5/4 ∧
e2
Y=3
4 4 -1
e0
4 3 -1
5 33/4 5/4 ∧
e2
5 38/4 5/4 ∧
活化边表的建立 有序边表
8^ 7^ 6^ 5^ 4^ 3^ 2^
1^
0^
e5
10 7 -5/3
e3
11 12 0 ∧
边表。它记录了多边形边沿扫描线的交点序 列。
注意: 1 边的删除(将满足 ymax=y的边删除); 2 边的增加; 3 边的排序; 4 X值的累加; 5 边的结构;
活化边表的建立 有序边表
8^
e5
7^
10 7 -5/3
11
6^
e3
5^
11 12 0 ∧
4^ 3^
2^
10 2 0 ∧
e6 e0
1^
4 5 -1
如何刻画多边形的边
一、边的分类
有序边—在当前扫描线第一次出现的边。
有序边表ET(Edge Table)—按有序边与扫描线交点x坐 标递增的顺序存放在一个链表中。仅对非水平边分析,对 应于一条扫描线。
活化边(活性边)—与当前扫描线相交的多边形的边。
活化边表(活性边表)AEL(Active Edge List)—按活化 边与扫描线交点x坐标递增的顺序存放在一个链表中。对 应于一条扫描线。
“左闭右开”、“下闭上开”
3 2 1 0 1234
S2=3*2=6
2、扫描线填充算法具体实现
两个连贯性
扫描线的连贯性
当前扫描线与各边的交点顺序,与 下一条扫描线与各边的交点顺序很 可能相同或类似。
边的连贯性
9 8 7 6 5 4 3 2 1 0
0 1 2 3 4 5 6 7 8 9 10 11
xer= xdr + 1/kr yer= ydr + 1 kr为边的斜率 减少求扫描线和多边形各边的交点的计算量
按上、下、左、右的顺序检查与出栈象素相邻 的四个象素,若其中某个象素不在边界上且未 置成多边形色,则把该象素入栈。
可用于填充带内孔的平面区域。
• 例 : 多 边 形 由 P0P1P2P3P4 构 成 , P0(1,5)P1(5,5)P2(7,3)P3(7,1)P4(1,1)
• 设种子点为(3,3),搜索的方向是上、 下、左、右。依此类推,最后像素被选 中并填充的次序如图中箭头所示 (画图)
0 1 2 3 4 5 6 7 8 9 10 11
逐点判断法
逐个判断绘图窗口内的像素:
逐点判断的算法虽然程序简单,但不可取。原 因是速度太慢,主要是由于该算法割断了各象 素之间的联系,孤立地考察各象素与多边形的 内外关系,使得几十万甚至几百万个象素都要 一一判别,每次判别又要多次求交点,需要做 大量的乘除运算,花费很多时间。
缺点: (1) 有些象素会入栈多次,降低算法效率;
栈结构占空间。
(2) 递归执行,算法简单,但效率不高, 区域内每一象素都引起一次递归,进/出 栈,费时费内存。
改进算法,减少递归次数。 解决方法是用扫描线种子填充算法;
2、扫描线种子填充算法
–目标:减少递归层次 –适用于边界表示的4连通区域 算法思想:在任意不间断区间中只取一个种 子像素(不间断区间指在一条扫描线上一组 相邻像素),填充当前扫描线上的该段区间; 然后确定与这一区段相邻的上下两条扫描线 上位于区域内的区段,并依次把它们保存起 来,反复进行这个过程,直到所保存的个区 段都填充完毕。
二、边的结构
• 边的结构有四个域组成(除指针外顺序可以相互交换): • ymax 边的上端点的y坐标(y的最大值); • x 在ET中表示边的下端点的x坐标,在AEL中则表示边与扫 描线的交点的x坐标; • Δx 边的斜率的倒数(到下一条扫描线x的增量); • next 指向下一条边的指针。
y max
遍历AET表,把配对交点之间的区间(左闭右开)上的各象素(x,y),用
drawpixel(x,y,color)改写象素颜色值;
遍历AET表,把ymax=i的结点从AET表中删除,并把 ymin>I结点的x值递增dx;
若允许多边形的边自相交,则用冒泡排序法对AET表重新排序;
}
}/*Polygonfill*/
它与边界色和填充色均不相同,就用填充色填充该点, 然后检测相邻位置,以确定它们是否是边界色和填充 色,若不是,就填充该相邻点。这个过程延续到已经 检测完区域边界范围内的所有像素为止。
4
3
2
S1
1
0 012345
从当前点检测相邻像素有两种方法:
(1)四向连通方法:指的是从区域上一点出 发,可通过四个方向,即上、下、左、右移 动和组合,在不越出区域的前提下,到达区 域内的任意像素;
Int color; 多边形定义,polydef;
算法伪程序
{
for(各条扫描线I)
{
wenku.baidu.com
初始化新边表表头指针NET[i];
把 ymin=I的边放进表NET[i];
}
y=最低扫描线号;
初始化活化边表AET为空;
for(各条扫描线i)
{
把新边表NET[i]中的边结点用插入排序法插入AET表,使之按x坐标递增顺序排列;