我正在尝试实现一种类似于洪水填充的算法。问题是我不确定我应该以什么方式实现它,例如递归 - 非递归。
我知道每个都有其缺陷,但其中一个必须比另一个更快。当非递归每次分配 4 个新点时,递归在堆栈上打开新函数。
非迭代示例:
Stack<Point> stack = new Stack<Point>();
stack.Push(q);
while (stack.Count > 0)
{
Point p = stack.Pop();
int x = p.X;
int y = p.Y;
if (y < 0 || y > h - 1 || x < 0 || x > w - 1)
continue;
byte val = vals[y, x];
if (val == SEED_COLOR)
{
vals[y, x] = COLOR;
stack.Push(new Point(x + 1, y));
stack.Push(new Point(x - 1, y));
stack.Push(new Point(x, y + 1));
stack.Push(new Point(x, y - 1));
}
}
编辑:我将在 600X600 像素的地图上应用以下算法。虽然洪水填充不会应用于整个地图,但每次迭代它应该覆盖大约 30% - 80% 的地图。我的意思是在高度图中发现边缘并标记这些边缘以供进一步使用。