枚举网格上“菱形”形状的相邻单元格

本文关键字:单元格 网格 菱形 枚举 | 更新日期: 2023-09-27 18:37:22

我目前正在做一个项目,该项目具有带有单元格的网格。每个单元格都能够使用接受相对"x"和"y"坐标的函数查询其相邻单元格。这工作正常,但现在我想查询一组相邻的单元格,当它们组合在一起时,形成一个菱形,如下所示:

* * * * * * * * ** * * * 0 * * * ** * * 0 0 0 * * ** * 0 0 0 0 0 * ** 0 0 0 C 0 0 0 ** * 0 0 0 0 0 * ** * * 0 0 0 * * ** * * * 0 * * * ** * * * * * * * *"C"是应该调用查询的单元格...

现在,到目前为止,我想出的最好的事情就是这个势在必行的噩梦:

private IEnumerable<Cell> GetRhombusNeighours()
{
    yield return _getRelativeCell(-3, 0);
    yield return _getRelativeCell(-2, 1);
    yield return _getRelativeCell(-2, 0);
    yield return _getRelativeCell(-2, -1);
    yield return _getRelativeCell(-1, -2);
    yield return _getRelativeCell(-1, -1);
    yield return _getRelativeCell(-1, 0);
    yield return _getRelativeCell(-1, 1);
    yield return _getRelativeCell(-1, 2);
    yield return _getRelativeCell(0, -3);
    yield return _getRelativeCell(0, -2);
    yield return _getRelativeCell(0, -1);
    yield return _getRelativeCell(0, 0);
    yield return _getRelativeCell(0, 1);
    yield return _getRelativeCell(0, 2);
    yield return _getRelativeCell(0, 3);
    yield return _getRelativeCell(1, -2);
    yield return _getRelativeCell(1, -1);
    yield return _getRelativeCell(1, 0);
    yield return _getRelativeCell(1, 1);
    yield return _getRelativeCell(1, 2);
    yield return _getRelativeCell(2, 1);
    yield return _getRelativeCell(2, 0);
    yield return _getRelativeCell(2, -1);
    yield return _getRelativeCell(3, 0);
}

我可以通过一些 for 循环使这种方法更加动态,这可能是以降低可读性为代价的。但是,难道没有某种算法可以准确地解决这个问题吗?我正在使用 C#,但我愿意接受独立于语言的建议!

不需要边缘/边界检测;这已经涵盖了。我纯粹对收集相对的"X"和"Y"坐标感兴趣!

枚举网格上“菱形”形状的相邻单元格

您可以遍历整个 X/Y 方块,并确定它们是否在每个 X/Y 对的菱形内:

for(int y = -3; y <= 3; y++)
{
    for(int x = -3; x <= 3; x++)
    {
        if(Math.Abs(x) + Math.Abs(y) <= 3)
        {
            yield return _getRelativeCell(x, y);
        }
     }
 }

这没有经过测试,但你应该明白这个想法。

为了使它更加自我记录,您还可以将 if() 移动到方法中,例如:

bool IsInRhombus(int x, int y)
{
    return Math.Abs(x) + Math.Abs(y) <= 3;
}