Прежде всего - я знаю, что я здесь очень плотный.
После этого я пытаюсь написать реализацию этого алгоритма на 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)))
Я взял это из этого огромного ресурса.
Моя проблема в том, что каждая реализация этого, которую я пробовал до сих пор, имела безумные результаты. Например, приведенный ниже код в настоящее время приводит к следующему:
и это:
Мой код в настоящее время выглядит так:
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: как указано ниже, у меня был неправильный цикл for..each и я не использовал дельты для разработки. Спасибо за помощь!
В настоящее время у меня есть проблема, как показано ниже с реализацией из ответов:
Я собираюсь продолжить расследование - если я выясню это, я опубликую полные результаты здесь. Спасибо всем!
источник
Ответы:
Таким образом, при дальнейшей проверке ваша проблема на самом деле не имеет ничего общего с преобразованиями системы координат. Это можно было бы сделать более понятным, не называя ваши осевые координаты X и Y, а скорее Q и R. Проблема, которую вы на самом деле имеете, это плохие условия цикла. Исходный пример кода выдает дельта q и r, которые вы пытаетесь преобразовать в своих циклах for в абсолютные координаты, и вы допустили ошибку. Вместо этого алгоритм должен выглядеть следующим образом:
источник
Как отметил Vector57 , проблема в том, что вы используете неправильную систему координат . Описанный алгоритм предназначен для использования с координатами куба , которые имеют компоненты x, y и z :
Это может быть неочевидно из псевдокода алгоритма, но это потому, что это упрощение этого :
... простой вложенный цикл по x, y и z, что вы ожидаете от алгоритма диапазона.
Я не знаю, какую систему координат вы используете, но я предполагаю, что это одна из систем "смещения координат", которые популярны, потому что их легко реализовать, поместив ячейки сетки в двумерный массив:
Это не значит, что вы не можете использовать эти алгоритмы куба; это просто означает, что вам нужно преобразовать координаты куба в свои . Например, чтобы преобразовать в / из вертикального расположения "odd-q", используйте эти:
источник
q = x
иr = y
системный?