Википедия говорит о полярных координатах :
В математике, полярная система координат двумерная система координат, в которой каждая точка на плоскости определяется расстоянием от опорной точки и под углом от опорного направления.
Это кажется идеальным для описания гексагональной сетки. Возьмите следующую гексагональную сетку, например:
A B C
D E F G
H I J K L
M N O P
Q R S
Нашей контрольной точкой будет центр шестиугольника («J»), а нашим контрольным углом будет верхний левый угол шестиугольника («A»). Однако мы опишем угол с точки зрения количества шагов по часовой стрелке вокруг шестиугольника снаружи от этой точки, а не в углах. Поэтому мы будем называть это «Номер шага» вместо угла.
Например, «C» находится в точке (2, 2), потому что имеет радиус 2 (поскольку он находится в двух кольцах от центра, «J»), и номер шага 2 (2 шага по часовой стрелке от «A» «). Аналогичным образом, «O» находится в точке (1, 3), потому что это одно кольцо от центра, и три по часовой стрелке шагов вперед от «E» (который находится на опорный угле).
Для полноты 'J' находится в (0, 0), так как вам нужно 0 шагов и 0 шагов по часовой стрелке, чтобы достичь его.
Теперь вы также можете описать шестиугольник с помощью декартовых координат , но из-за смещения это немного странно. Как и в случае с нашими полярными координатами, мы поместим центр в (0, 0). Каждое пространство также принимает координату, поэтому 'K' находится в (2, 0), а не (1, 0). Это поместило бы 'A' в (-2, 2) и 'O' в (1, -1).
Соревнование
Учитывая полярные шестиугольные координаты, выведите те же координаты в декартовых координатах. Вы можете взять эти координаты и вывести ответ в любом разумном формате. Это означает, что вы можете изменить порядок входов, если хотите. Это также означает, что вы можете вывести координаты как (Y, X), но если вы это сделаете, пожалуйста, укажите это в своем ответе, чтобы избежать путаницы.
Вам не нужно обрабатывать отрицательные радиусы, но вы можете получить отрицательные углы или углы, которые превышают полный оборот вокруг шестиугольника. Например, вы можете получить (1, 10) или (1, -2) в качестве ввода. Они оба соответствуют «N» в нашем предыдущем шестиугольнике. Вам не нужно обрабатывать нецелые числа для ввода.
Образец ввода-вывода
#Polar #Cartesian
(0, 0) (0, 0)
(1, 2) (2, 0)
(6, 0) (-6, 6)
(2, -3) (-3, -1)
(4, 23), (-5, 3)
(5, -3), (-8, 2)
(10, 50), (-20, 0)
(6, 10), (10, 2)
(8, 28), (0, -8)
(8, -20), (0, -8)
источник
Ответы:
JavaScript (ES6), 93 байта
Тестовый фрагмент:
Показать фрагмент кода
источник
(1, -7)
.JavaScript (ES6), 95 байт
Пояснение: Решение для нулевого угла простое
-r,r
, поэтому мы начнем с этой точки. Если угол отрицательный, мы добавляем целый шестиугольник и называем себя рекурсивно, в противном случае мы начинаем идти по шестиугольнику сd,e=2,0
шагом. Там, где это возможно, мы прыгаемr
такие шаги, затем поворачиваем их по формуле,d+e*3>>1,e-d>>1
чтобы перейти на следующую сторону. Наконец мы предпринимаем любые оставшиеся шаги, чтобы добраться до пункта назначения.источник