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


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" у нашому попередньому шестикутнику. Вам не потрібно обробляти нецілі числа для введення.

Зразок IO

#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 від початку, або це має працювати далі, ніж це?
Річка Рівня Св.

@ ais523 Так, це вимірюється кроками, а не кутами. Я це трохи уточнив у дописі.
Джеймс

@LevelRiverSt Ні, він теоретично повинен працювати для будь-якого радіусу. Тестовий IO піднімається до 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.