在锯齿形的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