今天来讨论一下如何使用扫描线算法来实现多边形填充。

首先简述一下什么是扫描线算法: 该算法的输入是一组多边形的顶点坐标(x,y),注意,这里有个顺时针还是逆时针问题,请读者自己试验;输出是填充好的多边形。通过使用沿x轴方向的扫描线来确定多边形在每条扫描线上的边界,在xlo和xhi之间进行像素填充。扫描线y=y_i,比如从多边形的y_min到y_max,从而覆盖整个多边形。


请参考博文"区域填充算法和多边形填充的扫描线算法",作者twinklingstar。本文利用其源代码来填充一个五角星。


首先,五角星的坐标给出如下:

    double d_polygon[10][2] = {{13.0901,7.7548},{11.9097,4.1221},{14.9999,6.3672},{18.09,4.1221},{16.9097,7.7548},\
    {20,10},{16.1802,10},{15,13.6326},{13.8196,10},{10,10}};

由于该程序的输入须为整数,所以将x,y都扩大10倍,并且四舍五入。

    int round_polygon[10][2];
    int factor = 10;
    for(int i = 0; i < 10; i++){
        for(int j = 0; j < 2; j++){
            d_polygon[i][j] *= factor;
            round_polygon[i][j] = round(d_polygon[i][j]);
        }
    }

该程序定义了一个Vector结构体,所以将数组值赋给该结构体。

    Vector polygon_five_star[10];
    for(int i = 0; i < 10; i++){
        polygon_five_star[i].x = round_polygon[i][0];
        polygon_five_star[i].y = round_polygon[i][1];
    }

现在,调用扫描线函数scanLineFill()。

scanLineFill(polygon_five_star,10,RGB(0,255,0));

其参数为:poylon_five_start, 须填充的多边形结构体;10, 多边形的顶点数; RGB(0, 255, 0),填充颜色。以下为输出结果。

wKioL1cJqDrCnHVYAAATQFV5fq8763.png

这里有几点注意:

  1. 多边形顶点必须是逆时针才行,接下来还要研究一下为什么顺时针不行;

  2. 顶点坐标需要是整数;

  3. 该程序也是调用了glut工具包,请参考之前的博文关于glut的使用。