我使用菱形算法制作了一张地图。它可以工作,但是地图顶部的区域似乎只使用了地图另一侧的值。我不知道造成这种情况的原因,并希望找到帮助。
这是相关代码,但我不知道问题出在哪里。
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/
答案 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.