struct aoi_space {
int w;
int h;
int nx;
int ny;
struct grid * grid_list;
};
struct grid {
int gid;
struct map * object_map;
};
struct object {
int id;
int position[2];
};
grid_list 可以直接使用数组,因为 gid 是从 0 开始且连续的。
object_map 是一个 hash 表,因为 object id 是不连续的。
再定义操作接口:
// op: 'e' enter
// op: 'l' leave
// op: 'm' move
typedef void (AoiCallback)(int watcher, int marker, char op);
struct aoi_space * aoi_new(int w, int h, int nx, int ny, AoiCallback cb);
void aoi_delete(struct aoi_space * aoi);
void aoi_enter(struct aoi_space * aoi, int id, int x, int y);
void aoi_leave(struct aoi_space * aoi, int id);
void aoi_move(struct aoi_space * aoi, int id, int x, int y);
参考
1. 九宫格
绘制如下的 2D 的地图:
计算九宫格:
用当前格子坐标加上上面的二维数组就能找出周围的九个格子(包括自己),当然处于边界的时候需要判断坐标的范围。
首先确定数据结构如下图:
数据结构的定义大概是下面这样的:
grid_list
可以直接使用数组,因为 gid 是从 0 开始且连续的。object_map
是一个 hash 表,因为 object id 是不连续的。再定义操作接口:
这里从接口可以看出:
方案实现规则引用 co lin 的描述:
aoi_callback(watcher, marker, 'e')
,双方都发送 enter 事件,然后把自己加入到 grid 里。aoi_callback(watcher, marker, 'l')
,然后把自己从 grid 里删除。为了简化代码实现,还是用 Lua 来实现示例。主要原因是如果实现 map 就觉得代码长了几行,如果是正式环境还是用 C 实现更高效。
Lua 代码实现在这里 https://github.com/hanxi/aoi
2. 十字链表
有空再研究。。。