C# 枚举'中的相邻单元格;菱形'-网格上的形状

C# 枚举'中的相邻单元格;菱形'-网格上的形状,c#,algorithm,grid-layout,array-algorithms,C#,Algorithm,Grid Layout,Array Algorithms,我目前正在做一个项目,它的特点是网格和单元格。每个单元格都可以使用接受相对“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 * * * * * * * *

我目前正在做一个项目,它的特点是网格和单元格。每个单元格都可以使用接受相对“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' is the cell on which the query is supposedly called... * * * * * * * * * * * * * 0 * * * * * * * 0 0 0 * * * * * 0 0 0 0 0 * * *0 0 0 0 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);
}
private IEnumerable getrhombsneighours()
{
收益率收益率_getRelativeCell(-3,0);
收益率收益率_getRelativeCell(-2,1);
收益率收益率_getRelativeCell(-2,0);
收益率收益率_getRelativeCell(-2,-1);
收益率收益率_getRelativeCell(-1,-2);
收益率收益率_getRelativeCell(-1,-1);
收益率收益率_getRelativeCell(-1,0);
收益率收益率_getRelativeCell(-1,1);
收益率收益率_getRelativeCell(-1,2);
收益率收益率(0,-3);
收益率收益率(0,-2);
收益率收益率(0,-1);
收益率收益率(0,0);
收益率收益率(0,1);
收益率收益率(0,2);
收益率收益率(0,3);
收益率收益率(1,-2);
收益率收益率(1,-1);
收益率收益率(1,0);
收益率收益率(1,1);
收益率收益率(1,2);
收益率收益率(2,1);
收益率收益率(2,0);
收益率收益率(2,-1);
收益率收益率(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);
        }
     }
 }

for(int y=-3;y)当然有。看看你画的东西。这是一个固定网格中的简单距离函数。你可以很容易地用几个嵌套的for循环来编码。我试了一下:-当然,似乎可以做到这一点!整洁干净。谢谢!
bool IsInRhombus(int x, int y)
{
    return Math.Abs(x) + Math.Abs(y) <= 3;
}