В настоящее время я работаю над проектом, в котором есть сетка с ячейками. Каждая ячейка имеет возможность запрашивать соседние ячейки с функцией, которая принимает относительную координату «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...
Теперь, самое лучшее, что я придумал до сих пор этот императив кошмар:
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);
}
Я мог бы сделать этот метод немного более динамичным с некоторыми для петель, вероятно, за счет уменьшения читаемости. Но не существует ли какой-то алгоритм, который точно решает эту проблему? Я работаю на C#, но я открыт для независимого от языка совета!
Нет необходимости в обнаружении границ/границ; это уже покрыто. Я просто заинтересован в сборе относительных «X'- и« Y-координат »!
Конечно, есть. Посмотрите, что вы нарисовали. Это простая функция расстояния в фиксированной сетке. Вы можете легко закодировать его с помощью пары вложенных циклов. – Darek