亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

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

2020-01-26 14:12:46
字體:
來源:轉載
供稿:網友

什么是四叉樹?

如圖,設想,

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

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

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

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

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

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

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

四叉樹的實現

#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++實現四叉樹效果(附源碼下載),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩在线视频一区| 欧美在线视频免费播放| 日韩免费av在线| 日韩欧美在线播放| 日韩中文字幕在线看| 日韩av电影国产| 国产日韩欧美夫妻视频在线观看| 一区二区三区精品99久久| 国产精品第10页| 中文字幕一区日韩电影| 福利精品视频在线| 国产精品丝袜视频| 久久久久久久久久久免费| 欧美一区二区色| 日韩精品在线看| 国产精品久久久久久久久免费| 欧美性极品xxxx做受| 久久久精品在线观看| 8x拔播拔播x8国产精品| 日韩欧美在线视频观看| 国产精品mp4| 午夜精品久久久久久久久久久久久| 欧美xxxx做受欧美.88| 成人国产精品一区| 69久久夜色精品国产7777| 国产香蕉97碰碰久久人人| 国a精品视频大全| 国内精品久久久久久影视8| 国产+成+人+亚洲欧洲| 欧美在线视频免费观看| 亚洲午夜未满十八勿入免费观看全集| 日韩综合中文字幕| 久久久久久久久久亚洲| 国产欧美一区二区三区久久| 国产一区二区三区在线观看网站| 97色在线观看| 欧美另类交人妖| 精品亚洲aⅴ在线观看| 亚洲精品白浆高清久久久久久| 日韩av高清不卡| 国产成人精品亚洲精品| 欧美性猛交xxxxx免费看| 欧美成人h版在线观看| 久热精品视频在线| 91成人在线视频| 精品久久久999| 久久精品亚洲精品| 欧美华人在线视频| 久久久av免费| 久久亚洲欧美日韩精品专区| 伊人久久久久久久久久久| 久99九色视频在线观看| 久久久天堂国产精品女人| 国产美女搞久久| 欧美在线中文字幕| 成人伊人精品色xxxx视频| 亲爱的老师9免费观看全集电视剧| 黄色一区二区三区| 欧美一级电影免费在线观看| 久久久精品视频成人| 亚洲四色影视在线观看| 久久久这里只有精品视频| 欧美美女15p| 欧美性猛交xxxx偷拍洗澡| 在线国产精品播放| 91成人国产在线观看| 97视频在线观看播放| 国产玖玖精品视频| 欧美性69xxxx肥| 日韩在线视频播放| 国产精品视频26uuu| 欧美性少妇18aaaa视频| 在线视频欧美性高潮| 性欧美视频videos6一9| 亚洲精品黄网在线观看| 欧美性xxxxx| 亚洲国内高清视频| 欧洲中文字幕国产精品| 欧美成人午夜激情视频| 全色精品综合影院| 欧美多人爱爱视频网站| 国产有码一区二区| 日韩精品免费在线播放| 欧美极品欧美精品欧美视频| 欧美激情一区二区三区在线视频观看| 国产97在线播放| 日本免费久久高清视频| 国产精品福利在线观看| 欧美亚洲午夜视频在线观看| 欧美xxxx14xxxxx性爽| 色婷婷久久av| 欧美精品激情在线观看| 亚洲性猛交xxxxwww| 国产成人激情视频| 亚洲国产中文字幕久久网| 国产视频久久久| 久久久国产在线视频| 久久影院资源站| 久久久久久久国产| 日韩av手机在线| 日韩欧美国产高清91| 琪琪第一精品导航| 国产在线精品自拍| 日韩成人av在线播放| 日韩精品免费在线视频观看| 成人两性免费视频| 九九久久精品一区| 欧美日韩精品在线视频| 成人网欧美在线视频| 欧美激情国产高清| 成人性生交大片免费看视频直播| 国产精品亚洲激情| 在线日韩第一页| 最新91在线视频| 日韩欧美在线免费观看| 精品视频偷偷看在线观看| 色老头一区二区三区在线观看| 中文字幕欧美专区| 色老头一区二区三区| 国产精品成人av在线| 国产欧美精品在线| 亚洲成人网在线| 精品露脸国产偷人在视频| 欧美激情一区二区三级高清视频| 国产国产精品人在线视| 91香蕉国产在线观看| 亚洲精品中文字幕有码专区| 欧美激情成人在线视频| 欧美巨猛xxxx猛交黑人97人| 黄色成人在线播放| 欧美日韩在线视频首页| 欧美在线观看www| 欧美激情久久久| 欧美激情xxxx性bbbb| 国产一区二区三区欧美| 欧美激情精品久久久久久| 91久久精品久久国产性色也91| 欧美激情视频免费观看| www.色综合| 久久精品视频导航| 国产精品视频免费观看www| 亚洲精品国产电影| 亚洲欧美三级在线| 热门国产精品亚洲第一区在线| 欧美大尺度电影在线观看| 亚洲人精品午夜在线观看| 精品久久久视频| 少妇精69xxtheporn| 懂色av影视一区二区三区| 韩国一区二区电影| 亚洲国产欧美久久| 亚洲电影在线观看| 欧美福利视频网站| 亚洲一区二区精品| 成人激情视频免费在线| 欧美电影免费观看网站| 亚洲激情国产精品| 国产亚洲激情视频在线| 亚洲成人黄色网址| 国产精欧美一区二区三区| 色999日韩欧美国产| 精品久久久香蕉免费精品视频| 中文字幕一精品亚洲无线一区| 日本a级片电影一区二区|