Grid-使用指定的区域大小获取所有周围的单元格

问题描述 投票:0回答:1

我有一个简单的2d网格,我希望能够得到给定面积的特定单元格的所有周围单元格。当前,我的代码仅成功处理直接相邻的单元并返回3x3的区域,如果尝试更大的区域,则会遇到问题:

public static class DIRECTION
{
    public static Coord NORTH = new Coord(0, 1);
    public static Coord SOUTH = new Coord(0, -1);
    public static Coord EAST = new Coord(1, 0);
    public static Coord WEST = new Coord(-1, 0);

    public static Coord NORTHEAST = new Coord(1, 1);
    public static Coord NORTHWEST = new Coord(-1, 1);
    public static Coord SOUTHEAST = new Coord(1, -1);
    public static Coord SOUTHWEST = new Coord(-1, -1);
}

public List<Cell> GetSurroundingCells(Coord current, GridLayer layer, int areaSize)
    {
        bool IsSurrounding(Coord coord, Coord dir)
        {
            for (int i = 1; i <= areaSize; i++)
            {
                if (coord.Equals(current.Add(new Coord(dir.x * i, dir.z * i))))
                    return true;
            }
            return false;
        }

        List<Cell> cells = new List<Cell>();

        for (int x = 0; x < GetWidth(); x++)
        {
            for (int z = 0; z < GetHeight(); z++)
            {
                Coord coord = new Coord(x, z);

                if (IsSurrounding(coord, DIRECTION.NORTH) ||
                    IsSurrounding(coord, DIRECTION.SOUTH) ||
                    IsSurrounding(coord, DIRECTION.EAST) ||
                    IsSurrounding(coord, DIRECTION.WEST) ||
                    IsSurrounding(coord, DIRECTION.NORTHEAST) ||
                    IsSurrounding(coord, DIRECTION.NORTHWEST) ||
                    IsSurrounding(coord, DIRECTION.SOUTHEAST) ||
                    IsSurrounding(coord, DIRECTION.SOUTHWEST))
                    cells.Add(GetCell(coord, layer));
            }
        }

        return cells;
    }

您可以看到我已经尝试管理区域大小,但是可以说我给我的函数设置的areaSize为2,它将返回以下区域:

enter image description here

我显然希望返回上图中的所有单元格,但是由于我只是乘以我的方向,所以将不考虑某些单元格,我如何确保返回该区域中的所有单元格?

c#
1个回答
0
投票

您可以创建一个以rowcolumndistance开头的通用方法。

这里是我过去使用过的内容的略微修改版本。

public static List<Cell> SurroundingCellss(int startRow, int startColumn, int distance)
{
    List<Cell> matches = new List<Cell>();

    for (int searchRow = startRow - distance; searchRow <= startRow + distance; searchRow++)
    {
        for (int searchCol = startColumn - distance; searchCol <= startColumn + distance; searchCol++)
        {
            if (cells[searchRow, searchCol] != null)
            {
                //do logic and if ok add to return list
                matches.Add(cells[searchRow, searchCol]);
            }
        }
    }
    return matches;
}

您将根据需要对其进行编辑,但是会给您一个想法。

© www.soinside.com 2019 - 2024. All rights reserved.