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

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

为了不求交运算,须要引进一套 特殊的数据结构算法

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

 

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

 

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

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

 

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

 

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

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

 

 

 

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

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

 

 

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

 

 

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

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

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

小结

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

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

相关文章
相关标签/搜索