Coordenadas hexagonais: Polar a Cartesiana

11

A Wikipedia diz sobre as coordenadas polares :

Em matemática, o sistema de coordenadas polares é um sistema de coordenadas bidimensional no qual cada ponto de um plano é determinado por uma distância de um ponto de referência e um ângulo de uma direção de referência.

Isso parece perfeito para descrever grades hexagonais. Veja a seguinte grade hexagonal, por exemplo:

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

Nosso ponto de referência será o centro do hexágono ('J'), e nosso ângulo de referência será o canto superior esquerdo do hexágono ('A'). No entanto, descreveremos o ângulo em termos do número de etapas no sentido horário ao redor da parte externa do hexágono a partir deste ponto, não em ângulos. Então, chamaremos de "número da etapa" em vez de ângulo.

Por exemplo, 'C' está em (2, 2) porque possui um raio de 2 (uma vez que está a dois anéis do centro, 'J') e um número de passo 2 (2 passos no sentido horário a partir de 'A '). Da mesma forma, 'O' está em (1, 3), porque fica a um anel do centro e a três passos no sentido horário a partir de 'E' (que está no ângulo de referência).

Para completar, 'J' está em (0, 0), pois você precisa de 0 passos e 0 passos no sentido horário para alcançá-lo.

Agora, você também pode descrever um hexagonal com coordenadas cartesianas , mas devido ao deslocamento, isso é um pouco estranho. Assim como com nossas coordenadas polares, colocaremos o centro em (0, 0). Cada espaço também ocupa uma coordenada, então 'K' está em (2, 0), não (1, 0). Isso colocaria 'A' em (-2, 2) e 'O' em (1, -1).

O desafio

Dadas coordenadas hexagonais polares, produza as mesmas coordenadas em coordenadas cartesianas. Você pode pegar essas cordas e enviar a resposta em qualquer formato razoável. Isso significa que você pode reverter a ordem das entradas, se quiser. Isso também significa que você pode emitir as cordas como (Y, X), mas, se o fizer, mencione isso na sua resposta para evitar confusão.

Você não precisa lidar com raios negativos, mas poderá obter ângulos negativos ou ângulos que vão mais do que uma revolução completa ao redor do hexágono. Por exemplo, você pode receber (1, 10) ou (1, -2) como entrada. Ambos corresponderiam a 'N' em nosso hexágono anterior. Você não precisa manipular não-inteiros para entrada.

IO de amostra

#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
fonte
4
alguém responder a esta em hexagony ...
FlipTack
Para esclarecer, as unidades usadas para medir o ângulo dependem do raio? (por exemplo, (1, 1) é um ângulo de 60 ° em relação ao ângulo de referência, mas (2, 1) é apenas 30 ° porque está mais distante e, portanto, há mais letras lá). A questão parece sugerir isso, mas essa não é a maneira normal como as coordenadas polares funcionam, por isso pode valer a pena explicar que as suas são diferentes.
Precisamos considerar apenas uma distância de até 2 da origem ou precisa trabalhar mais longe do que isso?
Level River St
@ ais523 Sim, é medido em passos, não em ângulos. Esclarei isso um pouco no post.
James
@LevelRiverSt Não, teoricamente deve funcionar para qualquer raio. O teste de E / S sobe para 10. #
James James

Respostas:

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]

Snippet de teste:

ETHproductions
fonte
Você tem que lidar com ângulos que vão mais do que uma revolução completa; seu código parece não funcionar (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]

Explicação: A solução para um ângulo zero é simples -r,r, então começamos nesse ponto. Se o ângulo for negativo, adicionamos um hexágono inteiro e nos chamamos recursivamente, caso contrário, começamos a andar pelo hexágono com um d,e=2,0passo. Sempre que possível, saltamos ressas etapas e giramos a etapa usando a fórmula d+e*3>>1,e-d>>1para avançar para o próximo lado. Finalmente, tomamos as medidas restantes para chegar ao nosso destino.

Neil
fonte