菱形方算法似乎从数组的相反边缘取值

时间:2015-10-31 21:58:01

标签: javascript algorithm debugging

我使用菱形算法制作了一张地图。它可以工作,但是地图顶部的区域似乎只使用了地图另一侧的值。我不知道造成这种情况的原因,并希望找到帮助。

这是问题的图像: The Problem

这是相关代码,但我不知道问题出在哪里。

p = [
    [y[0] + c, y[1]],
    [y[0] - c, y[1]],
    [y[0], y[1] + c],
    [y[0], y[1] - c]
];

for (var m = 0; m < 4; m++) {
    //Calculate Current Suare
    var t = [];
    // Add only those points to t that do not cross the edge in 
    // the direction in which they move away from p[m]:
    if (p[m][0] + c <= s) {
        t.push([p[m][0] + c, p[m][1]]);
    }
    if (p[m][0] - c >= 0) {
        t.push([p[m][0] - c, p[m][1]]);
    }
    if (p[m][1] + c <= s) {
        t.push([p[m][0], p[m][1] + c]);
    }
    if (p[m][1] - c >= 0) {
        t.push([p[m][0], p[m][1] - c]);
    }
    var z = [
        p[m],
        y
    ];
    //Check for edge
    if ((p[m][0] === 0 || p[m][0] == s) || (p[m][1] === 0 || p[m][1] == s)) {
        for (var k = 0; k < t.length; k++) {
            if ((t[k][0] < 0 || t[k][0] > s) || (t[k][1] < 0 || t[k][1] > s)) {
                t.splice(k, 1);
                break;
            }
        }
    }
    //Set values
    ar[p[m][0]][p[m][1]] = (t.map(function (e) {
        return ar[e[0]][e[1]];
    }).reduce(function (a, b) {
        return a + b;
    }) / t.length) + rand(n);
}

这是完整代码的小提琴: http://jsfiddle.net/Shamadruu/7zutLnfL/18/

1 个答案:

答案 0 :(得分:0)

问题出在for(var k循环:你停止寻找一次跨边缘条件 你找到了一个(你break),但可能有两个。 虽然您可以通过删除break并添加k--;来解决此问题,但还有更多 处理边缘的有效方法:在将点添加到t之前进行测试是否存在 在边缘之内。使用这些特定点意味着您只需要测试它们 每一个边缘,这是4倍的节省!

var t = [];
// Add only those points to t that do not cross the edge in 
// the direction in which they move away from p[m]:
if (p[m][0] + c <= s) {
    t.push([p[m][0] + c, p[m][1]]);
}
if ([p[m][0] - c >= 0) {
    t.push([p[m][0] - c, p[m][1]]);
}
if (p[m][1] + c <= s) {
    t.push([p[m][0], p[m][1] + c]);
}
if (p[m][1] - c >= 0) {
    t.push([p[m][0], p[m][1] - c]);
}
var z = [
    p[m],
    y,
];
//Set values ...etc.

同样,您必须检查z中包含的方块,以确保它们不会越过边缘:

//Find New Square
switch (m) {
    case 0:
        if (p[m][0] - c >= 0 && p[m][1] + c <= s) {
            z.push([p[m][0] - c, p[m][1] + c], [p[m][0], p[m][1] + c]);
        }
        break;
// ... etc.