CG3基本图形生成(3.3)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

y 8 7 6 5 4 3 2 1 P6(2,7) A B C P5 (5,5) E F D P4(11,8) G 扫描线7 扫描线 扫描线6 扫描线
P1(2,2)
P3(11,3)
P2 (5,1) 0 1 2 3 4 5 6 7 8 9 10 11 12
扫描线2 扫描线 扫描线1 扫描线
x
P6P1 2
解决办法: 解决办法: 在任意一个扫描线与多边形的扫描区间 含若干个连续象素) (含若干个连续象素)中,只取一个种子象 素。——扫描线填充算法 扫描线填充算法
例1
2 1 3 3 1 2
例2
6 5
7 4 2 6 5 3 1 7 4 2 1 3
2.扫描线填充算法原理 扫描线填充算法原理 种子象素入栈;当栈非空时重复执行下面四步操作: 种子象素入栈;当栈非空时重复执行下面四步操作: 1.栈顶象素出栈; 栈顶象素出栈; 栈顶象素出栈 2.沿扫描线对出栈象素的左右象素进行填充,直至遇到 沿扫描线对出栈象素的左右象素进行填充, 沿扫描线对出栈象素的左右象素进行填充 边界象素为止,即每出栈一个象素, 边界象素为止,即每出栈一个象素,就对包含该象素的整个 扫描区间进行填充; 扫描区间进行填充; 3.上述区间内最左、最右的象素分别记为xl,xr; 上述区间内最左、最右的象素分别记为 上述区间内最左 4.在区间 在区间[Xl,Xr]中检测与当前扫描线相邻的上下两条 在区间 中检测与当前扫描线相邻的上下两条 扫描线的有关象素是否全为边界象素或已填充的象素, 扫描线的有关象素是否全为边界象素或已填充的象素,若 存在非边界、未填充的象素, 存在非边界、未填充的象素,则把每一区间的一个象素作 为种子象素入栈。 为种子象素入栈。 5.对相邻的两扫描线的种子点入栈后,紧接着对种子 对相邻的两扫描线的种子点入栈后, 对相邻的两扫描线的种子点入栈后 象素出栈,实现第二步运算,进行迭代计算。 象素出栈,实现第二步运算,进行迭代计算。
区域内部一点( , )开始,先检测该点的颜色, 区域内部一点(x,y)开始,先检测该点的颜色, 如果它与边界色和填充色均不相同,就用填充色填 如果它与边界色和填充色均不相同, 充该点,然后检测相邻位置, 充该点,然后检测相邻位置,以确定它们是否是边 界色和填充色,若不是,就填充该相邻点。 界色和填充色,若不是,就填充该相邻点。这个过 程延续到已经检测完区域边界范围内的所有像素为 止。
从当前点检测相邻像素有两种方法: 从当前点检测相邻像素有两种方法 : 四向连 通和八向连通 四向连通方法指的是从区域上一点出发,可 四向连通方法指的是从区域上一点出发, 通过四个方向,即上、 右移动的组合, 通过四个方向,即上、下、左、右移动的组合,在 不越出区域的前提下,到达区域内的任意像素; 不越出区域的前提下,到达区域内的任意像素; 八向连通方法指的是区域内每一个像素, 八向连通方法指的是区域内每一个像素,可以 通过左、 左上、右上、左下、 通过左、右、上、下、左上、右上、左下、右下这 八个方向的移动的组合来到达。 八个方向的移动的组合来到达。
我们把与当前扫描线相交的边称为活化边 我们把与当前扫描线相交的边称为活化边 x: 当前扫描线与边的交点 当前扫描线与边的交点x ∆x: 从当前扫描线到下一条扫描线之间的x增量 从当前扫描线到下一条扫描线之间的 增量 △x = 1/ m ymax: 边所交的最高扫描线号 按与扫描线交点x坐标递增的顺序存放在一个链 按与扫描线交点 坐标递增的顺序存放在一个链 坐标递增 表中,称此链表为活化边表 表中,称此链表为活化边表
P5 P1
2 ≤ x < 3.5 多边形内 3.5 ≤ x < 7 多边形外 7 ≤ x <11 多边形内 x ≥11 多边形外
0 1 2 3 4 5 6 7 8 9 10 11 12
x
1.求交点:即求出每一条扫描线与多边形所有相交 求交点: 求交点 各边的交点,并建立起( 的交点表。 各边的交点,并建立起(xi,yi)的交点表。 2.交点排序:把所有交点按x坐标递增顺序进行排 交点排序:把所有交点按 坐标递增顺序进行排 交点排序 序。 3.交点配对:第一个与第二个,第三个与第四个 交点配对:第一个与第二个, 交点配对 等等。 等等。每对交点就代表扫描线与多边形的一个相 交区间。 交区间。 4.区间填色:把相交区间内的象素置成多边形的颜 区间填色: 区间填色 把相交区间外的象素置成背景的颜色。 色,把相交区间外的象素置成背景的颜色。
A
P5P6 7
ymax
P4P5 7 7
C
P3P4 8
ymax
0
∇ x∇
3.5 -1.5
B ∇ ∇ x∇ ∇
2
∇ ∇ x∇ ∇
11 0
C ∇ ∇ x∇ ∇
8
ymax
ymax
扫描线6的活性边表 扫描线 的活性边表
P4P5 9
F
P3P4 8 11
G
2
0
8
扫描线7的活性边表 扫描线 的活性边表
在处理完当前扫描线后转入下一条扫描线之前, 在处理完当前扫描线后转入下一条扫描线之前, 要对交点x坐标进行更新(+dx), 插入新加入的边, 坐标进行更新(+ 要对交点 坐标进行更新(+ ), 插入新加入的边, 并把那些与当前扫描线有交, 并把那些与当前扫描线有交,而与下一条扫描线不 再相交的边,从活化边表中删除出去( 再相交的边,从活化边表中删除出去(通过检查当 前扫描线y值是否等于各边的 值是否等于各边的y 值来确定) 前扫描线 值是否等于各边的 max值来确定)。
为了方便活化边表的建立与更新, 为了方便活化边表的建立与更新,我们为每一 条扫描线建立一个有序边表, 条扫描线建立一个有序边表,存放在该扫描线第一 次出现的边。也就是说,若某边的较低端点的y值 次出现的边。也就是说,若某边的较低端点的 值 则该边就放在扫描线为y 有序边表中 为ymin,则该边就放在扫描线为 min的有序边表中。
四种方法: 四种方法: 有序边表填充算法 边填充算法 改进版边填充算法--栅栏填充算法 改进版边填充算法 栅栏填充算法 种子填充算法
y
8 7 6 5 4 3 2 1
扫描线6:四个交点, 扫描线 :四个交点,五个区间 P6
A B C D
P4 扫描线6 扫描线 扫描线4 扫描线 P3 P2
x <2
多边形外
优点:简单 优点 简单 缺点:对于复杂图形 每一象素可能被访问多次 缺点 对于复杂图形,每一象素可能被访问多次 对于复杂图形 每一象素可能被访问多次, 输入输出的量比有效边表算法大得多. 输入输出的量比有效边表算法大得多
为了减少边填充算法访问像素的次数, 为了减少边填充算法访问像素的次数,可引 入栅栏。 入栅栏。 栅栏指的是一条与扫描线垂直的直线,栅栏 栅栏指的是一条与扫描线垂直的直线, 位置通常取过多边形顶点 通常取过多边形顶点、 位置通常取过多边形顶点、且把多边形分为左右 两半。 两半。 栅栏填充法的基本思想是: 栅栏填充法的基本思想是:对于每个扫描线与 多边形的交点,就将交点与栅栏之间的像素取补。 多边形的交点,就将交点与栅栏之间的像素取补。
奇点有:点 奇点有 点P2 P4 P5 P6
按两个交点计算
(2)
奇点有:点 奇点有 点P1 P3
按一个交点计算
在处理一条扫描线时, 在处理一条扫描线时 , 只需对与它相交的多 边形的边进行求交运算。 边形的边进行求交运算。 计算下一条扫描线与同一条边的交点x值时, 计算下一条扫描线与同一条边的交点 值时, 值时 只需把当前交点x值加上一个边的反斜率即可 值加上一个边的反斜率即可: 只需把当前交点 值加上一个边的反斜率即可: xk+1 = xk + 1 / m (m为边的斜率) 为边的斜率) 为边的斜率
开始
3 9 7 4 3 S1 5 5 2 8 5 6 4 5 4 6 7 5 3
s1 2 5
s1
2
3
4
5 5
6
9 8 2
7
4
无点压入
2
8
9
3
存在问题: 太多象素压入堆栈,有的象素入栈多次, 存在问题: 太多象素压入堆栈,有的象素入栈多次,降
低了算法的效率, 低了算法的效率,要求很大存储空间以实现 栈结构。 栈结构。
3.3 区域填充
在计算机图形学中,多边形有两种重要的表示方法: 在计算机图形学中,多边形有两种重要的表示方法: 顶点表示和点阵表示 顶点表示:用多边形顶点的序列来刻划多边形。 顶点表示:用多边形顶点的序列来刻划多边形。 多边形可表示成P 的点序列形式。 多边形可表示成 0P1P2P3P4P0的点序列形式。 点阵表示:用位于多边形内的象素的集合来刻划多边形。 点阵表示:用位于多边形内的象素的集合来刻划多边形。 如图1 多边形可表示成图2 如图1 多边形可表示成图2
种子填充算法中允许从四个方向寻找下一像素 者,称为四向算法;允许从八个方向搜索下一像素 称为四向算法; 称为八向算法。 者,称为八向算法。 八向算法可以填充八向连通区域, 八向算法可以填充八向连通区域,也可以填充四向 连通区域。 连通区域。 四向算法只能填充四向连通区域, 四向算法只能填充四向连通区域,而不能填充八向 填充区域。 填充区域。
3 2 1 0
x
该扫描线与该边的初始交点x(较低端点的x值) 该扫描线与该边的初始交点 (较低端点的 值 X的增量∆x 的增量∆ 的增量 该边的最大y值 该边的最大 值ymax
3.3.2 边填充算法
基本实现:按任意顺序 基本实现 按任意顺序 处理多边形的每条边。 处理多边形的每条边。 在处理每一条边时,首 在处理每一条边时 首 先求出该边与扫描线的交 点,然后将每一条扫描线上 然后将每一条扫描线上 交点右方的所有象素取补。 交点右方的所有象素取补。 多边形的所有边处理 完毕之后,填充即完成 填充即完成。 完毕之后 填充即完成。
区域连通方式对填充结果的影响
4连通区域边界填 充算法的填充结果
8连通区域边界填 充算法的填充结果
简单的种子填充算法 (4连通边界) 连通边界) 连通边界
种子像素入栈 当栈非空时,重复以下步骤: 当栈非空时,重复以下步骤:
栈顶像素出栈 将出栈象素置成填充色 按左、 按左、上、右、下顺序检查与出栈象素相邻的 四象素, 四象素,若其中某象素不在边界上且未被置成 填充色, 填充色,则将其入栈
y 8 7 6 5 4 3 2 1 P6(2,7) A B C P5 (5,5) E F D P4(11,8) G
扫描线7 扫描线 扫描线6 扫描线
8 7 6 5 4
P1(2,2)
P3(11,3)
P2 (5,1) 0 1 2 3 4 5 6 7 8 9 10 11 12
扫描线2 扫描线 扫描线1 扫描线
问题:奇点处理 当扫描线恰好与多边形顶 问题 奇点处理.当扫描线恰好与多边形顶 奇点处理 点相交时,称该交点为奇点 点相交时,
y
保证交点正确配对
P2
8 6 4 2 O
P1 P5 P3
P6
P4
x
第一种情况,共享顶点的两条边分别落在扫描线的 第一种情况,共享顶点的两条边分别落在扫描线的 两边。这时,交点只算一个。 两边。这时,交点只算一个。 第二种情况,共享交点的两条边落在扫描线的同一 第二种情况,共享交点的两条边落在扫描线的同一 边,这时交点作为两个
P1
P3 P2
P0
图1 多边形的顶点表示
P4
图2 多边形的点阵表示
区域填充
用一种颜色或图案来填充一个二维区域。 用一种颜色或图案来填充一个二维区域。 区域填充可以分两步进行: 区域填充可以分两步进行 先确定需要填充哪些像素 再确定用什么颜色值来填充 首要问题: 首要问题:判断一个象素是在多边 形内还是在多边形外。 形内还是在多边形外。
y
8 7 6 5 4 3 2 1
P6(2,7)
F
P4(11,8)
G 扫描线7 扫描线
P5 (5,5)
(2,2) P1
E
P3(11,3)
P2(5,1)
0 1 2 3 4 5 6 7 8 9 10 11 12
扫描线2 扫描线 扫描线1 扫描线
x
(1)
共享交点的两条边落 在扫描线的同一边 共享交点的两条边分 别落在扫描线的两边
P5 P4 P1
P3
P2
P2 P3
Leabharlann Baidu
P3 P4
P4 P5
P5 P1
图3.10 栅栏填充算法示意图 栅栏填充算法只是减少了被重复访问的像素的 数目,但仍有一些像素会被重复访问。 数目,但仍有一些像素会被重复访问。
3.3.3
种子填充算法
种子填充算法的原理: 种子填充算法的原理:从多边形区域内部的 一点开始,由此出发找到区域内的所有像素。 一点开始,由此出发找到区域内的所有像素。 种子填充算法采用的边界定义是区域边界上 所有像素均具有某个特定的颜色值, 所有像素均具有某个特定的颜色值,区域内部所 有像素均不取这一特定颜色
相关文档
最新文档