今天来讨论一下如何使用扫描线算法来实现多边形填充。
首先简述一下什么是扫描线算法: 该算法的输入是一组多边形的顶点坐标(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),填充颜色。以下为输出结果。
这里有几点注意:
多边形顶点必须是逆时针才行,接下来还要研究一下为什么顺时针不行;
顶点坐标需要是整数;
该程序也是调用了glut工具包,请参考之前的博文关于glut的使用。
本文出自 “胡一刀” 博客,谢绝转载!