螺旋矩阵之扩展

螺旋矩阵之扩展

为了名誉

这篇文章 网络小乞丐 写于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算法里面,每一个格子都可以有一个空间管理器来维护,因为根据坐标可以算出空间索引,开局就不用创建空间管理器了。

地图导出和加载

二维螺旋矩阵,地图导出和动态加载,做无缝地图的时候可以用到。因为是二维化为一维,在无缝大地图的导出的时候可以按照空间一块一块的处理导出,同样的,加载的时候可以根据角色位置算出需要加载的地图资源。

空间管理

实现场景管理器的时候我觉得还是可以引入的,不过还在思考中,需要细细考究,

最后

这个问题琢磨的时间其实挺久的,有时候会不由自主的想起来,终于总结了一下,算是了了自己一个心愿吧。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

当当小螳螂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值