計算機圖形學常用演算法實現6 區域填充演算法-非遞迴形式(掃描線優化)
阿新 • • 發佈:2019-01-01
執行環境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++; } } }