国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++實現四叉樹效果(附源碼下載)

2020-05-23 13:49:13
字體:
來源:轉載
供稿:網友

什么是四叉樹?

C++,四叉樹,源碼下載

如圖,設想,

紅框表示地圖,星星表示單位,黃框表現范圍,

要處理地圖中范圍內的單位,最直接的做法是篩選所有單位。

通過上圖可以看到一個顯而易見的問題,大部分單位都不需要被處理。

如果把地圖分成塊,只篩選范圍覆蓋的塊中的單位,這樣就可以減少很多不必要的篩選。

C++,四叉樹,源碼下載

四叉樹可以有效解決這個問題。

樹的每一層都把地圖劃分四塊,根據地圖尺寸來決定樹的層數,層數越大劃分越細。

當需要對某一范圍的單位篩選時,只需要定位到與范圍相交的樹區域,再對其區域內的對象篩選即可。

四叉樹的實現

#pragma once#include "base.h"#include "math.h"template <class Value>class Tree4 {private: struct Pointer { Tree4 *LT, *RT, *LB, *RB; Pointer() :LT(nullptr), RT(nullptr), LB(nullptr), RB(nullptr) { } ~Pointer() {  SAFE_DELETE(LT);  SAFE_DELETE(RT);  SAFE_DELETE(LB);  SAFE_DELETE(RB); } };public: Tree4(const MATH Rect &rect, size_t n = 0): _rect(rect) { STD queue<Tree4 *> queue; queue.push(this); for (auto c = 1; n != 0; --n, c *= 4) {  for (auto i = 0; i != c; ++i)  {  auto tree = queue.front();  tree->Root();  queue.pop();  queue.push(tree->_pointer.LT);  queue.push(tree->_pointer.RT);  queue.push(tree->_pointer.LB);  queue.push(tree->_pointer.RB);  } } } template <class Range> bool Insert(const Value * value, const Range & range) { auto tree = Contain(range); auto ret = nullptr != tree; if (ret) { tree->_values.emplace_back(value); } return ret; } template <class Range> bool Remove(const Value * value, const Range & range) { auto tree = Contain(range); auto ret = nullptr != tree; if (ret) { ret = tree->Remove(value); } return ret; } template <class Range> bool Match(const Range & range, const STD function<bool(Value *)> & func) { if (!MATH intersect(_rect, range)) {  return true; } for (auto & value : _values) {  if (!func(const_cast<Value *>(value)))  {  return false;  } } auto ret = true; if (!IsLeaf()) {  if (ret) ret = _pointer.LT->Match(range, func);  if (ret) ret = _pointer.RT->Match(range, func);  if (ret) ret = _pointer.LB->Match(range, func);  if (ret) ret = _pointer.RB->Match(range, func); } return ret; } template <class Range> Tree4 * Contain(const Range & range) { Tree4<Value> * ret = nullptr; if (MATH contain(STD cref(_rect), range)) {  if (!IsLeaf())  {  if (nullptr == ret) ret = _pointer.LT->Contain(range);  if (nullptr == ret) ret = _pointer.RT->Contain(range);  if (nullptr == ret) ret = _pointer.LB->Contain(range);  if (nullptr == ret) ret = _pointer.RB->Contain(range);  }  if (nullptr == ret)  ret = this; } return ret; }private: void Root() { _pointer.LT = new Tree4(MATH Rect(_rect.x, _rect.y, _rect.w * 0.5f, _rect.h * 0.5f)); _pointer.LB = new Tree4(MATH Rect(_rect.x, _rect.y + _rect.h * 0.5f, _rect.w * 0.5f, _rect.h * 0.5f)); _pointer.RT = new Tree4(MATH Rect(_rect.x + _rect.w * 0.5f, _rect.y, _rect.w * 0.5f, _rect.h * 0.5f)); _pointer.RB = new Tree4(MATH Rect(_rect.x + _rect.w * 0.5f, _rect.y + _rect.h * 0.5f, _rect.w * 0.5f, _rect.h * 0.5f)); } bool Remove(const Value * value) { auto iter = STD find(_values.begin(), _values.end(), value); auto ret = _values.end() != iter; if (ret) { _values.erase(iter); } return ret; } bool IsLeaf() { return nullptr == _pointer.LT  || nullptr == _pointer.RT  || nullptr == _pointer.LB  || nullptr == _pointer.RB; } Tree4(const Tree4 &) = delete; Tree4(Tree4 &&) = delete; Tree4 &operator=(const Tree4 &) = delete; Tree4 &operator=(Tree4 &&) = delete;private: MATH Rect _rect; Pointer _pointer; STD list<const Value *> _values;};

代碼簡潔,通俗易懂,承讓。

效果圖

C++,四叉樹,源碼下載

左側全圖遍歷,右側四叉樹遍歷,通過左上角的開銷時間,差異很明顯。

下載源碼點擊此處

以上所述是小編給大家介紹的C++實現四叉樹效果(附源碼下載),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VEVB武林網網站的支持!

 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 翁牛特旗| 隆化县| 宣恩县| 朔州市| 禹城市| 宝应县| 芮城县| 文成县| 滕州市| 洪江市| 平安县| 普安县| 延长县| 凯里市| 余干县| 社旗县| 德惠市| 隆回县| 苏尼特左旗| 芜湖县| 都兰县| 余姚市| 东丽区| 永康市| 江门市| 马山县| 昂仁县| 司法| 思南县| 泽州县| 桂平市| 望奎县| 临江市| 昌江| 沾化县| 石嘴山市| 南漳县| 易门县| 丰宁| 余姚市| 和硕县|