螺旋矩阵之扩展

news/2024/7/8 5:36:31

螺旋矩阵之扩展

为了名誉

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

地图导出和加载

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

空间管理

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

最后

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


http://www.niftyadmin.cn/n/3921984.html

相关文章

[UE4]非法delete了数据后导致引擎崩溃的问题

第一次碰到这种崩溃的问题&#xff0c;查了好几天&#xff0c;之前一直怀疑是UE4自身的bug&#xff0c;今天仔细review了下相关代码&#xff0c;还是自己代码问题&#xff0c;备注下&#xff01;&#xff01; 原因是我代码里面有两个变量命名过于相近&#xff0c;在手动delete变…

[UE4]Android编译错误:error: ISO C++11 does not allow conversion from string literal

安卓打包编译代码时报错&#xff1a; error: ISO C11 does not allow conversion from string literal to TCHAR * (aka wchar_t *) [-Werror,-Wwritable-string 解决办法&#xff1a; 将函数中的参数 TCHAR* aaa 改成 const TCHAR* aaa 参考&#xff1a; https://answers.unre…

KBEngine奇技淫巧<一>

KBEngine奇技淫巧<一> 最近在读KBEngine代码&#xff0c;记录一下看到的奇技淫巧 命名规则 KBEngine的CPP命名规则是一个很诡异的命名规则&#xff0c;虽然有迹可循&#xff0c;但是不是匈牙利命名法&#xff0c;所以有点不适应。 成员变量 类内成员的命名是小驼峰下…

[UE4]FBX导入时模型贴图半透明的解决办法

FBX导入UE4后&#xff0c;模型可能是这种半透明的状态&#xff1a; 解决办法&#xff1a; 1&#xff0c;打开模型的Material 2&#xff0c;修改Blend Mode为Masked 或者 Opaque 3&#xff0c;保存、应用即可。

KBEngine奇技淫巧<二>

KBEngine宏定义诡异的宏定义协议处理中的宏定义DEFINE_IN_INTERFACEBASEAPP协议声明宏NETWORK_MESSAGE_HANDLERKBEngine宏定义习惯KBEngine宏的作用诡异的宏定义 KBEngine引擎大约分为资源&#xff0c;脚本&#xff0c;网络&#xff0c;事件[逻辑]四个部分&#xff0c;在每一个…

C++98宏实现std::tuple

原文&#xff1a;http://geek.csdn.net/news/detail/61260 最近准备重构一下我的kapok库&#xff0c;让meta函数可以返回元素为kv的tuple&#xff0c;例如&#xff1a; struct person {std::string name;int age;META(name, age) //定义一个支持变参的meta函数 }; int main() {…

KBEngine奇技淫巧<三>

KBEngine奇技淫巧之操作处理各种Handler运行机制框架组织处理任务逻辑InitProgressHandlerBaseMessagesForwardClientHandler自成系统的handler总结各种Handler 研读KBEngine源码的时候&#xff0c;你经常会看到各种Handler结尾的类&#xff0c;搞懂这些类是很有必要的。我们以…

[UE4]AI中使用Tick()函数的性能问题

Tick()函数一般是debug时用的&#xff0c;正规的逻辑中&#xff0c;如果要用Tick函数&#xff0c;可以考虑用UE4提供的事件代理(Event Delegate&#xff1a;http://aigo.iteye.com/blog/2301010)。 参考&#xff1a;Using Tick() within AI? https://answers.unrealengine.com…