|
|
// 希望能够给大家带来便利
// 以下为声明部分
/**
* 节点特性
*/
template<class T>
struct PL_NodeTrait
{
// 释放节点对象
int release(T* pNode)
{
return 0;
}
};
/**
* 节点筛选器
*/
template<class T>
struct PL_NodeFilter
{
int operator ()(const T& V1)
{
return 0;
}
};
/**
* 节点管理方法: 4叉分割树
*/
template<
class Node,
class ValueType = float,
class Trait = PL_NodeTrait<Node>,
template <class> class Allocator = std::allocator
>
class PL_NodeManagerQuadTree
{
protected:
int _count_node; // 节点个数统计
// 子管理节点
typedef PL_NodeManagerQuadTree<Node, ValueType> ChildsType;
Allocator<ChildsType> _childs_allocator;
ChildsType* _childs; // 子管理节点
// 子节点
typedef std::list<Node*> NodesType;
NodesType* _nodes;
ValueType _minx, _miny, _maxx, _maxy;
private:
inline void _zero(void)
{
_count_node = 0;
_childs = 0;
_nodes = 0;
}
inline void _filter(Node* pNode, std::list<Node*>* pNodes, PL_NodeFilter<Node>** ppFilter, size_t nNumFilter)const
{
for(size_t i=0; i<nNumFilter; ++i, ++ppFilter, ++pNodes)
{
if( (*(*ppFilter))( *pNode ) )
{
pNodes->push_back( pNode );
}
}
}
public:
// 创建树
void create(ValueType MinX, ValueType MinY, ValueType MaxX, ValueType MaxY, ValueType CellX, ValueType CellY)
{
clear();
_nodes = new NodesType();
_minx = MinX;
_miny = MinY;
_maxx = MaxX;
_maxy = MaxY;
// 判断是否需要创建子节点
ValueType vx = (MaxX - MinX)/2;
ValueType vy = (MaxY - MinY)/2;
if( CellX <= vx && CellY <= vy )
{
// 增加子管理节点
_childs = _childs_allocator.allocate( 4 );
_childs[0]._zero();
_childs[0].create( MinX, MinY, MinX + vx, MinY + vy, CellX, CellY );
_childs[1]._zero();
_childs[1].create( MinX + vx, MinY, MinX + vx + vx, MinY + vy, CellX, CellY );
_childs[2]._zero();
_childs[2].create( MinX, MinY + vy, MinX + vx, MinY + vy + vy, CellX, CellY );
_childs[3]._zero();
_childs[3].create( MinX + vx, MinY + vy, MinX + vx + vx, MinY + vy + vy, CellX, CellY );
}
}
// 清除所有对象
void clear(void)
{
if( _childs )
{
_childs[0].clear();
_childs[1].clear();
_childs[2].clear();
_childs[3].clear();
_childs_allocator.deallocate( _childs, 4 );
}
if( _nodes )
{
for(NodesType::iterator iter=_nodes->begin(); iter!=_nodes->end(); ++iter)
{
Trait().release( *iter );
//(*iter)->release();
}
delete _nodes;
}
_zero();
}
// 增加一个节点对象
bool add_node(Node* pNode, ValueType X, ValueType Y)
{
// 是否能增加到子节点
if( _childs )
{
if( _childs[0].add_node( pNode, X, Y ) ||
_childs[1].add_node( pNode, X, Y ) ||
_childs[2].add_node( pNode, X, Y ) ||
_childs[3].add_node( pNode, X, Y ) )
{
++ _count_node;
return true;
}
}
// 增加到当前位置
if( _nodes && X >= _minx && X < _maxx && Y >= _miny && Y < _maxy )
{
++ _count_node;
_nodes->push_back( pNode );
return true;
}
return false;
}
// 删除一个节点
bool del_node(Node* pNode, bool bAutoRelease=false)
{
if( !_count_node )
return false;
// 当前节点查找
if( _nodes )
{
for(NodesType::iterator iter=_nodes->begin(); iter!=_nodes->end(); ++iter)
{
if( pNode == (*iter) )
{
if( bAutoRelease )
Trait().release( pNode );
_nodes->erase( iter );
-- _count_node;
return true;
}
}
}
// 子节点查找
if( _childs )
{
if( _childs[0].del_node( pNode ) ||
_childs[1].del_node( pNode ) ||
_childs[2].del_node( pNode ) ||
_childs[3].del_node( pNode ) )
{
-- _count_node;
return true;
}
}
return false;
}
// 得到节点
void get_nodes(std::list<Node*>* pNodes, PL_NodeFilter<Node>** ppFilter, size_t nNumFilter)const
{
// 当前节点查找
if( _nodes )
{
for(NodesType::iterator iter=_nodes->begin(); iter!=_nodes->end(); ++iter)
{
_filter( *iter, pNodes, ppFilter, nNumFilter );
}
}
// 子节点查找
if( _childs )
{
_childs[0].get_nodes( pNodes, ppFilter, nNumFilter );
_childs[1].get_nodes( pNodes, ppFilter, nNumFilter );
_childs[2].get_nodes( pNodes, ppFilter, nNumFilter );
_childs[3].get_nodes( pNodes, ppFilter, nNumFilter );
}
}
PL_NodeManagerQuadTree()
{
_zero();
}
~PL_NodeManagerQuadTree()
{
clear();
}
}; |
|