/** @file PathVerifier.h
@brief 地图可行走验证, 记录每个 grid 在周围方向所能到达的最大距离
* Copyright (c) 2007,第九城市游戏研发中心
* All rights reserved.
*
* 当前版本:
* 作 者:Shi Yazheng
* 完成日期:2009-09-27
*
* 取代版本:
* 作 者:
* 完成日期:
*/
#ifndef ACCESSDISTANCEPATHVERIFIER_H
#define ACCESSDISTANCEPATHVERIFIER_H
#include "pathverifier.h"
#define _USE_MATH_DEFINES
#include
#include
#include
// 测试 0 ~ PI 范围内的多少个方向
#define NUM_AROUND_DIRECTIONS 16
class CAccessDistancePathVerifier : public CPathVerifier
{
public:
CAccessDistancePathVerifier(int iMapID, int iSizeX, int iSizeY, unsigned int** ppuiMapInfo);
virtual ~CAccessDistancePathVerifier(void);
// 实现虚函数
virtual inline bool VerifiyWalkable(
int iStartX, int iStartY, int iEndX, int iEndY);
protected:
// 计算每个 grid 在周围几个方向的 access distance
void _MapInfo2AccessDistance(unsigned int** ppuiMapInfo);
// 初始化 dx, dy 数组
void _Init();
// grid 坐标转换为 grid id
inline int _GridPos2ID(int iX, int iY);
// 交换两个整数
inline void _Swap(int& i, int& k);
// 判断 uiMapInfo 表示的 grid 是否阻挡点
inline bool _IsBlock(unsigned int uiGridInfo);
// 用 dda 算法取得沿某方向所能到达的最远距离, 超过 256 时记为256
// iStartX, iStartY 开始点
// k 第几个方向
// pMapInfo 地图信息数组
inline float _DDAGetAccessDistance(int iStartX, int iStartY, int k, unsigned int** ppuiMapInfo);
// 获取iX, iY 周围 grid 往 kDir 方向所能到达的最大值
inline float _GetMaxAccessAround(int iX, int iY, float** ppRealAccDist, int iDir);
// 获取iX ,iY 往 kDir 方向所能到达的最大值
inline float _GetAccessDistance(int iX, int iY, float** ppRealAccDist, int iDir);
// 记录地图每个 Grid 向周围 NUM_AROUNT_DIRECTIONS 方向所能到达的最大距离.
// m_ucAccessDistance[id] 为 0 表示该点本身不可行走
unsigned char** m_ucAccessDistance; // [m_iSizeX/2*m_iSizeY/2][NUM_AROUND_DIRECTIONS+1]
// 每个方向上 dda 算法的步进值
float m_arrDx[NUM_AROUND_DIRECTIONS+1];
float m_arrDy[NUM_AROUND_DIRECTIONS+1];
float m_fDAngle; // PI / NUM_AROUND_DIRECTIONS
float m_fHalfDAngle; // m_fDAngle / 2
int m_iHalfSizeX; // m_iSizeX / 2
};
#include "AccessDistancePathVerifier.inl"
#endif