Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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_Multidimensional Array_Cells - Fatal编程技术网

Javascript 检查节点的对角邻居

Javascript 检查节点的对角邻居,javascript,algorithm,multidimensional-array,cells,Javascript,Algorithm,Multidimensional Array,Cells,我试图比较一个节点的值。使用洪水填充算法,我能够垂直和水平地检查网格中的每个节点。现在我必须更新代码以检查对角线上的单元格,如下图所示: 红色表示当前节点,黄色表示需要检查的单元格 以下是我到目前为止的一个片段: var mapWidth = Math.sqrt(mapData.length); var currentCell = $('[data-x="'+ x +'"][data-y="'+ y +'"]'); if (x < 0 || y < 0 || x > mapW

我试图比较一个节点的值。使用洪水填充算法,我能够垂直和水平地检查网格中的每个节点。现在我必须更新代码以检查对角线上的单元格,如下图所示:

红色表示当前节点,黄色表示需要检查的单元格

以下是我到目前为止的一个片段:

var mapWidth = Math.sqrt(mapData.length);
var currentCell = $('[data-x="'+ x +'"][data-y="'+ y +'"]');
if (x < 0 || y < 0 || x > mapWidth || y > mapWidth) {
    return;
}
if(mapData[x*mapWidth+y] !== 0 || currentCell.hasClass('cell-grey')) {
    if(mapData[x*mapWidth+y] > 0) {
        currentCell.addClass('cell-grey').css('opacity', '1');
    }
    if(mapData[(x-1)*mapWidth+(y-1)] > 0 && mapData[(x-1)*mapWidth+(y-1)] < mapWidth) {
        currentCell.addClass('cell-grey').css('opacity', '1');
        return;
    }
    if(mapData[(x-1)*mapWidth+(y+1)] > 0 && mapData[(x-1)*mapWidth+(y+1)] < mapWidth) {
        currentCell.addClass('cell-grey').css('opacity', '1');
        return;
    }
    if(mapData[(x+1)*mapWidth+(y-1)] > 0 && mapData[(x+1)*mapWidth+(y-1)] < mapWidth) {
        currentCell.addClass('cell-grey').css('opacity', '1');
        return;
    }
    if(mapData[(x+1)*mapWidth+(y+1)] > 0 && mapData[(x+1)*mapWidth+(y+1)] < mapWidth) {
        currentCell.addClass('cell-grey').css('opacity', '1');
        return;
    }
    return true;
}
var mapWidth=Math.sqrt(mapData.length);
var currentCell=$('[data-x=“'+x+']”][data-y=“'+y+']”);
如果(x<0 | | y<0 | | x>mapWidth | | y>mapWidth){
返回;
}
if(mapData[x*mapWidth+y]!==0 | | currentCell.hasClass('cell-grey')){
如果(mapData[x*mapWidth+y]>0){
currentCell.addClass('cell-grey').css('opacity','1');
}
如果(mapData[(x-1)*mapWidth+(y-1)]>0和&mapData[(x-1)*mapWidth+(y-1)]0和&mapData[(x-1)*mapWidth+(y+1)]0和&mapData[(x+1)*mapWidth+(y-1)]0和&mapData[(x+1)*mapWidth+(y+1)]

mapWidth
是包含网格中所有单元格的变量,
currentCell
是当前节点单元格。这段代码对我来说不是很有用。

当您计算
mapData[(x-1)*mapWidth+(y-1)]
时,
x-1
y-1
的值可能会导致越界引用,该引用返回
未定义的
。在访问阵列之前,必须验证单元坐标

您可以像这样迭代四个对角邻居:

for (var neighborX = x - 1; neighborX <= x + 1; neighborX += 2) { 
    if (neighborX < 0 || neighborX >= mapWidth) { 
        continue;
    }
    for (var neighborY = y - 1; neighborY <= y + 1; neighborY += 2) { 
        if (neighborY < 0 || neighborY >= mapWidth) { 
            continue;
        } 
        currentCell.addClass('cell-grey').css('opacity', '1');
    } 
}
有效索引的范围从
0
mapWidth-1
,因此您应该编写:

if (x < 0 || y < 0 || x >= mapWidth || y >= mapWidth) {
if(x<0 | | y<0 | | x>=mapWidth | | y>=mapWidth){

谢谢@MichaelLaszlo,我理解这个迭代,但是你能解释一下为什么
neighborX
neighborY
应该小于零吗?它们不应该小于零。因此
continue
语句跳过了循环体的其余部分。如果你有用于横向移动的代码,那么就没有意义了在最小更新后,它对对角线不起作用。我们能看到其他代码吗?“不起作用”没有提供信息。你能说得更多吗?不起作用,我的意思是对角线邻居没有被检查
if (x < 0 || y < 0 || x >= mapWidth || y >= mapWidth) {