检查节点的对角邻居
Check the diagonal neighbors of a node
我正在尝试比较节点的值。使用 flood-fill 算法,我能够垂直和水平检查网格的每个节点。现在我必须更新我的代码以检查位于对角线上的单元格,如下图所示:
红色是当前节点,黄色是需要检查的单元格。
这是我目前所拥有的片段:
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;
}
mapWidth
是包含网格所有单元格的变量,currentCell
是当前节点单元格。这段代码对我来说并不是真的有用。
计算mapData[(x-1)*mapWidth+(y-1)]
时,x-1
和y-1
的值可能会导致引用越界,即returnsundefined
。您必须在访问数组之前验证单元格坐标。
您可以像这样迭代四个对角邻居:
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');
}
}
我不确定您要完成什么,但看起来您的代码中还有其他错误。例如,您可能不希望在将单元格变为灰色后立即 return
。如果您希望每个对角线邻居都变成灰色,上面的循环应该可以解决问题。
代码开头附近的这一行包含一个细微错误:
if (x < 0 || y < 0 || x > mapWidth || y > mapWidth) {
有效索引范围从 0
到 mapWidth - 1
,所以你应该写:
if (x < 0 || y < 0 || x >= mapWidth || y >= mapWidth) {
我正在尝试比较节点的值。使用 flood-fill 算法,我能够垂直和水平检查网格的每个节点。现在我必须更新我的代码以检查位于对角线上的单元格,如下图所示:
红色是当前节点,黄色是需要检查的单元格。
这是我目前所拥有的片段:
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;
}
mapWidth
是包含网格所有单元格的变量,currentCell
是当前节点单元格。这段代码对我来说并不是真的有用。
计算mapData[(x-1)*mapWidth+(y-1)]
时,x-1
和y-1
的值可能会导致引用越界,即returnsundefined
。您必须在访问数组之前验证单元格坐标。
您可以像这样迭代四个对角邻居:
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');
}
}
我不确定您要完成什么,但看起来您的代码中还有其他错误。例如,您可能不希望在将单元格变为灰色后立即 return
。如果您希望每个对角线邻居都变成灰色,上面的循环应该可以解决问题。
代码开头附近的这一行包含一个细微错误:
if (x < 0 || y < 0 || x > mapWidth || y > mapWidth) {
有效索引范围从 0
到 mapWidth - 1
,所以你应该写:
if (x < 0 || y < 0 || x >= mapWidth || y >= mapWidth) {