Koordinat heksagonal: Kutub ke Cartesian

11

Wikipedia mengatakan tentang Koordinat Polar :

Dalam matematika, sistem koordinat kutub adalah sistem koordinat dua dimensi di mana setiap titik pada bidang ditentukan oleh jarak dari titik referensi dan sudut dari arah referensi.

Ini tampaknya sempurna untuk menggambarkan kisi heksagonal. Ambil kisi heksagonal berikut sebagai contoh:

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

Titik referensi kami akan menjadi pusat segi enam ('J'), dan sudut referensi kami akan ke sudut kiri atas segi enam ('A'). Namun, kami akan menjelaskan sudut dalam hal jumlah langkah searah jarum jam di sekitar luar segi enam dari titik ini, bukan dalam sudut. Jadi kita akan menyebutnya "Nomor langkah" bukan sudut.

Misalnya, 'C' berada di (2, 2) karena ia memiliki jari-jari 2 (karena itu adalah dua cincin dari pusat, 'J'), dan nomor langkah 2 (2 langkah searah jarum jam maju dari 'A '). Demikian pula, 'O' berada di (1, 3), karena itu adalah satu cincin dari pusat, dan tiga langkah searah jarum jam maju dari 'E' (yang ada di sudut referensi).

Untuk kelengkapan, 'J' berada di (0, 0), karena Anda perlu 0 langkah keluar dan 0 langkah searah jarum jam untuk mencapainya.

Sekarang, Anda juga dapat menggambarkan heksagonal dengan Koordinat Cartesian , tetapi karena offset ini agak aneh. Sama seperti dengan koordinat kutub kami, kami akan menempatkan pusat di (0, 0). Setiap ruang membutuhkan koordinat juga, jadi 'K' berada di (2, 0), bukan (1, 0). Ini akan menempatkan 'A' di (-2, 2), dan 'O' di (1, -1).

Tantangan

Dengan koordinat heksagonal polar, hasilkan koordinat yang sama dalam koordinat Cartesius. Anda dapat mengambil coords ini, dan menghasilkan jawabannya dalam format yang masuk akal. Ini berarti Anda dapat membalik urutan input jika Anda mau. Ini juga berarti Anda dapat menampilkan coords sebagai (Y, X), tetapi jika Anda melakukannya, sebutkan ini dalam jawaban Anda untuk menghindari kebingungan.

Anda tidak harus menangani jari-jari negatif, tetapi Anda mungkin mendapatkan sudut negatif, atau sudut yang lebih dari revolusi penuh di sekitar segi enam. Misalnya, Anda dapat menerima (1, 10), atau (1, -2) sebagai masukan. Keduanya akan sama dengan 'N' di segi enam sebelumnya. Anda tidak harus menangani non-integer untuk input.

Contoh 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
sumber
4
seseorang menjawab ini dalam hexagony ...
FlipTack
Untuk memperjelas, apakah unit yang digunakan untuk mengukur sudut tergantung pada jari-jari? (misalnya (1, 1) adalah sudut 60 ° dari sudut referensi, tetapi (2, 1) hanya 30 ° karena lebih jauh dan dengan demikian ada lebih banyak huruf di sana). Pertanyaannya tampaknya menyiratkan bahwa, tetapi itu bukan cara biasa koordinat kutub bekerja, jadi mungkin layak untuk menjelaskan bahwa Anda berbeda.
Apakah kita hanya perlu mempertimbangkan jarak hingga 2 dari asalnya, atau apakah itu harus bekerja lebih jauh dari itu?
Level River St
@ ais523 Ya, itu diukur dalam langkah - langkah tidak sudut. Saya sudah mengklarifikasi itu sedikit di posting.
James
@LevelRiverSt Tidak, secara teori seharusnya berfungsi untuk semua radius. Tes IO naik ke 10.
James

Jawaban:

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]

Cuplikan uji:

Produksi ETH
sumber
Anda harus menangani sudut yang lebih dari revolusi penuh; kode Anda sepertinya tidak berfungsi (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]

Penjelasan: Solusi untuk sudut nol adalah sederhana -r,r, jadi kita mulai dari titik itu. Jika sudut negatif, kita menambahkan seluruh segi enam dan menyebut diri kita secara rekursif, kalau tidak kita mulai berjalan di sekitar segi enam dengan d,e=2,0langkah. Jika memungkinkan, kami melompat rlangkah-langkah tersebut, kemudian memutar langkah menggunakan rumus d+e*3>>1,e-d>>1untuk maju ke sisi berikutnya. Akhirnya kami mengambil langkah yang tersisa untuk mencapai tujuan kami.

Neil
sumber