线段树算法 ---- 扫描线之面积并

来源:互联网 发布:thinking in java在线 编辑:程序博客网 时间:2024/05/16 11:15

一、扫描线算法

基本思想

       按扫描线顺序,计算扫描线与多边形的相交区间,再用要求的颜色显示这些区间的象素,即完成填充工作。

对于一条扫描线填充过程可以分为四个步骤:

   (1)  求交:计算扫描线与多边形各边的交点

   (2)  排序:把所有交点按 x 坐标递增顺序来排序

   (3)  配对:确定扫描线与多边形的相交区间,第一个与第二个,第三个与第四个等等,每对交点代表扫描线与多边形的一个相交区间

   (4)  填充:显示相交区间的象素

存在问题1:当扫描线与多边形顶点相交时,交点的取舍问题

解决方法:当扫描线与多边形的顶点相交时,若共享顶点的两条边分别落在扫描线的两边,交点只算一个;若共享顶点的两条边在扫描线的同一边,这时交点作为零个或两个,取决于该点是多边形的局部最高点或局部最低点。

具体实现:只需检查顶点的两条边的另外两个端点的 y 值,按这两个 y  值中大于交点y 值的个数是0,1,2 来决定。

 

存在问题2:多边形边界上象素的取舍

解决方法:规定右/上边界的象素不予填充;左/下边界的象素予以填充。

具体实现:对扫描线与多边形的相交区间取左闭右开。




算法的实现

求交

一条扫描线往往只和少数几条边相交。

       与当前扫描线相交的边称为活性边,把它们按与扫描线交点 x 坐标递增的顺序存入一个链表中,称为活性边表 ( AET, Active Edge Table)

       由边的连贯性(当某条边与当前扫描线相交时,它很可能也与下一条扫描线相交)和扫描线的连贯性(当前扫描线与各边的交点顺序,与下一条扫描线与各边的交点顺序很可能相同或类似),只需对当前扫描线的活性边表作更新,即可得到下一条扫描线的活性边表。

计算下一条扫描线与边的交点

       设直线方程:a x + b y + c = 0,

当前交点坐标:(xi ,yi),下一交点坐标:(xi+1  ,yi+1)

xi+1=((-byi+1)-c)/a = ((-b yi+1)-c)/a =xi-b/a    增量为 -b/a

 

故在活性边表中需要存放的信息:

   x:当前扫描线与边的交点

  △x = -b/a:从当前扫描线到下一条扫描线之间的x 增量

  ymax:该边所交的最高扫描线

上图为扫描线 6 的活性边表   左图为扫描线 7 的活性边表

0 0
原创粉丝点击