Sechseckige Koordinaten: Polar bis kartesisch

11

Wikipedia sagt über Polarkoordinaten :

In der Mathematik ist das Polarkoordinatensystem ein zweidimensionales Koordinatensystem, bei dem jeder Punkt auf einer Ebene durch einen Abstand von einem Referenzpunkt und einen Winkel von einer Referenzrichtung bestimmt wird.

Dies scheint perfekt für die Beschreibung von sechseckigen Gittern zu sein. Nehmen Sie zum Beispiel das folgende sechseckige Gitter:

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

Unser Referenzpunkt ist die Mitte des Sechsecks ('J'), und unser Referenzwinkel ist die obere linke Ecke des Sechsecks ('A'). Wir werden den Winkel jedoch anhand der Anzahl der Schritte im Uhrzeigersinn um die Außenseite des Sechsecks von diesem Punkt aus beschreiben, nicht in Winkeln. Also nennen wir es "Schrittnummer" anstelle von Winkel.

Zum Beispiel ist 'C' bei (2, 2), weil es einen Radius von 2 (da es zwei Ringe von der Mitte entfernt ist, 'J') und eine Schrittnummer von 2 (2 Schritte im Uhrzeigersinn vorwärts von 'A) hat '). In ähnlicher Weise befindet sich 'O' bei (1, 3), da es einen Ring von der Mitte entfernt ist und drei Schritte im Uhrzeigersinn von 'E' (das sich auf dem Referenzwinkel befindet) vorwärts geht.

Der Vollständigkeit halber steht 'J' bei (0, 0), da Sie 0 Schritte aus und 0 Schritte im Uhrzeigersinn benötigen, um es zu erreichen.

Jetzt können Sie auch ein Sechseck mit kartesischen Koordinaten beschreiben , aber aufgrund des Versatzes ist dies etwas seltsam. Genau wie bei unseren Polarkoordinaten setzen wir das Zentrum auf (0, 0). Jeder Raum nimmt auch eine Koordinate ein, also ist 'K' bei (2, 0) und nicht bei (1, 0). Dies würde 'A' bei (-2, 2) und 'O' bei (1, -1) setzen.

Die Herausforderung

Geben Sie bei gegebenen hexagonalen Polarkoordinaten dieselben Koordinaten in kartesischen Koordinaten aus. Sie können diese Koordinaten nehmen und die Antwort in einem beliebigen vernünftigen Format ausgeben. Dies bedeutet, dass Sie die Reihenfolge der Eingaben umkehren können, wenn Sie möchten. Dies bedeutet auch, dass Sie die Koordinaten als (Y, X) ausgeben können. Wenn Sie dies jedoch tun, erwähnen Sie dies bitte in Ihrer Antwort, um Verwirrung zu vermeiden.

Sie müssen nicht mit negativen Radien umgehen, aber Sie erhalten möglicherweise negative Winkel oder Winkel, die mehr als eine volle Umdrehung um das Sechseck gehen. Beispielsweise können Sie (1, 10) oder (1, -2) als Eingabe erhalten. Diese würden beide 'N' in unserem vorherigen Sechseck entsprechen. Sie müssen keine Ganzzahlen für die Eingabe verarbeiten.

Beispiel 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)
James
quelle
4
jemand beantwortet dies in hexagony ...
FlipTack
Hängen die zur Messung des Winkels verwendeten Einheiten zur Verdeutlichung vom Radius ab? (zB (1, 1) ist ein Winkel von 60 ° zum Referenzwinkel, aber (2, 1) ist nur 30 °, weil es weiter außen liegt und daher mehr Buchstaben vorhanden sind). Die Frage scheint dies zu implizieren, aber das ist nicht die normale Art und Weise, wie Polarkoordinaten funktionieren. Daher kann es sich lohnen, zu erklären, dass Ihre Koordinaten unterschiedlich sind.
Müssen wir nur einen Abstand von bis zu 2 vom Ursprung berücksichtigen oder muss er weiter entfernt arbeiten?
Level River St
@ ais523 Ja, es wird in Schritten und nicht in Winkeln gemessen . Ich habe das ein wenig in der Post klargestellt.
James
@LevelRiverSt Nein, es sollte theoretisch für jeden Radius funktionieren. Der Test IO geht bis 10.
James

Antworten:

3

JavaScript (ES6), 93 Byte

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

Testschnipsel:

ETH-Produktionen
quelle
Sie müssen mit Winkeln umgehen, die mehr als eine volle Umdrehung umfassen. Ihr Code scheint nicht zu funktionieren (1, -7).
Neil
1

JavaScript (ES6), 95 Byte

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]

Erklärung: Die Lösung für einen Nullwinkel ist einfach -r,r, also beginnen wir an diesem Punkt. Wenn der Winkel negativ ist, addieren wir ein ganzes Sechseck und nennen uns rekursiv, andernfalls gehen wir mit einem d,e=2,0Schritt um das Sechseck herum . Wenn möglich, überspringen wir rsolche Schritte und drehen den Schritt dann mithilfe der Formel d+e*3>>1,e-d>>1, um zur nächsten Seite zu gelangen. Schließlich unternehmen wir alle verbleibenden Schritte, um unser Ziel zu erreichen.

Neil
quelle