算法系列(十二) 多边形区域填充算法:改进的扫描线填充算法

三、改进的扫描线填充算法

扫描线填充算法的原理和实现都很简单,但是因为要同时维护 “活动边表(AET)”和“新边表(NET)”,对存储空间的要求比较高。这两张表的部分内容是重复 的,而且“新边表”在很多情况下都是一张稀疏表,如果能对其进行改进,避免出现两张表,就可以 节省存储空间,同时省去从“边表”生成“新边表”的开销,同时也省去了用“新边表”维护“活动 边表”的开销,基于这个原则可以对原始扫描线算法进行改进。

3.1重新设计“活动边表”

改进的算法仍然使用了“活动边表”的概念,但是不再构造独立的“活动边表”,而是直接在 “边表”中划定一部分区间作为“活动边区间”,也就是说,把多边形的边分成两个子集,一个是与 扫描线有交点的边的集合,另一个是与扫描线没有交点的边的集合。要达到这个目的,只需要对“活 动边表”按照每条边的顶点ymax坐标排序即可。这个排序与原始扫描线算法中对“活动边表”的维护 原理是一样的,因为只有边的ymax坐标区间内与扫描线有交点的边才可能是“活动边”。为了避免重 复扫描整个“活动边表”,需要用一个first指针和一个last指针用于标识“活动边区间”。first指 针之前的边都是已经处理过的边,同样,last指针之后的边都是还没有处理的边。每处理完一条扫描 线,都要更新first和last指针位置,调整last指针的位置将ymax大于当前扫描线的边纳入到“活动边 区间”,同时调整first指针将处理完成的边排除在“活动边区间”之外。

如果调整last指针 的依据是边的ymax是否大于当前扫描线,那么调整first指针的依据是什么?也就是如何判断一条边已 经处理完了?方法是在边(EDGE)定义中增加一个dy(Δy)属性,这个属性被初始化成这条边在y方向 上的长度,每处理完一条扫描线,dy都要做减一处理,当dy=0时,就说明这条边已经不与扫描线相交 了,可以被排除在活动边区间之外。改进的扫描线算法的“边”的完整定义如下:

7 typedef struct tagEDGE2   

 8 {   

 9     double xi;   

10     double dx;   

11     int ymax;   

12     int dy;   

17 }EDGE2;

EDGE2定义中xi、dx和ymax的含义和原始算法中EDGE的定义相同,只是多了一个 dy属性。

每当处理一条扫描线时,除了“活动边区间”的first指针和last指针需要调整之外 ,还要将first指针和last指针之间的“活动边”按照xi从小到大的顺序排序,以保证填充算法能够用 正确的交点线段序列画线填充。因此,每次调整“活动边区间”的first指针和last指针之后,都要对 “活动边区间”重新排序,也就是说“活动边区间”内的各边的位置并不固定,会随着扫描线的变化 而相应地变化。

仍以图(6)所示的多边形为例,处理扫描线10时的“活动边表”状态如图 (11-a)所示,而处理扫描线8时的“活动边表”状态则如图(11-b)所示。可以看出,当处理扫描线 8时,“活动边区间”内的边的顺序有了调整,因为新加入的P6P1和P1P2两条边与扫描线的交点坐标xi 比P5P6与扫描线的交点坐标xi小,因此排在P5P6前面。

图(11)改进的活动边表结构

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索指针
, 算法
, 区间树
, 扫描线算法
, 活动
, 算法 空间坐标
, 处理
, 区间
, 调整
线段交点算法
十二星座算法、十二生肖算法、铁扫十二支的算法、十二神算法、十二位 纯字母 算法,以便于您获取更多的相关知识。

时间: 2024-10-31 10:36:58

算法系列(十二) 多边形区域填充算法:改进的扫描线填充算法的相关文章

算法系列(十二)多边形区域填充算法:扫描线填充算法(有序边表法)

二.扫描线算法(Scan-Line Filling) 扫描线算法适合对矢量图形进行区域填充,只需要 直到多边形区域的几何位置,不需要指定种子点,适合计算机自动进行图形处理的场合使用,比如电 脑游戏和三维CAD软件的渲染等等. 对矢量多边形区域填充,算法核心还是求交.<计算几何 与图形学有关的几种常用算法>一文给出了判断点与多边形关系的算法――扫描交点的奇偶数判断算 法,利用此算法可以判断一个点是否在多边形内,也就是是否需要填充,但是实际工程中使用的填充 算法都是只使用求交的思想,并不直接使用这

