Altıgen koordinatlar: Polar'dan Kartezyen'e


11

Wikipedia, Polar Koordinatları hakkında şunları söylüyor :

Matematikte, kutupsal koordinat sistemi, düzlemdeki her noktanın bir referans noktasından uzaklığı ve referans yönünden bir açı ile belirlendiği iki boyutlu bir koordinat sistemidir.

Bu altıgen ızgaraları tanımlamak için mükemmel görünüyor. Aşağıdaki altıgen ızgarayı ele alalım:

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

Referans noktamız altıgenin merkezi ('J') ve referans açımız altıgenin ('A') sol üst köşesinde olacaktır. Ancak, açıyı bu noktadan itibaren altıgenin dışında saat yönünde adımların sayısı olarak tanımlayacağız, açılarda değil. Bu yüzden ona açı yerine "Adım numarası" diyeceğiz.

Örneğin, 'C' (2, 2) konumundadır, çünkü yarıçapı 2'dir (merkezden iki halka uzakta olduğundan, 'J') ve adım sayısı 2'dir ('A'dan 2 saat yönünde 2 adım ileri gider) '). Benzer şekilde, 'O' (1, 3) 'te, çünkü merkezden bir halka uzakta ve' E 'den (saat yönünde) üç saat ileri adımdır.

Tamlık için 'J' (0, 0) 'dadır, çünkü ona ulaşmak için 0 adım ve saat yönünde 0 adım gerekir.

Şimdi, Kartezyen Koordinatları olan bir altıgen de tanımlayabilirsiniz , ancak ofset nedeniyle bu biraz garip. Kutupsal koordinatlarımızda olduğu gibi, merkezi (0, 0) 'a koyacağız. Her boşluk da bir koordinat alır, bu yüzden 'K' (1, 0) değil (2, 0) 'dadır. Bu, (-2, 2) 'ye' A 've (1, -1)' ye 'O' koyacaktır.

Meydan okuma

Kutup altıgen koordinatları verildiğinde, Kartezyen koordinatlarda aynı koordinatları çıktılayın. Bu koordinatları alabilir ve çıktıyı makul bir formatta alabilirsiniz. Bu, isterseniz girişlerin sırasını tersine çevirebileceğiniz anlamına gelir. Bu aynı zamanda koordinatları (Y, X) olarak çıkarabileceğiniz anlamına gelir, ancak eğer yaparsanız, karışıklığı önlemek için lütfen cevabınızda bunu belirtin.

Negatif yarıçaplarla uğraşmak zorunda değilsiniz, ancak negatif açılar veya altıgen etrafında tam bir devrimden daha fazla olan açılar alabilirsiniz. Örneğin, giriş olarak (1, 10) veya (1, -2) alabilirsiniz. Bunların her ikisi de önceki altıgendeki 'N'ye karşılık gelirdi. Sen do not girişi için tamsayı olmayan işlemek zorunda.

Örnek ES

#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
birisi altıgen buna cevap ...
FlipTack

Açıklığa kavuşturmak için, açıyı ölçmek için kullanılan birimler yarıçapa bağlı mı? (örneğin (1, 1) referans açısından 60 ° 'lik bir açıdır, ancak (2, 1) sadece 30 °' dir çünkü daha fazla dışarıdadır ve dolayısıyla daha fazla harf vardır). Soru bunu ima ediyor gibi görünüyor, ancak bu kutupsal koordinatların normal çalışması değildir, bu yüzden sizinki differnet olduğunu açıklamaya değer olabilir.

Sadece başlangıçtan itibaren 2'ye kadar bir mesafeyi mi düşünmeliyiz, yoksa bundan daha uzakta mı çalışması gerekiyor?
Level River St

@ ais523 Evet, açı değil adımlarla ölçülür . Bunu yazıda biraz açıkladım.
James

@LevelRiverSt Hayır, teorik olarak herhangi bir yarıçap için çalışmalıdır. Test IO değeri 10'a kadar çıkar.
James

Yanıtlar:


3

JavaScript (ES6), 93 bayt

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

Test snippet'i:


Tam bir devrimden daha fazlası olan açıları ele almalısınız; kodunuz işe yaramıyor gibi görünüyor (1, -7).
Neil

1

JavaScript (ES6), 95 bayt

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]

Açıklama: Sıfır bir açı için çözüm basittir -r,r, bu yüzden o noktadan başlarız. Açı negatifse, tam bir altıgen ekleriz ve kendimizi tekrar tekrar çağırırız, aksi takdirde altıgen etrafında bir d,e=2,0adımla yürümeye başlarız . Mümkün olduğunda, rbu adımları atlıyoruz , ardından bir d+e*3>>1,e-d>>1sonraki tarafa geçmek için formülü kullanarak adımı döndürüyoruz . Son olarak hedefimize ulaşmak için geri kalan adımları atıyoruz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.