Гексагональные координаты: полярно-декартово


11

Википедия говорит о полярных координатах :

В математике, полярная система координат двумерная система координат, в которой каждая точка на плоскости определяется расстоянием от опорной точки и под углом от опорного направления.

Это кажется идеальным для описания гексагональной сетки. Возьмите следующую гексагональную сетку, например:

  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)

4
кто-то ответит на это в гексагонии ...
FlipTack

Чтобы уточнить, зависят ли единицы измерения угла от радиуса? (например , (1, 1) представляет собой угол 60 ° от опорного угла, но (2, 1) составляет только 30 ° , потому что это дальше , и , таким образом , есть больше букв там). Вопрос, кажется, подразумевает это, но это не нормальный способ работы полярных координат, так что, возможно, стоит объяснить, что у вас разные сети.

Нужно ли учитывать расстояние до 2 от начала координат или оно должно работать дальше?
Уровень Река St

@ ais523 Да, он измеряется шагами, а не углами. Я пояснил это немного в посте.
Джеймс

@LevelRiverSt Нет, теоретически он должен работать для любого радиуса. Тест ввода-вывода идет до 10.
Джеймс

Ответы:


3

JavaScript (ES6), 93 байта

(r,d)=>[...Array(d+r*6)].map((_,i)=>x+="431013"[y+="122100"[i=i/r%6|0]-1,i]-2,x=y=-r)&&[x,-y]

Тестовый фрагмент:


Вы должны справиться с углами, которые идут больше, чем полный оборот; кажется, ваш код не работает (1, -7).
Нил

1

JavaScript (ES6), 95 байт

f=(r,t,x=-r,y=r,d=2,e=0)=>t<0?f(r,t+r*6):t>r?g(r,t-r,x+r*d,y+r*e,d+e*3>>1,e-d>>1):[x+t*d,y+t*e]

Пояснение: Решение для нулевого угла простое -r,r, поэтому мы начнем с этой точки. Если угол отрицательный, мы добавляем целый шестиугольник и называем себя рекурсивно, в противном случае мы начинаем идти по шестиугольнику с d,e=2,0шагом. Там, где это возможно, мы прыгаем rтакие шаги, затем поворачиваем их по формуле, d+e*3>>1,e-d>>1чтобы перейти на следующую сторону. Наконец мы предпринимаем любые оставшиеся шаги, чтобы добраться до пункта назначения.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.