收藏 分享(赏)

第5讲 多边形区域填充算法.ppt

上传人:dzzj200808 文档编号:3322610 上传时间:2018-10-13 格式:PPT 页数:46 大小:514.50KB
下载 相关 举报
第5讲 多边形区域填充算法.ppt_第1页
第1页 / 共46页
第5讲 多边形区域填充算法.ppt_第2页
第2页 / 共46页
第5讲 多边形区域填充算法.ppt_第3页
第3页 / 共46页
第5讲 多边形区域填充算法.ppt_第4页
第4页 / 共46页
第5讲 多边形区域填充算法.ppt_第5页
第5页 / 共46页
点击查看更多>>
资源描述

1、第5讲 多边形区域填充算法 中南大学地学院GIS中心,2,区域的表示方法,区域的表示方法 顶点表示(几何表示) 用区域的顶点序列来表示区域,经过数学计算可知区域是由什么样的相连直线或曲线构成其轮廓线的 点阵表示(像素表示) 用位于多边形内的像素集合来刻画多边形,3,区域填充的概念,区域填充即给出一个区域的定义,要求对此区域范围内的所有像素赋予指定的颜色代码 确定哪些像素位于填充区域的内部 用指定颜色绘制这些像素 扫描转换多边形 将多边形顶点表示形式转换成点阵表示形式,4,逐点判断法,基本原理 判断绘图窗口内的像素是否位于多边形内,若是,则用指定颜色绘制该像素 问题 如何判断点在多边形的内外关系

2、? 射线法 累计角度法 编码法,5,算法 假设判断点是否在多边形内的函数为IsInside(),#define MAX 100 typedef struct / 多边形顶点个数int PolygonNum; /多边形顶点数组Point vertexcesMAX Polygon; / 多边形结构,void FillPolygon(Polygon *P, int polygonColor) int x,y;for(y = ymin;y = ymax;y+)for(x = xmin;x = xmax;x+)if(IsInside(P,x,y)SetPixel(x, y, polygonColor);

3、elseSetPixel(x,y,backgroundColor); /*end of FillPolygonPbyP() */,6,射线法,若交点数=偶数(包括0),则点在多边形之外,B,D,E,P,A,B,C,D,E,P,A,C,若交点数=奇数,则点在多边形之内,7,依顺序取出每一条射线,求其与多边形边界的交点,并对每一对交点中的像素进行填充,射线,a,b,c,d,8,射线法的缺陷,填充扩大化问题 若将多边形边界看成是多边形内部,并对它们填充,则该多边形会被放大 解决方法 采取“左闭右开,下闭上开”的方法,即将左、下边界像素视为多边形内部,需填充,而右、上边界则为多边形外部,不予填充,9,

4、取整问题 射线与多边形边界交点坐标值不为整数 解决方法 当射线与多边形边界交点坐标为小数值时,如果多边形在此边界右侧,则将该小数值进1作为边界点,否则舍去小数部分并进行填充,这样可使多边形不扩大,10,奇点取舍问题 当射线与多边形顶点相交时,称该交点为奇点。如果奇点的计数不正确,会导致填充错误,射线4与多边形相交时,有一个奇点。如果奇点计数为奇数个,则总共得到3个交点,此时多边形会将区域外部填充,而区域内部不予填充,出现错误。若将奇点计数为偶数个,问题可解决 射线2与多边形相交时,有一个奇点。如果奇点计数依照上述计为偶数个,则总共得到3个交点,仍然会造成错误填充。如果将奇点计数为奇数个,问题可

5、解决,11,解决方法 当奇点在多边形两边之下时,该点计2次,如A、D、H点 当奇点在多边形两边之上时,该点计0次,如B、F、I点 当奇点在多边形两边中间时,该点计1次,如C、E、G点 具体实现方法 检查顶点的两条边的另外两个端点的y值,由这两个y值中大于交点y值的个数是0、1、2来决定,12,水平边问题 射线与多边形的水平边相交时,交点理论上是无穷多个 解决方法 对于多边形的水平边,不计它与射线的交点,13,逐点判断法的特点,特点 程序简单 测试点是否在多边形内的算法速度太慢,效率低 改进 逐点判断法孤立考虑各个像素与多边形的内外关系 利用内部点的连续性,14,扫描线多边形填充算法,目标 利用

6、相邻像素之间的连贯性,提高算法效率 处理对象:简单多边形 非自交多边形 (边与边之间除了顶点外无其它交点) 扫描线(Scanning Line) 平行于坐标轴的直线 一般取平行于X轴 区间:扫描线与边的交点间的线段,15,连贯性(Coherence) 边的连贯性(Edge Coherence) 某条边与当前扫描线相交,也可能与下一条扫描线相交 扫描线的连贯性(Scan-line Coherence) 当前扫描线与各边的交点顺序与 下一条扫描线与各边的交点顺序可能相同或类似 区间的连贯性(Span Coherence) 同一区间上的像素取同一颜色属性,16,基本原理 将整个绘图窗口内扫描多边形的

