Поиск клеток в радиусе действия по шестиугольной сетке

Сначала - я знаю, что я здесь супер-плотный.

С этой точки зрения я пытаюсь написать реализацию C # этого алгоритма:

var results = []
for each -N ≤ dx ≤ N:
  for each max(-N, -dx-N) ≤ dy ≤ min(N, -dx+N):
    var dz = -dx-dy
    results.append(cube_add(center, Cube(dx, dy, dz)))

Я взял это из этого огромного ресурса.

Моя проблема в том, что каждая реализация этого, к которой я до сих пор пыталась, имела безумные результаты. Например, приведенный ниже код показывает следующее:

 1

и это:

 2

В настоящее время мой код выглядит следующим образом:

for (int x = this.CellPositionX - distance; x <= this.CellPositionX + distance; x++)
    {
        for (int y = this.CellPositionY - Math.Max(-distance, -x - distance); y <= this.CellPositionY + Math.Min(distance, -x + distance); y++)
        {
            HexPosition rangePosition = new HexPosition(x, y);
            range.Add(rangePosition);
        }
    }

Может ли кто-нибудь увидеть что-то здесь? Все предложения приветствуются. Я уже стучал головой об этом сейчас.

Спасибо!

Обновление примечание: я использую осевые координаты в сетке. Обновление № 2: как указано ниже, у меня был мой неправильный цикл ..., и он не использовал дельта для разработки. Спасибо за помощь!

В настоящее время у меня проблема, как показано ниже, с реализацией из ответов:  введите описание изображения здесь>> </a> </p>

<p> Я собираюсь продолжить расследование - если я это выясню, я опубликую полные результаты здесь. Спасибо всем! </p></body></html>

9 голосов | спросил Askanison4 3 FebruaryEurope/MoscowbWed, 03 Feb 2016 01:42:20 +0300000000amWed, 03 Feb 2016 01:42:20 +030016 2016, 01:42:20

2 ответа


4

Таким образом, при дальнейшей проверке ваша проблема фактически не имеет ничего общего с преобразованием системы координат. Это можно было бы сделать более понятным, не назвав ваши осевые координаты X и Y, а скорее Q и R. Проблема, с которой вы на самом деле сталкиваетесь, - это плохие условия цикла. Исходный образец кода создает дельта q и r, которые вы пытаетесь преобразовать в своих циклах в абсолютные координаты, и вы сделали ошибку. Алгоритм должен выглядеть следующим образом:

for (int dx = -distance; dx <= distance; dx++)
{
    for (int dy = Math.Max(-distance, -dx - distance); dy <= Math.Min(distance, -dx + distance); dy++)
    {
        HexPosition rangePosition = new HexPosition(
            this.CellPositionX + dx, this.CellPositionY + dy);
        range.Add(rangePosition);
    }
}
ответил Alex Sherman 3 FebruaryEurope/MoscowbWed, 03 Feb 2016 21:55:35 +0300000000pmWed, 03 Feb 2016 21:55:35 +030016 2016, 21:55:35
7

Как отметил Vector57 , проблема в том, что вы используете неправильная система координат . Описанный алгоритм предназначен для использования с координатами куба , которые имеют x, y и z компоненты :

 координаты куба

Это может быть не очевидно из псевдокода алгоритма, но это потому, что это упрощение этого :

var results = []
for each -N ≤ dx ≤ N:
    for each -N ≤ dy ≤ N:
        for each -N ≤ dz ≤ N:
            if dx + dy + dz = 0:
                results.append(cube_add(center, Cube(dx, dy, dz)))

... простой вложенный цикл над x, y и z, что вы ожидаете от алгоритма диапазона.

Я не знаю, какую систему координат вы используете, но я предполагаю, что это одна из систем «смещенной координаты», которые популярны, потому что их легко реализовать, поместив ячейки сетки в 2D-массив:

 смещение q вертикальных макетов

Это не означает, что вы не можете использовать эти алгоритмы куба; это просто означает, что вам нужно конвертировать из координат куба в свой собственный . Например, чтобы преобразовать в /из вертикального макета «нечетный-q», используйте следующие команды:

# convert cube to odd-q offset
col = x
row = z + (x - (x&1)) / 2

# convert odd-q offset to cube
x = col
z = row - (col - (col&1)) / 2
y = -x-z
ответил congusbongus 3 FebruaryEurope/MoscowbWed, 03 Feb 2016 06:14:30 +0300000000amWed, 03 Feb 2016 06:14:30 +030016 2016, 06:14:30

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132