#include "AccessDistancePathVerifier.h" //------------------------------------------------------------------------------ CAccessDistancePathVerifier::CAccessDistancePathVerifier( int iMapID, int iSizeX, int iSizeY, unsigned int** ppuiMapInfo) : CPathVerifier(iMapID, iSizeX, iSizeY, ppuiMapInfo), m_ucAccessDistance(0), m_iHalfSizeX(iSizeX>>1) { _Init(); _MapInfo2AccessDistance(ppuiMapInfo); } //------------------------------------------------------------------------------ CAccessDistancePathVerifier::~CAccessDistancePathVerifier(void) { if (m_ucAccessDistance == 0) return; for (int i=0; i= 1.75f*M_PI || fAngle < 0.25f*M_PI) { // 向右的方向, major x dx = 1.0f; dy = tan(fAngle); } else if (fAngle >= 0.25f*M_PI && fAngle< 0.75f*M_PI) { // 向上, major y dy = 1.0f; dx = 1.0f / tan(fAngle); } else if (fAngle >= 0.75f*M_PI && fAngle < 1.25f*M_PI) { // 向左, major x dx = -1.0f; dy = -tan(fAngle); } else // fAngle >= 1.25f && fAngle < 1.75f { // 向下, major y dy = -1.0f; dx = 1.0f / tan(fAngle); } m_arrDx[i] = dx; m_arrDy[i] = dy; } } //------------------------------------------------------------------------------ // 计算每个 grid 在周围几个方向的 access distance void CAccessDistancePathVerifier::_MapInfo2AccessDistance(unsigned int** ppuiMapInfo) { if (m_ucAccessDistance != 0) return; // 初始化过了 int iNumGrid = m_iSizeY * m_iSizeX; // 临时数组, 用于放置每个 Grid 在各方向实际到达的距离 float** ppRealAccessDistance = new float* [iNumGrid]; float** ppSmoothAccessDistance = new float*[iNumGrid]; // 遍历 Grids, 计算每个 grid 在各方向所能到达的最大距离 for (int i=0, iGridID=0; i>1, iHalfY = m_iSizeY>>1; m_ucAccessDistance = new unsigned char* [iHalfX * iHalfY]; for (int i=0, iHalfGridID=0; i