计算机图形学第8讲
2013-6-21 信息科学与工程学院
上节回顾
16
边标志算法 基本思想:先用一种特殊的颜色在帧缓存中将多边形的边界勾
画出来,然后将着色的像素点依x坐标递增的顺序两两配对, 再将每一对像素所构成的扫描区间内的所有像素点置为填充 色。
分为两个步骤: (1)打标记 对多边形的每条边进行直线扫描转换,即将多边形边 界经过的像素打上边标志。 易知,每条扫描线上打标志的点的个数必为偶数; 对于多边形的局部最高点和最低点,多按“下闭上开” 的原则处理。
种子像素入栈;当栈非空时作如下三步操作: (1)栈顶像素出栈; (2)填充出栈像素所在扫描行的连续像素段,直到遇到 边界像素为止,即每出栈一个像素,就对包含该像 素的整个扫描线区间进行填充; (3)在区间中检查与当前扫描线相邻的上下两条扫描线 的有关像素是否全为边界像素或已填充的像素,若 存在非边界、未填充边界的像素,则把每一区间的 最左像素取作种子像素入栈。
间,再用要求的颜色显示这些区间的像素,学与工程学院
4
算法步骤: 点的最小和最大y值(ymin和ymax)。
上节回顾
(1)确定多边形所占有的最大扫描线数,得到多边形顶
(2)从y=ymin到y=ymax,每次用一条扫描线进行填充。对
一条扫描线填充的过程可分为四个步骤:
2013-6-21 信息科学与工程学院 19
putpixel (x, y, color);
putpixel (x, y, background);
}
与上两个算法相比,边标志算法避免了对帧缓 存中大量元素的多次赋值,但需逐条扫描线
地对帧缓存中的元素进行搜索和比较。
当用软件实现本算法时,速度与改进的有效边
x为当前扫描线与边的交点 上节回顾 ymax为边所在的最大扫描线值 1/k为从当前扫描线到下一条扫描线间x的增量
2013-6-21 信息科学与工程学院 8
y 12 11 10 9 8 7 6 5 4 3 2 1 p1
y=8
上节回顾
P2P1
1.4 12 2/5
p0 p2 p4
p6
P0P1
7 12 -1
上节回顾
xi+1 ,y i+1
1 xi,yi 1/k
图5-26 与多边形边界相交的两条 连续扫描线交点的相关性
2013-6-21 信息科学与工程学院 7
有效边(Active Edge):指与当前扫描线相交的多边形 的边,也称为活性边。 有效边表(Active Edge Table, AET):把有效边按与扫 描线交点x坐标递增的顺序存放在一个链表中,此链表 称为有效边表。 有效边表的每个结点: x ymax 1/k next
25
(a)以边界表示的4-连通区域
(b)以内点表示的4-连通区域
(c)以边界表示的8-连通区域
(d)以内点表示的8-连通区域
图5-32 区域的边界表示和内点表示
1. 边界填充算法
算法实现见bound4a.c、cir_bian.c
算法的输入:种子点坐标(x,y),填充色和边界颜色。
栈结构实现4-连通边界填充算法的算法步骤为:
就放在相应的扫描线桶中。
2013-6-21
信息科学与工程学院
上节回顾
10
上节回顾 (3)每条边的数据形成一个结点,内容包括:该扫描线 与该边的初始交点x(即较低端点的x值),1/k,以
及该边的最大y值ymax。
x|ymin ymax 1/k next
(4)同一桶中若干条边按x|ymin 由小到大排序,若x|ymin
2013-6-21 信息科学与工程学院 17
边标志算法 (2)填充 对每条与多边形相交的扫描线,依从左到右的顺序,
按“左闭右开”的原则对扫描线上的像素点进行填
色。 使用一个布尔量inside来指示当前点是否在多边形内 的状态。Inside的初值为假,每当当前访问的像素 为被打上边标志的点,就把inside取反。对未打标
志 的 像 素 , inside 不 变 。 若 访 问 当 前 像 素 时 ,
inside为真,说明该像素在多边形内,则把该像素 置为填充颜色。
2013-6-21 信息科学与工程学院 18
算法描述为:
void edgemark_fill(多边形 polydef, int color) { 对多边形polydef 每条边进行直线扫描转换; inside = FALSE; for (每条与多边形polydef相交的扫描线y ) for (扫描线上每个像素x ) { if(像素 x 被打上边标志)inside = ! (inside); if(inside!= FALSE) else }
边界色且未置成多边形色,则把该像素入栈。
2013-6-21
信息科学与工程学院
28
特点:
可以用于填充带有内孔的平面区域。
把太多的像素压入堆栈
改进
通过沿扫描线填充水平像素段,来代替处理4-邻
接点和8-邻接点。
2013-6-21
信息科学与工程学院
29
沿扫描线填充水平像素段的4-连通边界填充算法步骤:
23
区域通常分为4-连通区域和8-连通区域两类。
一个点p的4-邻接点是指上、下、左、右四个相邻的点。
一个点p的8-邻接点是指上、下、左、右、左上、右上、 左下、右下八个相邻的点。
4 4 p 4 4 (a)p的4-邻接点 8 8 8 8 p 8 8 8 8 (b)p的8-邻接点
图5-33 邻接点的定义
的取舍问题。
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
图5-24 与多边形顶点相交的交点的处理
2013-6-21 信息科学与工程学院
上节回顾
6
3. 改进的有效边表算法(Y连贯性算法) 改进原理: • 处理一条扫描线时,仅对有效 边求交 • 利用扫描线的连贯性 • 利用多边形边的连贯性
表算法相当,但本算法用硬件实现后速度会
有很大提高。
2013-6-21
信息科学与工程学院
20
5.4.3
区域填充
区域填充是指从区域内的一个点(种子)开始, 由内向外将填充色扩展到整个区域内的过程
区域是指已经表示成点阵形式的填充图形,它是像素集 合。通常有内点表示和边界表示两种形式。
2013-6-21
信息科学与工程学院
13
算法步骤:
上节回顾
(1)初始化:构造边表,AET表置空; (2)将第一个不空的ET表中的边与AET表合并; (3)由AET表中取出交点对进行填充。 填充时设一布尔变量b(初值为假),令指针从AET中 第一个结点到最后一个结点遍历一次,每访问一个结点, 把b取反一次,若b为真,则把从当前结点的x值到下一 结点的x值结束的区间用多边形色填充。填充之后删除 y=ymax的边。(期间,x=round(x) ) ( 4)yi+1=yi+1,根据xi+1=xi+1/k计算并修改AET表,同时合并 ET表中y=yi+1 桶中的边,按次序插入到AET表中,形成 新的AET表; (5)AET表不为空则转(3),否则结束。
2013-6-21
信息科学与工程学院
22
内点表示法
内点表示:枚举出给定区域内所有像素的表示方法。
在内点表示法中,区域内的所有像素点着同一颜色,
而区域边界上的像素着不同的颜色。
以内点表示法为基础的区域填充算法称为泛填充算
法(Flood-fill Algorithm)。
2013-6-21
信息科学与工程学院
种子像素入栈;当栈非空时重复执行如下三步操作:
(1)栈顶像素出栈;
(2)将出栈像素置成填充色;
(3)检查出栈像素的4-邻接点,若其中某个像素点不是边界色
且未置成多边形色,则把该像素入栈。
2013-6-21 信息科学与工程学院 27
栈结构实现8-连通边界填充算法的算法步骤为: 种子像素入栈;当栈非空时重复执行如下三步操作: (1)栈顶像素出栈; (2)将出栈像素置成填充色; (3)检查出栈像素的8-邻接点,若其中某个像素点不是
何意义强、占内存少;不能直接用于面着色。
点阵表示是用位于多边形内的像素的集合来刻划多边形。
失去了许多重要的几何信息;便于运用帧缓冲存储器表示图形, 易于面着色。
P0 P1 P5 P4 P3
2013-6-21 信息科学与工程学院 3
P2
上节回顾
2. x-扫描线算法
基本思想:
按扫描线顺序,计算扫描线与多边形的相交区
2013-6-21 信息科学与工程学院 14
5.4.2
边缘填充算法
上节回顾
边缘填充算法基本思想 按任意顺序处理多边形的每条边。在处理每条边时,首先 求出该边与扫描线的交点,然后将每一条扫描线上交点 右方的所有像素取补。
2013-6-21
信息科学与工程学院
15
边缘填充算法最适用于具有帧缓存的图形系统, 算法简单,但对于复杂图型,每一像素可能被 访问多次,输入输出的量比有效边表算法大得 多。 栅栏填充算法 栅栏指的是一条过多边形顶点且与扫描线垂直的 直线。它把多边形分为两半。 基本思想:按任意顺序处理多边形的每条边,但 在处理每条边与扫描线的交点时,将交点与栅 栏之间的像素取补。
a. 求交:计算扫描线与多边形各边的交点;
b. 排序:把所有交点按x值递增顺序排序; c. 配对:第一个与第二个,第三个与第四个等等;每对交点代 表扫描线与多边形的一个相交区间; d. 填色:把相交区间内的像素置成多边形颜色,把相交区间外
的像素置成背景色。
2013-6-21 信息科学与工程学院 5
存在问题:当扫描线与多边形顶点相交时,交点