螺旋矩阵之扩展
为了名誉
这篇文章 网络小乞丐 写于2021-03-28
螺旋矩阵
试着实现这么一种诡异的数组
在上大学的时候有小人走迷宫撞墙实现思路,不过我觉得应该有个数学函数之类的,一直琢磨,最后还是琢磨出来了
static int GetIndex(int x, int y)
{
if (y >= x && y > -x)
{
return 4 * y * y + 3 * y + x;
}
else if (y < x &&y >= -x)
{
return 4 * x * x - 3 * x - y;
}
else if (y <= x && y < -x)
{
return 4 * y * y + y - x;
}
else if (y > x && y <= -x)
{
return 4 * x * x + y - x;
}
return 0;
}
还好没有丢了,本来该丢了,不过想想这个函数还是挺有用的,要是重新推导还是挺难得,就记录一下。
通过这么一个函数就可以在坐标确定的情况下输出螺旋矩阵。
不过,有个关注的地方就是,中心点是坐标原点。就如这样子的
有什么用呢
单纯的写一个螺旋矩阵其实没有什么用,但是这个函数的作用其实挺大的,可以达到二维转化一维的效果。
想想二维平面怎么把空间分割编号,想一下AOI的九宫格算法。
假如用这个思想实现AOI算法,可以很方便的知道某个坐标是不是有某个对象,当然需要每一个格子有一个空间管理器。不过因为和空间坐标相关,管理器的管理就方便多了,当有对象需要和某个空间位置发生操作时,可以很快找到这个空间管理器,这就高大上了。
三维呢
二维可以化为一维,那么三维呢,也是可以的,不过就难了点,下面是结果,也是利用了二维的思想,不过组织方式就666了。
这个是结果
三维代码
static int Increase( int x, int y)
{
if (y >= x && y > -x)
{
return 4 * y * y + 3 * y + x;
}
else if (y < x && y >= -x)
{
return 4 * x * x - 3 * x - y;
}
else if (y <= x && y < -x)
{
return 4 * y * y + y - x;
}
else if (y > x && y <= -x)
{
return 4 * x * x + y - x;
}
return 0;
}
static int Get3DIndex(int x, int y, int z)
{
int abx = Math.Abs(x);
int aby = Math.Abs(y);
int abz = Math.Abs(z);
int level = abx > aby ? (abx > abz ? abx : abz) : (aby > abz ? aby : abz);
int squre = 2 * level + 1;
int cube = 2 * (level - 1) + 1;
int levelcube = squre * squre * squre;
int cubeSum = cube * cube * cube;
int squreSum = squre * squre;
//层顶
if (abz == level && z > 0)
{
return Increase(x, y) + cubeSum + 1;
}
else if (abz == level && z < 0)//层底
{
return levelcube - Increase(y, x);
}
else if (aby == level && y > 0 && abz != level && x > -level)
{
return cubeSum + squreSum + 8 * level * (level - z - 1) + 6 * level + level + x ;
}
else if (abx == level && x > 0 && abz != level && y < level)
{
return cubeSum + squreSum + 8 * level * (level - z - 1) + level - y;
}
else if (aby == level && y < 0 && abz != level && x < level)
{
return cubeSum + squreSum + 8 * level * (level - z - 1) + 2 * level + level - x;
}
else if (abx == level && x < 0 && abz != level && y > - level)
{
return cubeSum + squreSum + 8 * level * (level - z - 1) + 4 * level + level + y;
}
return 1;
}
三维空间有什么用呢?
可以通过某个坐标很快的找到所属的空间。可以用到场景管理或者具有飞行业务的三维游戏中。
把立方体划分为不同的格子,每一个格子可以通过坐标算出具体的索引,是不是很有意思。
能用到哪里?
AOI
很明显可以用到AOI算法里面,每一个格子都可以有一个空间管理器来维护,因为根据坐标可以算出空间索引,开局就不用创建空间管理器了。
地图导出和加载
二维螺旋矩阵,地图导出和动态加载,做无缝地图的时候可以用到。因为是二维化为一维,在无缝大地图的导出的时候可以按照空间一块一块的处理导出,同样的,加载的时候可以根据角色位置算出需要加载的地图资源。
空间管理
实现场景管理器的时候我觉得还是可以引入的,不过还在思考中,需要细细考究,
最后
这个问题琢磨的时间其实挺久的,有时候会不由自主的想起来,终于总结了一下,算是了了自己一个心愿吧。