2015-01-12 2 views
1

В настоящее время я работаю над проектом, в котором есть сетка с ячейками. Каждая ячейка имеет возможность запрашивать соседние ячейки с функцией, которая принимает относительную координату «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-координат »!

+2

Конечно, есть. Посмотрите, что вы нарисовали. Это простая функция расстояния в фиксированной сетке. Вы можете легко закодировать его с помощью пары вложенных циклов. – Darek

ответ

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

Это не тестировалось, но вы должны получить идею.

Чтобы сделать его более самодокументирующееся вы также можете переместить, если() в метод, скажет:

bool IsInRhombus(int x, int y) 
{ 
    return Math.Abs(x) + Math.Abs(y) <= 3; 
} 
+0

Я дал ему снимок с: https://dotnetfiddle.net/q6W3R2 - Конечно, похоже, это трюк! Аккуратный и чистый. Благодаря! –