[算法系列之二十四]后缀树(Suffix Tree)

之前有篇文章([算法系列之二十]字典树(Trie))我们详细的介绍了字典树.有了这些基础我们就能更好的理解后缀树了. 一 引言 模式匹配问题 给定一个文本text[0-n-1], 和一个模式串 pattern[0-m-1],写一个函数 search(char pattern[], char text[]), 打印出pattern在text中出现的所有位置(n > m). 这个问题已经有两个经典的算法:KMP算法 ,有限自动机,前者是对模式串pattern做预处理,后者是对待查证文本text做预处

Silverlight &amp;amp; Blend动画设计系列十二

Silverlight & Blend动画设计系列十二:三角函数(Trigonometry)动画之自由旋转(Free-form rotation) 说到对象的旋转,或许就会联想到对象角度的概念.对象的旋转实现实际上就是利用对象 的角度改变来实现的位置变换,在<Silverlight & Blend动画设计系列二:旋转动画( RotateTransform)>一文中有对对象的不同角度变换的实现介绍,本篇要介绍的自由旋转( Free-form rotation)将借助<Fun

xen虚拟化实战系列(十二)之xen虚拟机高可用之在线迁移

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://koumm.blog.51cto.com/703525/1286643 xen虚拟化实战系列文章列表 xen虚拟化实战系列(一)之xen虚拟化环境安装xen虚拟化实战系列(二)之xen虚拟机安装xen虚拟化实战系列(三)之xen虚拟机复制xen虚拟化实战系列(四)之xen虚拟机扩展磁盘空间一法xen虚拟化实战系列(五)之xen虚拟机扩展磁盘空间再一法xen虚拟化实战系列(六)之x

vs2013-Java代码 凸六边形的扫描线填充算法

问题描述 Java代码 凸六边形的扫描线填充算法 凸六边形的扫描线填充算法.输入凸六边形的六个顶点,输出填充后的六边形图形.需要Java语言源代码 解决方案 扫描线填充算法类扫描线区域填充算法平面多边形区域的扫描线填充算法

[算法系列之二十六]字符串匹配之KMP算法

一 简介 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法).KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的. 二 基于部分匹配表的KMP算法 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含搜索串"ABCDABD"? 步骤1:字符串"BBC ABC

算法系列(二十) 计算中国农历(二)

所谓的"天文算法",就是利用经典力学定律推导行星运转轨道,对任意时刻的行星位置进行精确计 算,从而获得某种天文现象发生时的时间,比如日月合朔这一天文现象就是太阳和月亮的地心黄经(视黄 经)差为0的那一瞬间.能够计算任意时刻行星位置的一套理论就被称为星历表,比较著名的星历表有美 国国家航空航天局下属的喷气推进实验室发布的DE系列星历表,还有瑞士天文台在DE406基础上拓展的瑞 士星历表等等.根据行星运行轨道直接计算行星位置通常不是很方便,更何况大多数民用天文计算用不上 那么多精确的轨道参

算法系列(二十) 计算中国农历(一)

世界各国的日历都是以天为最小单位,但是关于年和月的算法却各不相同,大致可以分为三类: 阳历--以天文年作为日历的主要周期,例如:中国公历(格里历) 阴历--以天文月作为日 历的主要周期,例如:伊斯兰历 阴阳历--以天文年和天文月作为日历的主要周期,例如:中国农 历 我国古人很早就开始关注天象,定昼夜交替为"日",月轮盈亏为"月",寒暑交替为"年" ,在总结日月变化规律的基础上制定了兼有阴历月和阳历年性质的历法,称为中国农历.本文将介绍中国 农历的

[算法系列之二十]字典树(Trie)

一 概述 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计. 二 优点 利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希表高. 三 性质 (1)根节点不包含字符,除根节点外每一个节点都只包含一个字符: (2)从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串: (3)每个节点的所有子节点包含的字符都不相同. 单词列表为"apps&