扫描线算法

基本思想

 

 

 

 

 

 

 

 

 

按扫描线顺序,

计算扫描线与多边形的相交区间,

再用要求的颜色显示这些区间的

象素,即完成填充工作。

 

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

 

 

 

 

 

(1) 

 

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

 

 

 

 

 

(2) 

 

排序:把所有交点按

 

坐标递增顺序来排序

 

 

 

 

 

(3) 

 

配对:确定扫描线与多边形的相交区间,第一个与第二个,第三个与第四个等等,

每对交点代表扫描线与多边形的一个相交区间

 

 

 

 

 

(4) 

 

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


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

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

   (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= ((-b yi+1)-c)/a = ((-b yi+1)-c)/a = xi-b/a    

增量为 -b/a  

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

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

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

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

你可能感兴趣的:(算法,图形学中的扫描线算法)