Współrzędne sześciokątne: biegunowe na kartezjańskie


11

Wikipedia mówi o współrzędnych biegunowych :

W matematyce biegunowy układ współrzędnych jest dwuwymiarowym układem współrzędnych, w którym każdy punkt na płaszczyźnie jest określony przez odległość od punktu odniesienia i kąt od kierunku odniesienia.

Wydaje się to idealne do opisu siatek heksagonalnych. Weźmy na przykład następującą siatkę sześciokątną:

  A B C
 D E F G
H I J K L
 M N O P
  Q R S

Naszym punktem odniesienia będzie środek sześciokąta („J”), a naszym kątem odniesienia będzie lewy górny róg sześciokąta („A”). Opiszemy jednak kąt w kategoriach liczby kroków zgodnie z ruchem wskazówek zegara wokół zewnętrznej strony sześciokąta od tego punktu, a nie w kątach. Nazywamy to „numerem kroku” zamiast kąta.

Na przykład „C” ma wartość (2, 2), ponieważ ma promień 2 (ponieważ jest dwa pierścienie od środka, „J”) i liczbę kroków 2 (2 kroki zgodnie z ruchem wskazówek zegara od „A” ”). Podobnie „O” znajduje się w (1, 3), ponieważ jest o jeden pierścień od środka i trzy kroki zgodnie z ruchem wskazówek zegara do przodu od „E” (który jest pod kątem odniesienia).

Dla kompletności, „J” ma wartość (0, 0), ponieważ do osiągnięcia tego potrzeba 0 kroków i 0 kroków zgodnie z ruchem wskazówek zegara.

Teraz możesz również opisać sześciokąt z współrzędnymi kartezjańskimi , ale z powodu przesunięcia jest to trochę dziwne. Podobnie jak w przypadku naszych współrzędnych biegunowych, ustawimy środek na (0, 0). Każda przestrzeń zajmuje również współrzędną, więc „K” ma wartość (2, 0), a nie (1, 0). Ustawiłoby to „A” na (-2, 2), a „O” na (1, -1).

Wyzwanie

Biorąc pod uwagę biegunowe współrzędne sześciokątne, wyślij te same współrzędne we współrzędnych kartezjańskich. Możesz wziąć te współrzędne i otrzymać odpowiedź w dowolnym rozsądnym formacie. Oznacza to, że możesz odwrócić kolejność wejść, jeśli chcesz. Oznacza to również, że możesz wyprowadzać współrzędne jako (Y, X), ale jeśli tak, proszę wspomnij o tym w swojej odpowiedzi, aby uniknąć zamieszania.

Nie musisz obsługiwać promieni ujemnych, ale możesz uzyskać kąty ujemne lub kąty, które przekraczają pełny obrót wokół sześciokąta. Na przykład możesz otrzymać (1, 10) lub (1, -2) jako dane wejściowe. Oba odpowiadałyby „N” w naszym poprzednim sześciokącie. Zdajesz nie muszą obsługiwać nie-całkowitymi dla wejścia.

Próbka 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
ktoś odpowiada na to w heksagonii ...
FlipTack

Aby wyjaśnić, czy jednostki używane do pomiaru kąta zależą od promienia? (np. (1, 1) jest kątem 60 ° od kąta odniesienia, ale (2, 1) ma tylko 30 °, ponieważ jest dalej i dlatego jest tam więcej liter). Pytanie wydaje się sugerować, że tak jest, ale nie jest to normalny sposób działania współrzędnych biegunowych, więc może warto wyjaśnić, że twoje są różne.

Czy musimy brać pod uwagę odległość do 2 punktów początkowych, czy też musi działać dalej?
Level River St

@ ais523 Tak, jest mierzony w krokach, a nie pod kątem. Wyjaśniłem to trochę w poście.
James

@LevelRiverSt Nie, teoretycznie powinien działać dla każdego promienia. Test IO wzrasta do 10.
James

Odpowiedzi:


3

JavaScript (ES6), 93 bajty

(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]

Fragment testowy:


Musisz radzić sobie z kątami, które przekraczają pełną rewolucję; twój kod wydaje się nie działać (1, -7).
Neil

1

JavaScript (ES6), 95 bajtów

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]

Objaśnienie: Rozwiązanie dla kąta zerowego jest proste -r,r, więc zaczynamy od tego punktu. Jeśli kąt jest ujemny, dodajemy cały sześciokąt i nazywamy się rekurencyjnie, w przeciwnym razie zaczniemy chodzić po sześciokącie d,e=2,0krokiem. Tam, gdzie to możliwe, przeskakujemy rtakie kroki, a następnie obracamy krok za pomocą formuły, d+e*3>>1,e-d>>1aby przejść do następnej strony. Wreszcie podejmujemy wszelkie pozostałe kroki, aby dotrzeć do celu.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.