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) {