从原点开始,在一个离散的二维网格上迭代遍历外部螺旋的算法
从原点开始,在一个离散的二维网格上迭代遍历外部螺旋的算法
例如,这是预期螺旋形状的示例(以及每一次迭代的每一步):
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]
,依此类推。并返回第一个在网格中为空(或尚未被数据点占用)的位置。
网格大小没有上限。