扫描线填充多边形算法详解与代码

本文详细介绍了扫描线填充多边形的算法,包括处理特殊情况,如边的重合和顶点交点,以及使用随机快速排序对交点数组进行排序。同时,讨论了如何通过DDA算法减少计算量,以提高效率。最终,扫描线填充算法相比于四邻域种子填充算法有显著的性能提升。
摘要由CSDN通过智能技术生成

扫描线填充多边形算法详解与代码

首先给出已知信息:多边形结构体里面包含三个信息:顶点个数,顶点和颜色

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(
评论 69
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值