扫描线填充算法的基本原理:
用水平扫描线从上到下(或从下到上)扫描由多条首尾相连的线段构成的多边形,每根扫描线与多边形的某些边产生一系列交点。将这些交点按照x座标排序,将排序后的点两两成对,作为线段的两个端点,以所填的颜色画水平直线。多边形被扫描完毕后,颜色填充也就完成了。
几个重要的概念:
边的数据结构 :
typedef struct EDGE{
int ymax; /*边所交的最高扫描线号(顶点的最大y值)*/
double x;/*当前扫描线与边的交点x值*/
double dx; /*从当前扫描线到下一扫描线之间的x增量*/
struct EDGE *next;/*下一条边*/
}Edge;
边的分类表:
为了方便活性边表的建立与更新,我们为每一条扫描线建立一个“新边表(NET)”,存放该扫描线第一次出现的边。
活性边:把与当前扫描线相交的边称为活性边。
活性边表:把它们按与扫描线交点x座标递增的顺序存放在一个链表中,称此链表为活性边表。
扫描线6的活性边表如下:P6P1 P6P5 P5P4 P4P3
扫描线4的活性边表如下:P6P1P4P3
扫描线3的活性边表如下:P6P1P4P3
扫描线2的活性边表如下:P1P6P3P2
下面说下算法实现: