在锯齿形的2D网格上向外螺旋

我的问题与其他问题非常相似:

以螺旋方式循环

在二维网格上有一个公式,我可以用它来以一种向外的模式螺旋坐标?

但是,如果你的网格/矩阵不规则,你会怎么做?

我正在创建一个游戏,其中有一些“座位”,以2D网格表示。 在每一个奇数行上,少一个座位/小区。 渲染时,这些行将偏移1/2席位。 我需要一种算法来输出最接近的座位,相对于我输入的任何座位坐标,按降序排列,如下所示(蓝色单元格是起始坐标,半透明单元格位于网格之外):

视觉表现

座位网格存储为锯齿状多维数组,因此之前的可视化有点误导。 从“算法”的角度来看,它实际上看起来更像这样(再次,蓝色单元格是起始坐标,半透明单元格在数组边界之外):

真实再现

输出将是类似的

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

这是一种迭代方法,将螺旋分成螺旋的每个环7个子级,从上一个螺旋级移出一个子级,以及6个子级,用于跟踪上一级边界周围的六角形路径:

static void spiralLoop(int startx, int starty, int levels)
{
    int level = 1, sublevel = 0, sublevelstep = 0;
    int x = startx, y = starty;
    while(level <= levels)
    {
        System.out.println("["+x+","+y+"]");

        switch(sublevel)
        {
            case 0:
                x++; // stepping up from previous (next innermost) loop
                break;
            case 1:
                x+=(y&1);y++; // up and right
                break;
            case 2:
                x-=(~y&1);y++; // up and left
                break;
            case 3:
                x--; // left
                break;
            case 4:
                x-=(~y&1);y--; // down and left
                break;
            case 5:
                x+=(y&1);y--; // down and right
                break;
            case 6:
                x++; // right
                break;
            default:
                break;
        }

        if(sublevel == 0) // (3)
            sublevel = 1;
        if(++sublevelstep >= level) // (1)
        {
            sublevelstep = 0;
            if(++sublevel > 6) // (2)
            {
                level++;
                sublevel = 0;
            }
        }
    }
}

(1)每个六角形边的长度(次级步数)等于(从1开始的)级。 每次迭代后,步数递增,如果已达到子级的末尾,则子级递增并且步重置为0。

(2)如果等级已完成(子等级> 6),则等级递增并且子等级重置为0。

(3)每个级别的第一个子级别(从上一级别向上移动)仅持续一次迭代。

它不会检查当前位置是否在网格之外,但这很容易添加。

开始x,y位置被传入,并用于初始化x和y。 这些值用于确定当前行是奇数还是偶数,这会影响位置更新的方式。

要向左斜向移动,只能在y为偶数时递减x。 要向右对角移动,仅在y为奇数时增加x。 见下文:

row 0:    0 1 2 3 4 5 6 7 8 9
row 1:     0 1 2 3 4 5 6 7 8
row 2:    0 1 2 3 4 5 6 7 8 9
row 3:     0 1 2 3 4 5 6 7 8
row 4:    0 1 2 3 4 5 6 7 8 9
row 5:     0 1 2 3 4 5 6 7 8
链接地址: http://www.djcxy.com/p/63847.html

上一篇: Spiral outwards on jagged 2D grid

下一篇: Find max points in grid such that a particular point is always covered