日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
C++實現(xiàn)四叉樹效果的方法-創(chuàng)新互聯(lián)

這篇文章主要介紹了C++實現(xiàn)四叉樹效果的方法,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

創(chuàng)新互聯(lián)建站服務項目包括噶爾網(wǎng)站建設、噶爾網(wǎng)站制作、噶爾網(wǎng)頁制作以及噶爾網(wǎng)絡營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關系等,向廣大中小型企業(yè)、政府機構等提供互聯(lián)網(wǎng)行業(yè)的解決方案,噶爾網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務的客戶以成都為中心已經(jīng)輻射到噶爾省份的部分城市,未來相信會繼續(xù)擴大服務區(qū)域并繼續(xù)獲得客戶的支持與信任!

什么是四叉樹?

C++實現(xiàn)四叉樹效果的方法

如圖,設想,

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

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

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

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

C++實現(xiàn)四叉樹效果的方法

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

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

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

四叉樹的實現(xiàn)

#pragma once
#include "base.h"
#include "math.h"
template 
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 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 
 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 
 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 
 bool Match(const Range & range, const STD function & func)
 {
 if (!MATH intersect(_rect, range))
 {
  return true;
 }
 for (auto & value : _values)
 {
  if (!func(const_cast(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 
 Tree4 * Contain(const Range & range)
 {
 Tree4 * 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 _values;
};

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

效果圖

C++實現(xiàn)四叉樹效果的方法

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

感謝你能夠認真閱讀完這篇文章,希望小編分享的“C++實現(xiàn)四叉樹效果的方法”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián)建站,關注創(chuàng)新互聯(lián)網(wǎng)站建設公司行業(yè)資訊頻道,更多相關知識等著你來學習!

另外有需要云服務器可以了解下創(chuàng)新互聯(lián)建站www.cdcxhl.com,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。


當前標題:C++實現(xiàn)四叉樹效果的方法-創(chuàng)新互聯(lián)
分享網(wǎng)址:http://www.dlmjj.cn/article/dcsogs.html