c++实现四叉树效果的方法

  介绍

这篇文章主要介绍了c++实现四叉树效果的方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获、下面让小编带着大家一起了解一下。

<强>什么是四叉树?

 C + +实现四叉树效果的方法

如图,设想,

红框表示地图,星星表示单位,黄框表现范围,

要处理地图中范围内的单位,最直接的做法是筛选所有单位。

通过上图可以看到一个显而易见的问题,大部分单位都不需要被处理。

如果把地图分成块,只筛选范围覆盖的块中的单位,这样就可以减少很多不必要的筛选。

 C + +实现四叉树效果的方法

四叉树可以有效解决这个问题。

树的每一层都把地图划分四块,根据地图尺寸来决定树的层数,层数越大划分越细。

当需要对某一范围的单位筛选时,只需要定位到与范围相交的树区域,再对其区域内的对象筛选即可。

<强>四叉树的实现

# pragma 一次   # include “base.h"   # include “math.h"   template  & lt; class  Value>   class  Tree4  {   私人:   ,struct  Pointer  {   ,Tree4  * LT, RT, *, *磅,,* RB;   ,指针():LT (nullptr), RT (nullptr),磅(nullptr), RB (nullptr)   ,{}   ,~指针()   ,{   SAFE_DELETE才能(LT);   SAFE_DELETE才能(RT);   SAFE_DELETE才能(磅);   SAFE_DELETE才能(RB);   ,}   ,};   公众:   ,Tree4 (const  MATH  Rect ,矩形,,size_t  n =, 0):, _rect(矩形)   ,{   ,STD  queue< Tree4  *祝辞,队列;   ,queue.push(这个);   ,for  (auto  c =, 1,, n  !=, 0;,, n, c  *=, 4)   ,{   for 才能;(auto 小姐:=,0;,小姐:!=,c;, + + i)   {才能   auto 才能;tree =, queue.front ();   树才能→根();   queue.pop才能();   queue.push才能(树→_pointer.LT);   queue.push才能(树→_pointer.RT);   queue.push才能(树→_pointer.LB);   queue.push才能(树→_pointer.RB);   ,,}   ,}   ,}   ,template  & lt; class  Range>   ,bool 插入(const  Value  *,价值,const  Range ,,范围)   ,{   ,auto  tree =,包含(范围);   ,auto  ret =, nullptr  !=,树;   ,if  (ret),{,树→_values.emplace_back(价值);,}   ,return 回收;   ,}   ,template  & lt; class  Range>   ,bool 删除(const  Value  *,价值,,const  Range ,,范围)   ,{   ,auto  tree =,包含(范围);   ,auto  ret =, nullptr  !=,树;   ,if  (ret), {, ret =,树→删除(价值);,}   ,return 回收;   ,}   ,template  & lt; class  Range>   ,bool 匹配(const  Range ,,,, const  STD  function   ,Tree4  *,包含(const  Range ,,范围)   ,{   ,Tree4 *, ret =, nullptr;   ,if  (MATH 包含(STD  cref (_rect),范围))   ,{   if 才能;(! IsLeaf ())   {才能   if 才能;(nullptr ==,随著,ret =, _pointer.LT→包含(范围);   if 才能;(nullptr ==,随著,ret =, _pointer.RT→包含(范围);   if 才能;(nullptr ==,随著,ret =, _pointer.LB→包含(范围);   if 才能;(nullptr ==,随著,ret =, _pointer.RB→包含(范围);   ,,}   if 才能;(nullptr ==,随著   时间=ret 才能;;   ,}   ,return 回收;   ,}   私人:   ,void 根()   ,{=,,_pointer.LT  new  Tree4 (MATH 矩形(_rect.x, _rect.y,, _rect.w  *, 0.5 f, _rect.h  *, 0.5 f));=,,_pointer.LB  new  Tree4 (MATH 矩形(_rect.x, _rect.y  +, _rect.h  *, 0.5 f, _rect.w  *, 0.5 f, _rect.h  *, 0.5 f));=,,_pointer.RT  new  Tree4 (MATH 矩形(时间+ _rect.x  _rect.w  *, 0.5 f, _rect.y,, _rect.w  *, 0.5 f, _rect.h  *, 0.5 f));   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

c++实现四叉树效果的方法