Перечислите соседние ячейки в форме ромба на сетке

1

В настоящее время я работаю над проектом, в котором есть сетка с ячейками. Каждая ячейка имеет возможность запрашивать соседние ячейки с функцией, которая принимает относительные "х" и "у" -coordinate. Это прекрасно работает, но теперь я хочу запросить набор соседних ячеек, которые при объединении образуют ромб, например:

* * * * * * * * *
* * * * 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...

Теперь самое лучшее, что я придумал до сих пор, - это настоятельный кошмар:

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

Я мог бы сделать этот метод немного более динамичным с некоторыми для циклов, вероятно, за счет уменьшения удобочитаемости. Но не существует ли какой-то алгоритм, который точно решает эту проблему? Я работаю на С#, но я открыт для независимого от языка совета!

Нет необходимости в обнаружении границ/границ; которые уже покрыты. Я просто заинтересован в сборе родственников "X'- и" Y "-coordinate s!

  • 2
    Конечно, есть. Просто посмотрите на то, что вы нарисовали. Это простая функция расстояния в фиксированной сетке. Вы можете легко закодировать его с помощью пары вложенных циклов.
Теги:
algorithm
grid-layout
array-algorithms

1 ответ

1
Лучший ответ

Вы можете перебрать весь квадрат 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;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню