Coordonnées hexagonales: polaire à cartésienne


11

Wikipédia dit à propos des coordonnées polaires :

En mathématiques, le système de coordonnées polaires est un système de coordonnées bidimensionnel dans lequel chaque point sur un plan est déterminé par une distance d'un point de référence et un angle d'une direction de référence.

Cela semble parfait pour décrire les grilles hexagonales. Prenez par exemple la grille hexagonale suivante:

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

Notre point de référence sera le centre de l'hexagone («J») et notre angle de référence sera dans le coin supérieur gauche de l'hexagone («A»). Cependant, nous décrirons l'angle en termes de nombre de pas dans le sens des aiguilles d' une montre autour de l'extérieur de l'hexagone à partir de ce point, pas en angles. Nous l'appellerons donc "Numéro de l'étape" au lieu de l'angle.

Par exemple, 'C' est à (2, 2) car il a un rayon de 2 (car il est à deux anneaux du centre, 'J'), et un nombre de pas de 2 (2 pas dans le sens des aiguilles d'une montre à partir de 'A '). De même, «O» est en (1, 3), car il est à un anneau du centre et à trois pas dans le sens des aiguilles d'une montre de «E» (qui est sur l'angle de référence).

Pour être complet, 'J' est à (0, 0), car vous avez besoin de 0 pas vers l'extérieur et 0 pas dans le sens des aiguilles d'une montre pour l'atteindre.

Maintenant, vous pouvez également décrire un hexagonal avec des coordonnées cartésiennes , mais en raison du décalage, c'est un peu bizarre. Tout comme avec nos coordonnées polaires, nous mettrons le centre à (0, 0). Chaque espace prend également une coordonnée, donc 'K' est à (2, 0), pas (1, 0). Cela mettrait «A» à (-2, 2) et «O» à (1, -1).

Le défi

Étant donné les coordonnées hexagonales polaires, émettez les mêmes coordonnées en coordonnées cartésiennes. Vous pouvez prendre ces coordonnées et produire la réponse dans n'importe quel format raisonnable. Cela signifie que vous pouvez inverser l'ordre des entrées si vous le souhaitez. Cela signifie également que vous pouvez afficher les coordonnées sous la forme (Y, X), mais si vous le faites, veuillez le mentionner dans votre réponse pour éviter toute confusion.

Vous n'avez pas à gérer les rayons négatifs, mais vous pouvez obtenir des angles négatifs, ou des angles qui vont plus d'une révolution complète autour de l'hexagone. Par exemple, vous pouvez recevoir (1, 10) ou (1, -2) en entrée. Ces deux correspondraient à «N» dans notre hexagone précédent. Vous n'avez pas besoin de gérer des non-entiers pour l'entrée.

Exemple d'E / S

#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
quelqu'un répond à cela dans l'hexagonie ...
FlipTack

Pour clarifier, les unités utilisées pour mesurer l'angle dépendent-elles du rayon? (par exemple (1, 1) est un angle de 60 ° par rapport à l'angle de référence, mais (2, 1) n'est que de 30 ° car il est plus éloigné et donc il y a plus de lettres). La question semble impliquer cela, mais ce n'est pas le fonctionnement normal des coordonnées polaires, il peut donc être utile d'expliquer que les vôtres sont différentes.

Faut-il seulement tenir compte d'une distance allant jusqu'à 2 de l'origine, ou faut-il travailler plus loin que cela?
Level River St du

@ ais523 Oui, il est mesuré en pas et non en angles. Je l'ai clarifié un peu dans le post.
James

@LevelRiverSt Non, cela devrait théoriquement fonctionner pour n'importe quel rayon. Le test IO monte jusqu'à 10.
James

Réponses:


3

JavaScript (ES6), 93 octets

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

Extrait de test:


Vous devez gérer des angles qui vont plus qu'une révolution complète; votre code ne semble pas fonctionner (1, -7).
Neil

1

JavaScript (ES6), 95 octets

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]

Explication: La solution pour un angle nul est simple -r,r, alors nous commençons à ce point. Si l'angle est négatif, nous ajoutons un hexagone entier et nous appelons récursivement, sinon nous commençons à marcher autour de l'hexagone avec un d,e=2,0pas. Dans la mesure du possible, nous sautons de rtelles étapes, puis en tournant l'étape à l'aide de la formule d+e*3>>1,e-d>>1pour passer au côté suivant. Enfin, nous prenons toutes les mesures restantes pour atteindre notre destination.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.