Coordenadas hexagonales: polar a cartesiana

11

Wikipedia dice acerca de las coordenadas polares :

En matemáticas, el sistema de coordenadas polares es un sistema de coordenadas bidimensionales en el que cada punto en un plano está determinado por una distancia desde un punto de referencia y un ángulo desde una dirección de referencia.

Esto parece perfecto para describir cuadrículas hexagonales. Tome la siguiente cuadrícula hexagonal, por ejemplo:

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

Nuestro punto de referencia será el centro del hexágono ('J'), y nuestro ángulo de referencia será la esquina superior izquierda del hexágono ('A'). Sin embargo, describiremos el ángulo en términos del número de pasos en sentido horario alrededor del exterior del hexágono desde este punto, no en ángulos. Entonces lo llamaremos "número de paso" en lugar de ángulo.

Por ejemplo, 'C' está en (2, 2) porque tiene un radio de 2 (ya que está a dos anillos del centro, 'J') y un número de paso de 2 (2 pasos hacia la derecha desde 'A '). De manera similar, 'O' está en (1, 3), porque está a un anillo del centro y tres pasos hacia la derecha desde 'E' (que está en el ángulo de referencia).

Para completar, 'J' está en (0, 0), ya que necesita 0 pasos y 0 pasos en sentido horario para alcanzarlo.

Ahora, también puede describir un hexagonal con coordenadas cartesianas , pero debido al desplazamiento esto es un poco extraño. Al igual que con nuestras coordenadas polares, colocaremos el centro en (0, 0). Cada espacio ocupa también una coordenada, por lo que 'K' está en (2, 0), no (1, 0). Esto pondría 'A' en (-2, 2) y 'O' en (1, -1).

El reto

Dadas las coordenadas hexagonales polares, genera las mismas coordenadas en coordenadas cartesianas. Puede tomar estas coordenadas y dar salida a la respuesta en cualquier formato razonable. Esto significa que puede invertir el orden de las entradas si lo desea. Esto también significa que puede generar las coordenadas como (Y, X), pero si lo hace, mencione esto en su respuesta para evitar confusiones.

No tiene que manejar radios negativos, pero puede obtener ángulos negativos o ángulos que van más allá de una revolución completa alrededor del hexágono. Por ejemplo, puede recibir (1, 10) o (1, -2) como entrada. Ambos corresponderían a 'N' en nuestro hexágono anterior. Usted no tiene que manejar no enteros para la entrada.

Muestra 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
fuente
44
alguien responda esto en hexagonía ...
FlipTack
Para aclarar, ¿las unidades utilizadas para medir el ángulo dependen del radio? (por ejemplo, (1, 1) es un ángulo de 60 ° desde el ángulo de referencia, pero (2, 1) es solo 30 ° porque está más alejado y, por lo tanto, hay más letras allí). La pregunta parece implicar eso, pero esa no es la forma normal en que funcionan las coordenadas polares, por lo que puede valer la pena explicar que las suyas son diferentes.
¿Solo tenemos que considerar una distancia de hasta 2 desde el origen, o tiene que trabajar más lejos que eso?
Level River St el
@ ais523 Sí, se mide en pasos, no en ángulos. Lo he aclarado un poco en la publicación.
James
@LevelRiverSt No, en teoría debería funcionar para cualquier radio. La prueba IO sube a 10.
James

Respuestas:

3

JavaScript (ES6), 93 bytes

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

Fragmento de prueba:

ETHproductions
fuente
Tienes que manejar ángulos que van más allá de una revolución completa; Parece que su código no funciona (1, -7).
Neil
1

JavaScript (ES6), 95 bytes

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]

Explicación: La solución para un ángulo cero es simplemente -r,r, así que comenzamos en ese punto. Si el ángulo es negativo, agregamos un hexágono completo y nos llamamos recursivamente, de lo contrario, comenzamos a caminar alrededor del hexágono con un d,e=2,0paso. Siempre que sea posible, saltamos rtales pasos, luego giramos el paso usando la fórmula d+e*3>>1,e-d>>1para avanzar al siguiente lado. Finalmente tomamos los pasos restantes para llegar a nuestro destino.

Neil
fuente