亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++實(shí)現(xiàn)四叉樹效果(附源碼下載)

 更新時(shí)間:2017年03月27日 10:21:34   作者:落單的毛毛蟲  
這篇文章主要介紹了C++實(shí)現(xiàn)四叉樹效果(附源碼下載),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下

什么是四叉樹?

如圖,設(shè)想,

紅框表示地圖,星星表示單位,黃框表現(xiàn)范圍,

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

通過(guò)上圖可以看到一個(gè)顯而易見的問(wèn)題,大部分單位都不需要被處理。

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

四叉樹可以有效解決這個(gè)問(wèn)題。

樹的每一層都把地圖劃分四塊,根據(jù)地圖尺寸來(lái)決定樹的層數(shù),層數(shù)越大劃分越細(xì)。

當(dāng)需要對(duì)某一范圍的單位篩選時(shí),只需要定位到與范圍相交的樹區(qū)域,再對(duì)其區(qū)域內(nèi)的對(duì)象篩選即可。

四叉樹的實(shí)現(xiàn)

#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;
};

代碼簡(jiǎn)潔,通俗易懂,承讓。

效果圖

左側(cè)全圖遍歷,右側(cè)四叉樹遍歷,通過(guò)左上角的開銷時(shí)間,差異很明顯。

下載源碼點(diǎn)擊此處

以上所述是小編給大家介紹的C++實(shí)現(xiàn)四叉樹效果(附源碼下載),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • C++實(shí)現(xiàn)郵件群發(fā)的方法

    C++實(shí)現(xiàn)郵件群發(fā)的方法

    這篇文章主要介紹了C++實(shí)現(xiàn)郵件群發(fā)的方法,較為詳細(xì)的分析了郵件發(fā)送的原理與C++相關(guān)實(shí)現(xiàn)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-07-07
  • C語(yǔ)言之飛機(jī)大戰(zhàn)游戲

    C語(yǔ)言之飛機(jī)大戰(zhàn)游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言之飛機(jī)大戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • Qt中parent()函數(shù)的具體使用

    Qt中parent()函數(shù)的具體使用

    你會(huì)發(fā)現(xiàn)幾乎所有的Qt類的構(gòu)造函數(shù)都會(huì)有一個(gè)parent參數(shù),本文主要介紹了Qt中parent()函數(shù)的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • C++11中初始化列表initializer lists的使用方法

    C++11中初始化列表initializer lists的使用方法

    C++11引入了初始化列表來(lái)初始化變量和對(duì)象,自定義類型,如果想用初始化列表就要包含initializer_list頭文件
    2021-09-09
  • C語(yǔ)言求字符串長(zhǎng)度的四種方法實(shí)例代碼

    C語(yǔ)言求字符串長(zhǎng)度的四種方法實(shí)例代碼

    在C語(yǔ)言的應(yīng)用過(guò)程中經(jīng)常性的會(huì)用到字符串,以及對(duì)字符串的長(zhǎng)度進(jìn)行計(jì)算的問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言求字符串長(zhǎng)度的四種方法的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • MFC LoadImage用法案例詳解

    MFC LoadImage用法案例詳解

    這篇文章主要介紹了MFC LoadImage用法案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 深入理解C++中的new和delete并實(shí)現(xiàn)對(duì)象池

    深入理解C++中的new和delete并實(shí)現(xiàn)對(duì)象池

    這篇文章主要介紹了C++中的new和delete并實(shí)現(xiàn)對(duì)象池,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • 詳解C++類的成員函數(shù)做友元產(chǎn)生的循環(huán)依賴問(wèn)題

    詳解C++類的成員函數(shù)做友元產(chǎn)生的循環(huán)依賴問(wèn)題

    這篇文章主要為大家詳細(xì)介紹了C++類的成員函數(shù)做友元產(chǎn)生的循環(huán)依賴問(wèn)題,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • C語(yǔ)言實(shí)現(xiàn)醫(yī)院管理系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)醫(yī)院管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)醫(yī)院管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • C語(yǔ)言編程之三個(gè)方法實(shí)現(xiàn)strlen函數(shù)

    C語(yǔ)言編程之三個(gè)方法實(shí)現(xiàn)strlen函數(shù)

    本篇文章是C語(yǔ)言編程篇,主要為大家介紹C語(yǔ)言編程中實(shí)現(xiàn)strlen函數(shù)的三個(gè)方法講解,有需要的朋友可以借鑒參考下,希望可以有所幫助
    2021-09-09

最新評(píng)論