7、问题分解到一条条扫描线,只要完成每条扫描线的绘制就实现了多边形的扫描转换 一条扫描线与多边形的边有偶数个交点,每2个点形成一区间 多边形的填充过程可以分为四个步骤: 求交:计算扫描线与多边形各边的交点 排序:把所有交点按x值递增顺序排序 配对:第一个与第二个,第三个与第四个等,每对交点代表扫描线与多边形的一个相交区间 填色:把相交区间内的像素置成多边形颜色,把相交区间外的像素置成背景色,17,计算交点,分类 第一类交点:位于同一条边上的后继交点-(P2, P4) 第二类交点:新出现的边与扫描线的交点-(P3) 计算:由扫描线ye与多边形的交点递推计算扫描线 ye1的交点 第一类交点:xx1/k

8、 第二类交点:线段的下端点即为交点,18,排序、配对与填色,排序 扫描线连贯性 采用插入排序 交点两两配对与填色 区间连续性 连续绘制区间上的像素,19,算法数据结构,边的分类表ET (Edge Table)(又称新边表) 按照边的下端点 y 坐标,对非水平边进行分类的链表 下端点 y 坐标值等于i 的边属于第i类,同类中有多条边时按x从小到大排序 作用:避免盲目求交;计算第二类交点坐标 ET的建立 先按下端点的y坐标值对所有的边进行分组 若某边的下低端点y值为ymin,则该边就放在ymin所对应的桶中 然后用排序方法,按下端点的x坐标值递增的顺序将同一组中的边排列成行,20,ET定义 每条扫

9、描线,对应一个链表 链表中每个结点的结构,typedef struct int ymax;float x, deltax;Edge *nextEdge;Edge;,ET的结点信息: ymax: 边的上端点的 y 坐标值 x:边的下端点的 x 坐标 Deltax(1/k):边的斜率的倒数 nextEdge:下一条边的指针,21,假设从下到上扫描,多边形的某边与当前扫描线的交点坐标为(xi,yi),该边的直线方程为ax+by+c=0,则下一条扫描线与该边的交点不需重新计算,只要加上1/k其中,x的增量-b/a即为边的斜率的倒数 当扫描线 y = ymax ,说明该扫描线与此边不相交(上开下闭),2

10、2,例:对以下的多边形建立边表。,0,1,2,8,7,6,5,4,3,l1,l6,l2,l5,l3,l4,23,活性边表AEL(Active Edge List)存放活性边的顺序链表,且按交点 x 的值从小到大排序 活性边:与当前扫描线相交的边 边结构定义:与ET表中结点结构相同。,typedef struct int ymax;float x, deltax;Edge *nextEdge;Edge;,AEL 的结点信息:ymax: 所交边的最大 y 值x:当前扫描线与边的交点的x坐标deltax(1/k):边的斜率的倒数nextEdge: 下一条边的指针,24,活化链表的建立 建立ET 将扫

11、描线纵坐标y的初值置为ET中非空元素的最小序号 置AEL为空; 执行下列步骤直至ET和AEL都为空 如ET中的第y类非空,则将其中的所有边取出并插入AEL中 如果有新边插入AEL,则对AEL中各边排序 对AEL中的边两两配对,(1和2为一对,3和4为一对,),将每对边中x坐标按规则取整,获得有效的填充区段,再填充 将当前扫描线纵坐标 y 值递值1 将AEL中满足y = ymax边删去(因为每条边被看作下闭上开的) 对AEL中剩下的每一条边的x递增deltax,即x = x+deltax,25,0,1,2,8,7,6,5,4,3,l1,l6,l2,l5,l3,l4,9,10,11,例:对以下的多

12、边形建立活性链表。,26,扫描线多边形填充算法的优缺点,优点: 每个像素只访问一次,避免了反复求交点等大量运算 与设备无关 缺点 数据结构复杂 只适合软件来实现,27,边填充算法,写像素的逻辑操作 主要包括:拷贝、异或(求余)等 写模型:像素的结果颜色与源像素及像素当前颜色相关,28,求余运算 假定A为一个正整数,则 M 的余定义为 A M, 记为 求余运算可用异或逻辑运算实现例性质,29,光栅图形中,如果某区域已着上值为M的颜色值后,做偶数次求余运算,该区域颜色不变 而做奇数次求余运算,则该区域颜色变为值为 的颜色,30,基本原理:对每一条扫描线,依次求与多边形各边的交点,将该扫描线上交点右

