介绍
这篇文章主要介绍了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++实现四叉树效果的方法