微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从原点迭代离散二维网格上的向外螺旋的算法

如何解决从原点迭代离散二维网格上的向外螺旋的算法

直接的“临时”解决方案没有错。它也可以足够干净。 只需注意螺旋是由段构建的。您可以从当前片段旋转90度获得下一个片段。并且每旋转两圈,线段的长度就会增加1。

插图,这些段编号

   ... 11 10
7 7 7 7 6 10
8 3 3 2 6 10
8 4 . 1 6 10
8 4 5 5 5 10
8 9 9 9 9  9

    // (di, dj) is a vector - direction in which we move right Now
    int di = 1;
    int dj = 0;
    // length of current segment
    int segment_length = 1;

    // current position (i, j) and how much of current segment we passed
    int i = 0;
    int j = 0;
    int segment_passed = 0;
    for (int k = 0; k < NUMBER_OF_POINTS; ++k) {
        // make a step, add 'direction' vector (di, dj) to current position (i, j)
        i += di;
        j += dj;
        ++segment_passed;
        System.out.println(i + " " + j);

        if (segment_passed == segment_length) {
            // done with current segment
            segment_passed = 0;

            // 'rotate' directions
            int buffer = di;
            di = -dj;
            dj = buffer;

            // increase segment length if necessary
            if (dj == 0) {
                ++segment_length;
            }
        }
    }

要改变原来的方向,看的原始值didj。要将旋转切换为顺时针方向,请参见如何修改这些值。

解决方法

例如,这是预期螺旋的形状(以及迭代的每个步骤)

          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,1],[0,[-1,-1],[2,2],[-2,0]..

等等

我已经尝试过搜索,但是我不确定要搜索的内容到底是什么,而我尝试过的搜索却出现了死胡同。

我什至不知道从哪里开始,除了凌乱,微妙和临时的东西,例如为每层创建/编码新的螺旋线。

谁能帮我入门?

另外,是否有一种方法可以轻松地在顺时针和逆时针(方向)之间切换,以及从哪个方向“开始”螺旋运动?(旋转)

此外,是否有一种方法可以递归执行此操作?


我的应用程序

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

为此,我将调用grid.find_closest_available_point_to(point),它将在上面给定的螺旋上进行迭代,并返回第一个为空且可用的位置。

因此,首先,它将进行检查point+[0,0](仅出于完整性考虑)。然后它将检查point+[1,0]。然后它将检查point+[1,1]。然后point+[0,1],等等。并返回第一个网格中的位置为空(或尚未被数据点占用)的位置。

网格大小没有上限。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。