首页 > 技术文章 > 多边形的扫描转换算法的改进

cnblog-wuran 2018-09-25 22:42 原文

多边形的扫描转换算法的改进

为了避免求交运算,需要引进一套 特殊的数据结构

(1)活性边表(AET):把与当前扫描线相交的边称为活性边,并把它们按与扫描线交点x坐标递增的顺序存放在一个链表中。

 

(2)结点内容(一个结点在数据结构里可用结构来表示)
x: 当前扫描线与边的交点坐标
△x: 从当前扫描线到下一条扫描线间x的增量
ymax: 该边所交的最高扫描线的坐标值ymax

 

随着扫描线的移动,扫描线与多边形的交点和上一次交点相关:
△x=1/k

另外,需要知道一条边何时不再与下一条扫描线相交,以便及时把它从有效边表中删除出去,避免下一步进行无谓的计算

 

其中x为当前扫描线与边的交点,ymax是边所在的最大扫描线值,通过它可以知道何时才能“抛弃”该边,△x表示从当前扫描线到下一条扫描线之间的x增量即斜率的倒数。next为指向下一条边的指针

 

为了方便活性边表的建立与更新,需构造一个新边表(NET),用来存放多边形的边的信息:

1.首先构造一个纵向链表,链表的长度为多边形所占有的最大扫描线数

 

 

 

2.NET挂在与该边低端y值相同的扫描线桶中。也就是说,存放在该扫描线第一次出现的边

-该边的ymax
- 该边较低点的x坐标值xmin
- 该边的斜率1/k
- 指向下一条具有相同较低端y坐标的边的指针

 

 

在这个表里只有1、3、5、7处有边,从y=1开始做,而在1这条线上有两条边进来了,然后就把这两条边放进活性边表来处理

 

 

每做一次新的扫描线时,要对已有的边进行三个处理:

1、是否被去除掉;
2、如果不被去除,第二就要对它的数据进行更新。所谓更新数据就是要更新它的x值,即:x+1/k
3、看有没有新的边进来,新的边在NET里,可以插入排序插进来。

这个算法过程从来没有求交,这套数据结构使得你不用求交点!避免了求交运算。

小结

扫描线法可以实现已知任意多边形域边界的填充。该填 充算法是按扫描线的顺序,计算扫描线与待填充区域的 相交区间,再用要求的颜色显示这些区间的像素,即完 成填充工作

为了提高算法效率:
(1)增量的思想
(2)连贯性思想
(3)构建了一套特殊的数据结构

推荐阅读