基本思想
按扫描线顺序,
计算扫描线与多边形的相交区间,
再用要求的颜色显示这些区间的
象素,即完成填充工作。
对于一条扫描线填充过程可以分为四个步骤:
(1)
求交:计算扫描线与多边形各边的交点
(2)
排序:把所有交点按
x
坐标递增顺序来排序
(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:该边所交的最高扫描线