天天看点

[game]十字链表的AOI算法实现

AOI主要有九宫格、灯塔和十字链表的算法实现。本文阐述十字链表的实现和尝试。

根据二维地图,将其分成x轴和y轴两个链表。如果是三维地图,则还需要维护多一个z轴的链表。将对象的坐标值按照大小相应的排列在相应的坐标轴上面。

对对象的操作主要有以下三个接口:

add:对象进入地图;

leave:对象离开地图;

move:对象在地图内移动。

既然是链表,很自然地想到用线性表来实现。因为存在向前和向后找的情况,所以使用双链表实现。其实实现也是非常简单,就是两个双链表(这里以二维地图举例)。那么我们的节点需要四个指针,分布为x轴的前后指针,y轴的前后指针。

下面是地图场景信息和接口。这里的实现比较粗略,是带头尾的的双链表,暂时不考虑空间占用的问题。类<code>Scene</code>有分别有一个头尾指针,初始化的时候会为其赋值,主要用<code>DoubleNode</code>类的指针来存储x轴和y轴的头尾。初始化的时候,将<code>_head</code>的next指针指向尾<code>_tail</code>;将<code>_tail</code>的prev指针指向<code>_head</code>。

将<code>DoubleNode</code>对象插入到十字链表中。x轴和y轴分别处理,处理方法基本一致。其实就是双链表的数据插入操作,需要从头开始遍历线性表,对比相应轴上的值的大小,插入到合适的位置。

假设可视范围为x轴2以内,y轴2以内,则运行:

分别插入以下数据a(1,5)、f(6,6)、c(3,1)、b(2,2)、e(5,3),然后插入d(3,3),按照x轴和y轴打印其双链表结果;

插入d(3,3)数据,求其可视AOI范围(如图,除了f(6,6),其它对象都在d的可视范围内)。

控制台结果(前8行):

[game]十字链表的AOI算法实现

步骤1结果图示:

[game]十字链表的AOI算法实现

步骤2结果图示:

[game]十字链表的AOI算法实现

其实都是双链表的基本操作,断掉其相应的指针就好了。按理,是需要

move和leave操作如图,move是将d(3,3)移动到(4,4),然后再打印其AOI范围。

控制台结果:

[game]十字链表的AOI算法实现

移动后AOI范围图示:

[game]十字链表的AOI算法实现

继续阅读