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

首頁 > 編程 > 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武林網網站的支持!

 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩av网址在线观看| 91精品国产色综合| 自拍亚洲一区欧美另类| 不卡伊人av在线播放| 亚洲一区二区三区xxx视频| 精品亚洲aⅴ在线观看| 久久久亚洲欧洲日产国码aⅴ| 97超视频免费观看| 久久男人资源视频| 国产一区二区三区直播精品电影| 俺去啦;欧美日韩| 国产va免费精品高清在线观看| 国产精品爽爽爽爽爽爽在线观看| 色无极亚洲影院| 日韩成人在线电影网| 中文字幕欧美在线| 欧美日韩国产精品专区| www.国产精品一二区| 欧美与黑人午夜性猛交久久久| 91超碰caoporn97人人| 中文字幕一区日韩电影| 亚洲精品电影在线| 美女福利视频一区| 欧美午夜电影在线| 久久久久免费精品国产| 亚洲性夜色噜噜噜7777| 亚洲国产精品yw在线观看| 欧美大全免费观看电视剧大泉洋| 精品美女久久久久久免费| 久久精品国产一区| 国产精品日韩久久久久| 91久久久国产精品| 日本久久久久久久久| 成人免费福利在线| 欧美激情图片区| 98精品国产自产在线观看| 少妇高潮久久77777| 欧美wwwwww| 日韩最新在线视频| 亚洲国产又黄又爽女人高潮的| 国精产品一区一区三区有限在线| 亚洲人成电影在线播放| 国产福利视频一区二区| 国产一区二区久久精品| 国模叶桐国产精品一区| 中文字幕在线看视频国产欧美在线看完整| 精品自拍视频在线观看| 国产精品美女免费看| 色偷偷88888欧美精品久久久| 亚洲影院在线看| 亚洲成人久久久| 国产视频久久久| 亚洲国产成人久久综合一区| 97精品国产97久久久久久春色| 亚洲a区在线视频| 日韩精品在线观看网站| 国产成人精品久久二区二区91| 久久久久久久久爱| 亚洲美女在线观看| 欧美性生交xxxxxdddd| 96精品视频在线| 亚洲va电影大全| 国产91色在线播放| 精品久久久国产精品999| 中文字幕国产亚洲| 欧美精品成人在线| 欧美视频第一页| 亚洲人成在线观看| 色哟哟入口国产精品| 欧美亚洲国产日韩2020| 国产香蕉一区二区三区在线视频| 日韩视频在线免费观看| 国产精品扒开腿做爽爽爽的视频| 精品久久久一区| 久久国产精品视频| 亚洲精品久久久久久下一站| 精品免费在线视频| 欧美孕妇与黑人孕交| 欧美一二三视频| 成人有码在线视频| 成人国产在线视频| 欧美日韩加勒比精品一区| 国产精品视频色| 国产亚洲欧美aaaa| 亚洲午夜小视频| 日韩免费观看网站| 成人欧美一区二区三区在线湿哒哒| 欧美极品在线播放| 日韩精品在线电影| 国产一区视频在线| 国产精品h在线观看| 日本韩国在线不卡| 欧美激情网站在线观看| 91禁国产网站| 精品亚洲一区二区三区在线播放| 久久天堂av综合合色| 18性欧美xxxⅹ性满足| 国产97在线播放| 日韩免费在线看| 日韩成人激情在线| 国产精品久久久久久久久| 日本一本a高清免费不卡| 亚洲成色777777女色窝| 亚洲一级片在线看| 国产综合香蕉五月婷在线| 亚洲日本成人女熟在线观看| 国产精品吴梦梦| 国产精品久久久久久网站| 免费不卡在线观看av| 欧美性猛交99久久久久99按摩| 欲色天天网综合久久| 亚洲自拍小视频免费观看| 久久精品国产一区二区电影| 欧美性高跟鞋xxxxhd| 成人黄色片网站| 一本大道亚洲视频| 欧美激情啊啊啊| 黄色成人在线免费| 国产脚交av在线一区二区| 国产精品91久久久久久| 日韩av电影在线网| 欧美激情一区二区三区在线视频观看| 日韩免费不卡av| 人妖精品videosex性欧美| 中文字幕精品av| 性色av一区二区三区在线观看| 91av在线国产| 久久久久国产一区二区三区| 亚洲国产精品久久久久久| 国产亚洲欧美另类中文| 国产日本欧美视频| 中文字幕视频一区二区在线有码| www.久久草.com| 欧美久久久精品| 18久久久久久| 日韩人在线观看| 91久热免费在线视频| 欧美午夜精品久久久久久浪潮| 欧美激情高清视频| 岛国精品视频在线播放| 国产精品入口日韩视频大尺度| 91精品国产自产在线老师啪| 精品久久久久久久久中文字幕| 国产日韩欧美黄色| 国产精品福利观看| 欧美亚洲伦理www| 国产精品久久久久久久久久东京| 成人福利在线观看| 精品久久久久久久久久ntr影视| 欧美激情欧美狂野欧美精品| 日本道色综合久久影院| 成人亲热视频网站| 成人精品在线观看| 日本精品久久久久影院| 久久中国妇女中文字幕| 成人免费看黄网站| 成人黄色在线播放| 国产午夜一区二区| 欧美巨乳美女视频| 中文字幕精品一区久久久久| 国产女精品视频网站免费| 日韩中文在线观看| 成人黄色免费在线观看| 亚洲精品99久久久久中文字幕|