六角坐标:极地直角坐标


11

Wikipedia谈到极坐标

在数学中,极坐标系是二维坐标系,其中平面上的每个点由距参考点的距离和距参考方向的角度确定。

这似乎非常适合描述六角形网格。以以下六角形网格为例:

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

我们的参考点将是六边形('J')的中心,我们的参考角将是六边形('A')的左上角。但是,我们将根据从该点开始围绕六边形外部的顺时针台阶数(而不是角度)来描述角度。因此,我们将其称为“步数”而不是角度。

例如,“ C”在(2,2)处,因为它的半径为2(因为距中心“ J”有两个环),并且步数为2(从“ A”向前顺时针走了2个步) ')。类似地,“ O”位于(1、3),因为它距中心一圈,并且从“ E”(在参考角上)向前顺时针走了三步。

为了完整起见,“ J”位于(0,0),因为您需要0步和顺时针0步才能到达。

现在,您还可以使用笛卡尔坐标来描述六边形,但是由于偏移,这有点奇怪。就像极坐标一样,我们将中心设为(0,0)。每个空间也占据一个坐标,因此“ K”位于(2,0),而不是(1,0)。这会将“ A”置于(-2,2),将“ O”置于(1,-1)。

挑战

给定极坐标六边形坐标,以笛卡尔坐标输出相同的坐标。您可以采用这些坐标,并以任何合理的格式输出答案。这意味着您可以根据需要颠倒输入的顺序。这也意味着您可以将坐标输出为(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
有人用六角形回答这个问题……
FlipTack

为了明确起见,用于测量角度的单位是否取决于半径?(例如,(1,1)与参考角成60°角,但是(2,1)仅30°,因为它离参考角更远,因此那里的字母更多。这个问题似乎暗示着这一点,但这不是极坐标的正常工作方式,因此可能值得解释一下您的坐标系是不同的。

我们是否只需要考虑距原点最多2的距离,或者它必须比原点更远地工作?

@ ais523是的,它是逐步测量的,而不是角度。我已经在帖子中做了一些说明。
詹姆斯

@LevelRiverSt不,理论上它应该适用于任何半径。测试IO上升到
James

Answers:


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以前进到下一页。最后,我们将采取所有剩余步骤来到达目的地。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.