Coordinate esagonali: da polare a cartesiana


11

Wikipedia dice di Polar Coordinates :

In matematica, il sistema di coordinate polari è un sistema di coordinate bidimensionale in cui ciascun punto su un piano è determinato da una distanza da un punto di riferimento e un angolo da una direzione di riferimento.

Questo sembra perfetto per descrivere le griglie esagonali. Prendi ad esempio la seguente griglia esagonale:

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

Il nostro punto di riferimento sarà il centro dell'esagono ('J') e il nostro angolo di riferimento sarà nell'angolo in alto a sinistra dell'esagono ('A'). Tuttavia, descriveremo l'angolo in termini di numero di passi in senso orario attorno all'esterno dell'esagono da questo punto, non in angoli. Quindi lo chiameremo "Numero di passaggio" anziché angolo.

Ad esempio, 'C' è su (2, 2) perché ha un raggio di 2 (poiché è a due anelli di distanza dal centro, 'J') e un numero di passo di 2 (2 passi in senso orario in avanti da 'A '). Allo stesso modo, 'O' è su (1, 3), perché è a un anello di distanza dal centro e tre passi in senso orario in avanti da 'E' (che si trova sull'angolo di riferimento).

Per completezza, 'J' è su (0, 0), poiché per raggiungerlo sono necessari 0 passi e 0 passi in senso orario.

Ora, puoi anche descrivere un esagonale con coordinate cartesiane , ma a causa dell'offset questo è un po 'strano. Proprio come con le nostre coordinate polari, posizioneremo il centro su (0, 0). Ogni spazio occupa anche una coordinata, quindi 'K' è su (2, 0), non (1, 0). Ciò porterebbe 'A' a (-2, 2) e 'O' a (1, -1).

La sfida

Date le coordinate esagonali polari, emettere le stesse coordinate in coordinate cartesiane. Puoi prendere questi coord e ottenere la risposta in qualsiasi formato ragionevole. Ciò significa che è possibile invertire l'ordine degli input, se lo si desidera. Questo significa anche che potresti generare i coord come (Y, X), ma se lo fai, per favore menzionalo nella tua risposta per evitare confusione.

Non è necessario gestire raggi negativi, ma è possibile ottenere angoli negativi o angoli che vanno oltre un giro completo attorno all'esagono. Ad esempio, potresti ricevere (1, 10) o (1, -2) come input. Entrambi corrisponderebbero a "N" nel nostro esagono precedente. Non è necessario gestire numeri non interi per l'input.

IO di esempio

#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
qualcuno risponde a questo in esagonia ...
FlipTack

Per chiarire, le unità utilizzate per misurare l'angolo dipendono dal raggio? (es. (1, 1) è un angolo di 60 ° rispetto all'angolo di riferimento, ma (2, 1) è di soli 30 ° perché è più lontano e quindi ci sono più lettere lì). La domanda sembra implicarlo, ma non è così che funzionano le coordinate polari, quindi potrebbe valere la pena spiegare che le tue sono diverse.

Dobbiamo considerare solo una distanza massima di 2 dall'origine o deve lavorare più lontano di così?
Level River St,

@ ais523 Sì, si misura in passi e non in angoli. L'ho chiarito un po 'nel post.
James,

@LevelRiverSt No, teoricamente dovrebbe funzionare per qualsiasi raggio. Il test IO arriva fino al 10.
James,

Risposte:


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]

Snippet di prova:


Devi gestire angoli che vanno oltre una rivoluzione completa; il tuo codice non sembra funzionare (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]

Spiegazione: La soluzione per un angolo zero è semplicemente -r,r, quindi iniziamo da quel punto. Se l'angolo è negativo, aggiungiamo un intero esagono e ci chiamiamo ricorsivamente, altrimenti iniziamo a camminare attorno all'esagono con un d,e=2,0passo. Laddove possibile, saltiamo rtali passaggi, quindi ruotiamo il passaggio utilizzando la formula d+e*3>>1,e-d>>1per passare al lato successivo. Infine prendiamo tutti i passaggi rimanenti per raggiungere la nostra destinazione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.