从原点开始,在一个离散的二维网格上迭代遍历外部螺旋的算法

9 浏览
0 Comments

从原点开始,在一个离散的二维网格上迭代遍历外部螺旋的算法

例如,这是预期螺旋形状的示例(以及每一次迭代的每一步):

          y
          |
          |
   16 15 14 13 12
   17  4  3  2 11
-- 18  5  0  1 10 --- x
   19  6  7  8  9
   20 21 22 23 24
          |
          |

其中线条表示x和y轴。

以下是算法在每次迭代中返回的实际值(点的坐标):

[0,0],
[1,0], [1,1], [0,1], [-1,1], [-1,0], [-1,-1], [0,-1], [1,-1],
[2,-1], [2,0], [2,1], [2,2], [1,2], [0,2], [-1,2], [-2,2], [-2,1], [-2,0]..

等等。

我尝试搜索过,但不确定应该搜索什么,而且我尝试过的搜索都没有结果。

我甚至不知道从哪里开始,除非像为每一层创建/编码一个新的螺旋那样,这样会变得混乱、不优雅和临时。

有人可以帮我入门吗?

另外,有没有一种可以轻松切换顺时针和逆时针(方向)以及从哪个方向“开始”螺旋的方法?(旋转)

还有,有没有一种递归地完成这个任务的方法?


我的应用程序

我有一个填充有数据点的稀疏网格,并且我想将一个新的数据点添加到网格中,并且使其“尽可能接近”给定的其他点。

为了做到这一点,我会调用grid.find_closest_available_point_to(point),它将遍历上述螺旋形状,并返回第一个为空且可用的位置。

因此,首先它会检查point+[0,0](仅仅是为了完整起见)。然后它会检查point+[1,0]。然后它会检查point+[1,1]。然后是point+[0,1],依此类推。并返回第一个在网格中为空(或尚未被数据点占用)的位置。

网格大小没有上限。

0