13、边的所有像素求余。,1,2,3,4,5,6,31,以扫描线为中心的边填充算法,将当前扫描线上的所有像素着上值为 背景颜色 求余 for(i=0; i=m; i+)在当前扫描线上,从横坐标为xi的交点向右求余,图中次序:x0, x1, x2, x3,32,以边为中心的边填充算法,将绘图窗口的背景色置为 ; 对多边形的每一条非水平边做:从该边上的每个像素开始向右求余,33,边填充算法的优缺点,优点: 可按任意顺序处理多边形的边 仅访问与该边有交点的扫描线右方的像素,算法简单 适合用于具有帧缓存的图形系统。处理后,按扫描线顺序读出帧缓存的内容,送入显示设备 缺点: 对复杂图形,每一像素可能被访问多次

14、,输入/输出量大 图形输出不能与扫描同步进行,只有全部画完才能打印,34,栅栏填充算法,在多边形的恰当位置选一点,并过该点作扫描线的垂线栅栏 对于每条扫描线与多边形的交点,将交点与栅栏之间的扫描线上的像素取余,也就是说,若交点位于栅栏左边,则将交点之右、栅栏之左的所有像素取余;若交点位于栅栏右边,则将栅栏之右、交点之左的所有像素取余 多边形外的像素处理大大减少,被重复取余的像素数目也减少,但仍有些像素被重复取余,35,1,2,3,4,5,6,36,种子填充算法,区域:点阵表示的图形,像素集合 表示方法 内点表示 区域内的所有像素具有同一颜色,而区域外的所有像素具有另一种颜色 边界表示 区域边界

15、上的所有像素具有特定的颜色(可以是填充色),在区域内的所有像素均不能具有这一特定颜色,而且边界外的像素也不能具有与边界相同的颜色,37,基本思想:假设在多边形区域内部至少有一个像素是已知的(此像素称为种子像素),由此出发找到区域内所有其他像素,并对其进行填充 种子填充算法要求区域是连通的,38,区域的连通性,4连通区域:区域中任意两点可通过上下左右四个方向互相到达 8连通区域:区域中任意两点可通过上下左右和对角线八个方向互相到达,39,4连通与8连通区域的区别,连通性: 4连通可看作8连通区域,但对边界有要求不同 依据区域内点能否访问到区域外的点,对边界的要求是 4连通区域,边界只要8连通即可

16、 8连通区域,边界必须是4连通 例:如左图 (1)4连通区域,边界为 像素 (2)8连通区域,边界为 和 像素,40,种子填充算法的分类,四向算法 从四个方向寻找下一像素点 有时不能通过狭窄区域,因而不能填满多边形 八向算法 允许从八个方向搜索下一像素点 有时会填出多边形的边界,41,简单的种子填充算法(四向算法),种子像素入栈 当栈非空时重复执行以下操作 栈顶像素出栈 将出栈像素置成多边形色 按右、上、左、下顺序检查与出栈像素相邻的四个像素,若其中某个像素不在边界且未置成多边形色,则把该像素入栈,void BoundaryFill4(int x, int y, int oldColor, i

17、nt newColor) /oldColor边界像素颜色int color; color = GetPixel(x, y);if(color != oldColor) /*end of BoundaryFill4( ) */,42,填充S,填充2,填充3,填充4,填充5,填充6,填充7,填充8,填充9,填充4,填充7,填充9,例:用种子填充算法填充下图的区域。,43,简单的种子填充算法的缺陷,有些像素会多次入栈,降低算法效率 要求有很大的存储空间来实现栈结构 递归执行,算法简单,但效率不高,区域内每一像素都引起一次递归,需要进行入/出栈操作,44,扫描线种子填充算法,在任意不间断区间中只取一个

18、种子像素(不间断区间指在一条扫描线上一组相邻元素),填充当前扫描线上的该段区间;然后确定与这一区段相邻的上下两条扫描线上位于区域内的区段,并依次把它们保存起来,反复进行这个过程,直到所保存的每个区段都填充完毕 可以填充有孔区域,对于每一个待填充区段,只需入栈一次,因此提高了区域填充的效率,45,算法执行步骤,初始化:堆栈置空,将种子(x,y)入栈 出栈:若栈空则结束,否则栈顶元素(x,y)出栈,以y作为当前扫描线 填充并确定种子点所在区域:从种子点(x,y)出发,沿当前扫描线向左、右两个方向填充,直到遇到边界像素为止。分别标记区段的左、右端点坐标为xl和xr 确定新的种子点:在区间xl,xr中检查与当前扫描线y相邻的上、下两条扫描线上的像素。若存在非边界、未填充的像素,则把每一区间的最右像素作为种子点压入堆栈并返回,46,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报