Вычислить координату малого центра шестиугольника группы шестиугольника в сетке - PullRequest
1 голос
/ 23 апреля 2020

Я застрял в проблеме, которую кажется легко решить, но я не могу точно определить правильную формулу.

У меня есть список групп шестиугольников в системе координат куба. Я знаю координаты куба групп, но мне нужно вычислить «глобальную» координату маленького шестиугольника в данной группе.

Например, на изображении ниже я знаю координаты для GroupA (x=0, y=0, z=0) и GroupB (x=-1, y=1, z=0). Как я могу рассчитать координаты центральной плитки GroupB, учитывая, что каждая группа имеет одинаковый радиус (в данном случае радиус равен 1), и они не перекрывают друг друга (давайте рассмотрим это как мозаику групп, начиная с 0, 0,0, что создает шестнадцатеричную сетку)?

В этом простом примере я, как человек, знаю, что центральный фрагмент GroupB равен (x=-1, y=3, z=-2), но мне нужно кодировать эту логику c таким образом, что компьютер может рассчитать его для любой данной группы на карте. Мне не особо нужна помощь по самому коду, но по всему логике c.

В этой статье автор делает обратное (переходя от маленького шестиугольника к другому и пытаясь найти его группу): https://observablehq.com/@sanderevers / шестиугольная черепица шестиугольной сетки

Hexagon groups

Любая помощь будет принята с благодарностью! Спасибо!

1 Ответ

0 голосов
/ 23 апреля 2020

Похоже, я нашел что-то, что работает.

Пожалуйста, не стесняйтесь исправлять меня, если я ошибаюсь.

Основываясь на статье, на которую я ссылался в исходном вопросе, я придумал алгоритм, который вычисляет центральные координаты маленького шестиугольника на основе его более высокие координаты группы (в данном случае я использовал группу с радиусом 10). Я взял оригинальный алгоритм и удалил деление области, которое сделал автор. Код в javascript. Переменные i, j и k являются кубическими координатами группы. Функция возвращает координаты куба центрального малого гексагона:

getGroupCentralTileCoordinates(i, j, k)
{
    let r = 10;
    let shift = 3 * r + 2;

    let xh = shift * i + j;
    let yh = shift * j + k;
    let zh = shift * k + i;

    return {
        'x': (1 + xh - yh) / 3, 
        'y': (1 + yh - zh) / 3, 
        'z': (1 + zh - xh) / 3
    };
}
...