运行环境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--;
}
//处理上面一条