1. 程式人生 > >計算機圖形學常用演算法實現6 區域填充演算法-非遞迴形式(掃描線優化)

計算機圖形學常用演算法實現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++;
        }
    }

}	

在這裡插入圖片描述