高度图调整算法的麻烦

时间:2015-05-14 16:50:34

标签: algorithm javascript

我有一个整数的2D网格。用户可以选择任何位置并将其数量增加或减少一个。该算法应调整所有八个相邻位置,以使它们之间的差异不超过一个。

我大部分时间都在工作,但是必须有一个边缘情况,因为在做了一些调整后,其中一个位置可能会变得不稳定(远远超过一个)。

这是网格一旦变得不稳定的截图。 Wonky Grid

javascript,所以这是

var moveDown = function (x, y) {
    var updated = false;
    if (x-1 >= 0 && Math.abs(grid[x][y] - grid[x-1][y]) > 1) {
        grid[x-1][y] -= 1;
        updated = true;
    }
    if (x+1 < size && Math.abs(grid[x][y] - grid[x+1][y]) > 1) {
        grid[x+1][y] -= 1;
        updated = true;
    }
    if (y-1 >= 0 && Math.abs(grid[x][y] - grid[x][y-1]) > 1) {
        grid[x][y-1] -= 1;
        updated = true;
    }
    if (y+1 < size && Math.abs(grid[x][y] - grid[x][y+1]) > 1) {
        grid[x][y+1] -= 1;
        updated = true;
    }
    if (x-1 >= 0 && y-1 >= 0 && Math.abs(grid[x][y] - grid[x-1][y-1]) > 1) {
        grid[x-1][y-1] -= 1;
        updated = true;
    }
    if (x-1 >= 0 && y+1 < size && Math.abs(grid[x][y] - grid[x-1][y+1]) > 1) {
        grid[x-1][y+1] -= 1;
        updated = true;
    }
    if (x+1 < size && y-1 >= 0 && Math.abs(grid[x][y] - grid[x+1][y-1]) > 1) {
        grid[x+1][y-1] -= 1;
        updated = true;
    }
    if (x+1 < size && y+1 < size && Math.abs(grid[x][y] - grid[x+1][y+1]) > 1) {
        grid[x+1][y+1] -= 1;
        updated = true;
    }

    if (updated) {
        if (x-1 >= 0) { moveDown(x-1, y); }
        if (x+1 < size) { moveDown(x+1, y); }
        if (y-1 >= 0) { moveDown(x, y-1); }
        if (y+1 < size) { moveDown(x, y+1); }
        if (x-1 >= 0 && y-1 >= 0) { moveDown(x-1, y-1); }
        if (x-1 >= 0 && y+1 < size) { moveDown(x-1, y+1); }
        if (x+1 < size && y-1 >= 0) { moveDown(x+1, y-1); }
        if (x+1 < size && y+1 < size) { moveDown(x+1, y+1); }
    }
}

我有一个小提琴here,我一直用它来玩。

如何解决问题以使其正常工作?

1 个答案:

答案 0 :(得分:0)

正如评论中指出的那样,你的代码是递归的,在某些情况下它会遇到无限递归。

当触发无限递归时,结果取决于正在使用的Javascript引擎。在某些版本中,错误消息“未捕获的RangeError:超出最大调用堆栈大小”将出现在错误控制台中。 (对于Chrome来说就是这种情况。)其他Javascript引擎可能会以不同的方式处理它,并且可能采用不那么好的方式。

仅当Javascript引擎中断执行并仍然刷新页面呈现(不进一步执行代码)时,才会显示异常数值。

您可以使用for循环实现原始想法,而不使用递归。

您可以从Morphological Image Processing获得一些想法。