六角形座標:極座標からデカルト座標


11

ウィキペディアは極座標について述べています:

数学では、極座標系は2次元の座標系であり、平面上の各点は、基準点からの距離と基準方向からの角度によって決定されます。

これは、六角形のグリッドを記述するのに最適のようです。たとえば、次の六角形のグリッドを考えてみましょう。

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

基準点は六角形の中心(「J」)になり、基準角は六角形の左上隅(「A」)になります。ただし、角度は、角度ではなく、このポイントから六角形の外側を回る時計回りのステップ数で説明します。したがって、角度ではなく「ステップ番号」と呼びます。

たとえば、「C」は半径が2(中心から2リング離れているため「J」)であり、ステップ番号が2(「A」から時計回りに2つ前方)であるため、(2、2)にあります。 ')。同様に、「O」は(1、3)にあります。これは、中心から1リング離れているため、「E」(基準角度上)から時計回りに3歩進むためです。

完全を期すために、「J」は(0、0)にあります。これに到達するには0歩、時計回りに0歩が必要です。

これで、デカルト座標で六角形を記述することもできますが、オフセットのため、これは少し奇妙です。極座標と同様に、中心を(0、0)に置きます。各スペースも座標を占めるため、「K」は(1、0)ではなく(2、0)にあります。これにより、(-2、2)に「A」、(1、-1)に「O」が配置されます。

チャレンジ

極座標の六角形座標を指定して、デカルト座標で同じ座標を出力します。これらの座標を取り、適切な形式で回答を出力できます。これは、必要に応じて入力の順序を逆にすることができることを意味します。これはまた、座標を(Y、X)として出力できることを意味しますが、そうする場合は、混乱を避けるために回答にこれを記載してください。

負の半径を処理する必要はありませんが、負の角度、または六角形の周りの完全な回転以上の角度を取得する場合があります。たとえば、入力として(1、10)または(1、-2)を受け取る場合があります。これらは両方とも前の六角形の「N」に対応します。入力のために非整数を処理する必要ありませ

サンプル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)

4
誰かが... hexagonyでこれを答える
FlipTack

明確にするために、角度の測定に使用される単位は半径に依存しますか?(たとえば、(1、1)は基準角から60°の角度ですが、(2、1)はさらに30°であるため、さらに外側にあり、文字がより多くあります)。質問はそれを暗示しているように見えますが、それは極座標が機能する通常の方法ではないので、あなたのものは異なるネットであることを説明する価値があるかもしれません。

原点から最大2の距離だけを考慮する必要がありますか、それともそれよりも遠くに作業する必要がありますか?
レベルリバーセント

@ ais523はい、角度ではなくステップで測定されます。投稿でそれを少し明確にした。
ジェームズ

@LevelRiverStいいえ、理論的にはどの半径でも機能するはずです。テストIOは10に上がる
ジェームズ

回答:


3

JavaScript(ES6)、93バイト

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

テストスニペット:


完全な革命以上の角度を処理する必要があります。あなたのコードはに機能していないようです(1, -7)
ニール

1

JavaScript(ES6)、95バイト

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]

説明:ゼロ角の解は単に-r,rですので、その点から始めます。角度が負の場合、六角形全体を追加して再帰的に呼び出します。それ以外の場合は、六角形の周りをd,e=2,0ステップで歩き始めます。可能であれば、rこのようなステップを飛ばしd+e*3>>1,e-d>>1、次の式に進むために式を使用してステップを回転させます。最後に、目的地に到達するための残りの手順を実行します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.