计算机图形学常用算法实现6 区域填充算法-非递归形式(扫描线优化)

运行环境winform
这个算法基本上是书上的思路,没有很大的变动,感觉代码写的很秀,很有水平。
不断把所有待填充的区间添加到stack,然后一个个填充,效率比之前写的都要高一些。
主要代码如下(多边形的构建,map函数的初始化等需要自行添加):

void ScanLineFill4(int x,int y)
{
    int xl, xr, i;
    bool spanNeedFill;
    Point pt = new Point ();
    Stack<Point> s = new Stack<Point> ();
    pt.X = x;
    pt.Y = y;
    s.Push(pt);
    while (s.Count != 0)
    {
        pt = s.Pop();
        y = pt.Y;
        x = pt.X;
        //向右填充
        while (map[x, y] == false)
        {
            g.FillRectangle(p, new RectangleF(x, y, 1, 1));
            map[x, y] = true;
            x++;
        }
        xr = x - 1;
        x = pt.X - 1;
        //向左填充
        while (map[x, y] == false)
        {
            g.FillRectangle(p, new RectangleF(x, y, 1, 1));
            map[x, y] = true;
            x--;
        }
        //处理上面一条扫描线
        xl = x + 1;
        x = xl;
        y = y + 1;
        while (x <= xr)
        {
            spanNeedFill = false;
            while (map[x, y] == false)
            {
                spanNeedFill = true;
                x++;
            }
            if (spanNeedFill)
            {
                pt.X = x - 1;
                pt.Y = y;
                s.Push(pt);
                spanNeedFill = false;
            }
            while (map[x, y] && x <= xr)
                x++;
        }
        //处理下面一条扫描线
        x = xl;
        y = y - 2;
        while (x <= xr)
        {
            spanNeedFill = false;
            while (map[x, y] == false)
            {
                spanNeedFill = true;
                x++;
            }
            if (spanNeedFill)
            {
                pt.X = x - 1;
                pt.Y = y;
                s.Push(pt);
                spanNeedFill = false;
            }
            while (map[x, y] && x <= xr)
                x++;
        }
    }

}	

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43813453/article/details/84582933
今日推荐