扫描线填充多边形算法详解与代码
首先给出已知信息:多边形结构体里面包含三个信息:顶点个数,顶点和颜色
class MyPolygon
{
public:
int m_VerticeNumber;
CPoint m_Vertex[50];
COLORREF m_LineColor;
}
思路:
找到多边形的最小y值和最大y值,然后用这个范围内的每一条水平线与多边形相交,通过得到的交点画线段,由此填充整个多边形。
具体通过交点画线段:
1.对存储交点的数组进行排序(从小到大)
2.数组中数据两两一对,填充每对交点间的线段
这样分析下来我们所要做的只有两件事,一是求出扫描线与多边形边的交点,二是对交点数组进行排序。
接下来开始一个一个分析:对于求扫描线与多边形的交点,需要考虑到以下几个特殊情况:
1.扫描线与边重合
2.扫描线与边的交点为顶点
具体情况具体分析咯:
对于扫描线与边重合,只需要判断该边的两个顶点的y值是不是一样的,是一样的表示该边水平,因此可以直接重画这条线。否则继续之后的判断。
对于扫描线与顶点重合,大家看上面的图,我画了两种情况,一种是局部极值的顶点,一种不是局部极值的顶点,这两种顶点交点的记录方法还不一样。如果交点是顶点,且为局部极值,这个交点要被连续记录两次;如果交点是顶点,且不是局部极值,这个交点只需要被记录一次。大家可以看图想想,当交点是局部极值顶点是,所要描绘的线段就是该交点,所以记录两次;当交点是顶点,不是局部极值,所要描绘的是该顶点交点到下一个交点这一条线段,所以只能记录一次。
判断一个顶点是否为局部极值,可以通过与顶点关联的两条边的另外两个顶点来判断,通过判断它们是不是在顶点交点的同一侧来得出顶点的极值性:
排序算法:随机快速排序
下面贴上代码:
int getMiny(MyPolygon ThePolygon)
{
int min = ThePolygon.m_Vertex[0].y;
for(int i = 1;i<ThePolygon.m_VerticeNumber;i++)
if(min>ThePolygon.m_Vertex[i].y)
min = ThePolygon.m_Vertex[i].y;
return min;
}
int getMaxy(MyPolygon ThePolygon)
{
int max = ThePolygon.m_Vertex[0].y;
for(