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

本文介绍了改进的扫描线填充算法,旨在减少存储空间并优化处理效率。通过重新设计活动边表,不再需要独立的新边表,而是直接在边表中划定活动边区间,并通过first和last指针进行管理。此外,文章详细阐述了如何构造和调整活动边表,以及算法的具体实现过程。
摘要由CSDN通过智能技术生成

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

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

3.1重新设计“活动边表”

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

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

 7 typedef struct tagEDGE2

 8 {

 9     double xi;

10     double dx;

11     int ymax;

12     int dy;

17 }EDGE2;

 

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

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

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

 

 

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

 

 3.2新“活动边表”的构造与调整

         改进的扫描线算法的重点是“活动边表”的构造和调整。“活动边表”的构造方法如下:

 

(1)       首先剔除多边形各边的水平边,然后将剩下的边按照ymax的值从大到小顺序存入一个线性表中,表中第一个元素ymax值最大的表,最后一个元素是ymax值最小的边。对于各边中左、右顶点的情况需要和原始算法一样做调整,以免出现交点个数不正确的异常。这里对调整的策略再强调一下,调整都是针对边的终点进行的,对于图(10-a)所示的左顶点,需要先将P2点的坐标调整为(x2 – dx, y2 - 1),然后再求边的ymaxxidy。对于图(10-b)所示的右顶点,需要将P2点的坐标调整为(x2 + dx, y2 + 1),然后再求边的ymaxxidy

(2)       加入first指针和last指针,构成“活动边区间”。first指针和last指针之间的边都是和当前扫描线有交点的边或已经处理过的边,已经处理过的边的dy0,因此,对“活动边”扫描时需要忽略其中dy已经是0的边。这些已经处理过的边会加载在正常的边中,直到调整first指针时被剔除出“活动边区间”。

         “活动边表”的调整指的是在处理完每根扫描线之后,更新“活动边表”中“活动边区间”内的各边的相关属性的值,比如递减dy的值,调整交点xi坐标的值等等。根据

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吹泡泡的小猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值