Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 菱形平方算法似乎是从数组的对边取值_Javascript_Algorithm_Debugging - Fatal编程技术网

Javascript 菱形平方算法似乎是从数组的对边取值

Javascript 菱形平方算法似乎是从数组的对边取值,javascript,algorithm,debugging,Javascript,Algorithm,Debugging,我用菱形正方形算法绘制了一张地图。这是可行的,但地图顶部的某些区域似乎使用了地图另一侧的值。我不知道是什么原因造成的,希望能有人帮我找到它 以下是问题的图像: 这是相关代码,但我不知道问题发生在哪里 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 Cur

我用菱形正方形算法绘制了一张地图。这是可行的,但地图顶部的某些区域似乎使用了地图另一侧的值。我不知道是什么原因造成的,希望能有人帮我找到它

以下是问题的图像:

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

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);
}
p=[
[y[0]+c,y[1]],
[y[0]-c,y[1]],
[y[0],y[1]+c],
[y[0],y[1]-c]
];
对于(var m=0;m<4;m++){
//计算当前金额
var t=[];
//仅向t添加不与中的边相交的点
//它们离开p[m]的方向:
如果(p[m][0]+c=0){
t、 推送([p[m][0]-c,p[m][1]]);
}
如果(p[m][1]+c=0){
t、 push([p[m][0],p[m][1]-c]);
}
变量z=[
p[m],
Y
];
//检查边缘
如果((p[m][0]==0 | | p[m][0]==s)| |(p[m][1]==0 | | p[m][1]==s)){
对于(var k=0;ks)|(t[k][1]<0 | t[k][1]>s)){
t、 拼接(k,1);
打破
}
}
}
//设定值
ar[p[m][0][p[m][1]=(t.map(函数(e)){
返回应收账款[e[0]][e[1]];
}).减少(功能a、b){
返回a+b;
})/t.长度)+兰特(n);
}
下面是完整代码的一部分:

问题出在(var k循环的
中:您停止查找交叉边条件一次
您已经找到一个(您
中断
),但可能有两个。
虽然您可以通过删除
中断
并添加
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.

我还没有完全了解您的算法,但我认为拼接可能是您的问题。您能在t.splice(k,1)之后添加一个k--吗然后再次运行代码?请确保在添加k--时删除断点。这是因为您无法确保只有一条边是交叉的。可能有两条边,因此您需要留在循环中搜索另一条边。但是k--很重要。添加k--并删除断点似乎没有任何效果。我只需要选中一个点位于边上方,因为计算它们的点位于边上,并且与任何其他边的距离必须至少为c。为了澄清,p[m]在通过该循环时是边上的一个点,与任何其他边的距离至少为c。t中的点是用于计算p[m]值的点。因为p[m]在边缘,必须有一个且只有一个点超过边缘。不幸的是,问题仍然存在。您提供的更改提供了函数,但无法解决问题。我添加了另一个可能需要更改的部分。我不知道算法,而且看起来相当复杂。实际上相当简单。以下是关于该算法的Wikipedia文章:.就我的代码而言,z不能偏离边缘,因为我已经设置好了,所以加减法不能超越边缘。如果程序试图使用偏离边缘的值,它将崩溃,因此它没有崩溃的事实表明不会发生这种情况。我遇到的问题可能不是因为它尝试了获取边缘上的值。我现在查看您的完整代码,但它不是干净的。在接收全局变量作为参数的函数中,您仍然引用全局变量而不是参数。例如,在draw()中,您同时使用em和ems。您是否试图欺骗自己?这段代码真的很难读懂!
//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.