Сетка - Получить все окружающие ячейки, используя указанный размер области - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть простая двумерная сетка, я хочу иметь возможность получить все окружающие ячейки определенной c ячейки, учитывая размер области. В настоящее время мой код только успешно обрабатывает непосредственно смежные ячейки и возвращает эту область 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

Я явно хочу, чтобы все ячейки в изображение выше должно быть возвращено, но, поскольку я просто умножаю свои направления, некоторые ячейки не будут учтены, как я могу убедиться, что все ячейки в области возвращены?

1 Ответ

1 голос
/ 19 апреля 2020

Вы можете создать обобщенный метод c, который будет начинать поиск row, column и distance.

Вот слегка измененная версия чего-то, что я использовал в Прошлое.

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;
}

Вам нужно будет отредактировать его для своих нужд, но оно дает вам представление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...