第6讲 扫描转换与区域填充

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
8 7 6 5 4 3 2 P6(2,7) A F B P5(5,5) P3(11,3) P1(2,2) P2(5,1) 0 1 2 3 4 5 6 7 8 9 10 11 E C P4(11,8) G D
1
5 -3 P1P2
电子与信息工程学院 计算机科学与技术系
扫描线算法
●规则1:
X为小数,即交点落于扫描线上两个相邻像素之间
电子与信息工程学院 计算机科学与技术系
活性边表
8 7 6 5 4 3 2 P6(2,7) A F B P5(5,5) P3(11,3) P1(2,2) P2(5,1) 0 1 2 3 4 5 6 7 8 9 10 11 E C P4(11,8) G D
1
扫描线为6的活性表
P6P1 2 0 7 P5P6 3.5 -1.5 7 P4P5 7 2 8 P3P4 11 0 8
(a)交点位于左边之上,向右取整 (b)交点位于右边之上,向左取整
电子与信息工程学院 计算机科学与技术系
扫描线算法
●规则2:
边界上象素的取舍问题,避免填充扩大化。
●解决方法:
边界象素:规定落在右上边界的象素不予填充。
具体实现时,只要对扫描线与多边形的相交区间左闭右开
电子与信息工程学院 计算机科学与技术系
然后将该颜色扩展到整个区域的过程。
区域填充算法要求区域是连通的。
电子与信息工程学院 计算机科学与技术系
区域的连通性
四连通:从区域内一点出发,可通过 四个方向:上、下、左、右到达该区 域内部的任意象素。 八连通:区域内部从一个象素到达另 一个象素的移动路径,除了上、下、 左、右四个方向外,还允许沿着对角 线方向。
A
△ x y ma x
B
△ x ymax
C
△ x ymax
D
△ x ymax
电子与信息工程学院 计算机科学与技术系
活性边表
假定当前扫描线与多边形某一条边的交点的x坐标 为x,则下一条扫描线与该边的交点不要重计算, 只要加一个增量△x。 1 xi by i ci
设该边的直线方程为:ax+by+c=0; a 若y=yi,x=x i;则当y = y i+1 =yi +1 =时,
电子与信息工程学院 计算机科学与技术系
奇异点的处理
将多边形的顶点分为两大类: 局部极值点 进入该点的边线和离开该点的边线位于过该点 扫描线的同一侧。点P1、P2、P4和P6。 非极值点 对于这些点来说,进入该点的边线和离开该点的 边线位于过该点扫描线的两侧。点P3、P5。
处理奇异点规则: 对于局部极值点,看成两个点; 对于非极值点,看成一个点。
电子与信息工程学院 计算机科学与技术系
扫描线算法
把新边表NET [i] 中的边结点用插入排序法插 入AET表,使之按x坐标递增顺序排列; 遍历AET表,把配对交点区间(左闭右开)上的 象素(x, y),用drawpixel (x, y, color) 改写象 素颜色值; 遍历AET表,把y max= i 的结点从AET表中删 除,并把y max > i 结点的x值递增x; 若允许多边形的边自相交,则用冒泡排序法对 AET表重新排序; } } /* polyfill (polygon, color) int color; 多边形 polygon; { for (各条扫描线i ) { 初始化新边表头指针NET [i]; 把y min = i 的边放进边表NET [i]; } y = 最低扫描线号; 初始化活性边表AET为空; for (各条扫描线i ) {
电子与信息工程学院 计算机科学与技术系
新边表
新边表(NET):
存放在该扫描线第一次出现的边。 若某边的较低端点为ymin, 则该边就放在扫描线ymin的新边表中
8 7 6 5 4 3 2 1 0 11 2 0 0 8 7 2 P3P4 P6P1 5 3 P2P3 3 P4P5 5 2 P5P6 8 5 -1.5 7

枚举出区域内部的所有像素 内部的所有像素着同一个颜色 边界像素着与内部像素不同的颜色
表示内点
表示边界点

边界表示

枚举出边界上所有的像素 边界上的所有像素着同一颜色 内部像素着与边界像素不同的颜色
电子与信息工程学院 计算机科学与技术系
区域填充

区域填充的含义

是指先将区域的一点赋予指定的颜色,
电子与信息工程学院 计算机科学与技术系
区域的连通性
八连通区域
四连通区域
电子与信息工程学院 计算机科学与技术系
区域填充算法
已知条件: G为一内点表示的区域 (x,y)为区域内一点 old_color为G的原色 如何对G进行填充?
电子与信息工程学院 计算机科学与技术系
区域填充的递归算法
已知条件: G为一内点表示的区域 (x,y)为区域内一点 old_color为G的原色 现取(x,y)为种子点对区域G进行填充: 即先置像素(x,y)的颜色为new_color 然后逐步将整个区域G都置为同样的颜色。
电子与信息工程学院 计算机科学与技术系
演示
边界标志算法

算法特点
该算法思想简单,实现容易。既不需要求交点、 交点排序、边的登记,也不需要使用链表、堆栈 等数据结构。 用软件实现时,扫描线算法与边界标志算法的执 行速度几乎相同,但由于边界标志算法不必建立 维护边表以及对它进行排序,所以边界标志算法 更适合硬件实现,这时它的执行速度比有序边表 算法快一至两个数量级。
电子与信息工程学院 计算机科学与技术系
递归算法
例:多边形P0(1,5)P1(5,5)P2(7,3)P3(7,1)P4(1,1) 种子点为(3,3) 搜索的方向是上、下、左、右。
11 12 13 14
10 9 s1 8 7 2 3 6 4 5
电子与信息工程学院 计算机科学与技术系
递归算法
内点表示的四连通区域的递归填充算法 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); } }
电子与信息工程学院 计算机科学与技术系
递归算法
边界表示的四连通区域的递归填充算法 void BoundaryFill4(int x,int y,int boundarycolor,int newcolor) { int color; if(color!=newcolor && color!=boundarycolor) { drawpixel(x,y,newcolor); BoundaryFill4 (x,y+1, boundarycolor,newcolor); BoundaryFill4 (x,y-1, boundarycolor,newcolor); BoundaryFill4 (x-1,y, boundarycolor,newcolor); BoundaryFill4 (x+1,y, boundarycolor,newcolor); } }
电子与信息工程学院 计算机科学与技术系
扫描线算法
特点:对于顶点表示的多边形,算法
效率较高。
缺点:对各种表的维持和排序开销太
大,适合软件实现而不适合硬件实现。
电子与信息工程学院 计算机科学与技术系
边界标志算法

扫描线的相关性
某条扫描线上相邻的 象素,几乎都具有同样 的内外性质,这种性质 只有遇到多边形边线与 该扫描线的交点时才会 发生改变。
第6讲 扫描转换与区域填充
多边形的扫描转换
扫描线算法 边界标志算法

区域填充
区域填充的递归算法 扫描线填充算法

电子与信息工程学院 计算机科学与技术系
多边形的表示方法
顶点表示(线)
扫描转换
点阵表示(填充)
用多边形的顶点序列来表示 用位于多边形内的象素集合来表示
电子与信息工程学院 计算机科学与技术系
x i 1 1 ( b y i 1 c i ) x i b ; a a
其中
x b
为常数,是斜率的倒数
a
电子与信息工程学院 计算机科学与技术系
新边表

为了方便边的活化链表的更新,建立另一个表 -边表,存放在该扫描线第一次出现的边。
存放的信息: x:扫描线与该边的初始交点 dx:x的增量 ymax:该边的最大y值
电子与信息工程学院 计算机科学与技术系
二 区域填充

区域的含义
这里讨论的区域指已经表示成点阵形式 的填充图形,它是像素的集合
电子与信息工程学院 计算机科学与技术系
区域填充

区域表示方法:
表示内点
表示边界点
电子与信息工程学院 计算机科学与技术系
区域填充

区域表示方法: 内点表示、边界表示

内点表示
两种方法:扫描线算法;边界标志法

电子与信息工程学院 计算机科学与技术系
扫描线算法基本思想
按扫描线顺序,计算扫描线 与多边形的相交区间,再用要求 的颜色显示这些区间的象素,即 完成填充工作。
电子与信息工程学院 计算机科学与技术系
扫描线算法基本思想
一条扫描线填充过程的步骤:
(1)求交(2)排序(3)配对(4)填色
电子与信息工程学院 计算机科学与技术系
边界标志算法

基本思想

先在屏幕上生成多边形轮廓线,然后逐条扫描 处理。处理中:逐点读取象素值,若为边界色, 则对该象素值进行颜色切换。
电子与信息工程学院 计算机科学与技术系
边界标志算法

算法实现
1、用边界色画出多边形轮廓线,也就是将多边形边界所 经过的象素打上边标志。 2、为了缩小范围,加快填充速度,须找出多边形的最小 包围盒:xmin、ymin、xmax、ymax。 3、逐条扫描线进行处理, 对每条扫描线依从左往右的顺序, 逐个访问该扫描线上的象素。每 遇到边界象素,标志取反。然后, 按照标志是否为真决定象素是否 为填充色。
电子与信息工程学院 计算机科学与技术系
区域填充的递归算法
步骤如下: 种子像素入栈,当栈非空时,执行如下 三步操作: (1)栈顶像素出栈; (2)将出栈像素置成多边形色; (3)按上、下、左、右的顺序检查与出 栈像素相邻的四个像素,若其中某个像素 不在边界上且未置成多边形色,则把该像 素入栈。
扫 描 线 的 相 关 性 边 的 相 关 性 电子与信息工程学院 计算机科学与技术系
奇异点的处理
•当扫描线与多边形P的交点是P的顶点时,则称该 交点为奇点。 •以上所述多边形的的连贯性都基于这样的几何事 实:每一条扫描线与多边形P的边界的交点个数都 是偶数。但是如果把每一奇点简单地计为一个交点 或者简单地计为两个交点,都可能出现奇数个交点。 那么如果保证交点数为偶数呢?
用水平扫描线从上到下扫描; 每根扫描线与多边形各边产生一系列交点; 这些交点按照x坐标进行分类; 将分类后的交点成对取出,作为两个端点, 以所需要填的色彩画水平直线; 多边形被扫描完毕后,填色也就完成。
电子与信息工程学院 计算机科学与技术系
算法描述


扫描线的相关性:某条扫描线上相邻的象素,几乎都具有 同样的内外性质,这种性质只有遇到多边形边线与该扫描 线的交点时才会发生改变。 边的相关性:由于相邻扫描线上的交点是与多边形的边线 相关的。对同一条边,前一条扫描线yi与该边的交点为xi, 而后一条扫描线yi+1=yi+1与该边的交点则为 xi+1=xi+1/m,利用这种相关性可以省去大量的求交运算。
电子与信息工程学院 计算机科学与技术系
扫描线算法数据结构
活性边表(AET):把与当前扫描线相交的边称为活 性边,并把它们按与扫描线交点x坐标递增的顺序 存放在一个链表中
第一项 第二项 第三项 第四项
第一项:当前扫描线与边的交点坐标x 第二项:从当前扫描线到下一条扫描线间x的增量△x 第三项:该边所交的最高扫描线号ymax 第四项:指针。用来指向同一条扫描线相交的其它 边,如果其它边不存在,则该项置空。
多边形的表示方法

顶点表示:用多边形顶点的序列来刻划多 边形。直观、几何意义强、占内存少;不 能直接用于面着色。
点阵表示:用位于多边形内的象素的集合 来刻划多边形。失去了许多重要的几何信 息;便于运用帧缓冲存储器表示图形,易 于面着色。
电子与信息工程学院 计算机科学与技术系

多边形的扫描转换

多边形的扫描转换:把多边形的顶点表示转换 为点阵表示,也就是从多边形的给定边界出发, 求出位于其内部的各个象素,并给帧缓冲器内 的各个对应元素设置相应的灰度和颜色,通常 称这种转换为多边形的扫描转换。
相关文档
最新文档