什么是四叉树?

如图,设想,
红框表示地图,星星表示单位,黄框表现范围,
要处理地图中范围内的单位,最直接的做法是筛选所有单位。
通过上图可以看到一个显而易见的问题,大部分单位都不需要被处理。
如果把地图分成块,只筛选范围覆盖的块中的单位,这样就可以减少很多不必要的筛选。
四叉树可以有效解决这个问题。
树的每一层都把地图划分四块,根据地图尺寸来决定树的层数,层数越大划分越细。
当需要对某一范围的单位筛选时,只需要定位到与范围相交的树区域,再对其区域内的对象筛选即可。
四叉树的实现
#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四叉树
# C++实现PatchMatch图像修复算法
# C语言实现九大排序算法的实例代码
# C/C++实现快速排序算法的思路及原理解析
# C语言实现页面置换算法
# c++ STL常用遍历算法
# C语言实现抢红包算法
# c++如何实现Base64算法
# C++迷宫问题的求解算法
# 详解C语言实现空间索引四叉树
# 遍历
# 小编
# 层数
# 都不
# 在此
# 给大家
# 可以看到
# 就可
# 点击此处
# 只需要
# 如图
# 越大
# 很明显
# 显而易见
# 都把
# 所述
# 给我留言
# 图中
# 解决这个问题
# 感谢大家
相关文章:
历史网站制作软件,华为如何找回被删除的网站?
武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?
如何通过远程VPS快速搭建个人网站?
黑客入侵网站服务器的常见手法有哪些?
宝塔面板如何快速创建新站点?
详解jQuery中基本的动画方法
如何在腾讯云免费申请建站?
测试制作网站有哪些,测试性取向的权威测试或者网站?
青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?
如何在Ubuntu系统下快速搭建WordPress个人网站?
常州企业网站制作公司,全国继续教育网怎么登录?
建站之星各版本价格是多少?
利用JavaScript实现拖拽改变元素大小
如何基于云服务器快速搭建网站及云盘系统?
建站主机如何安装配置?新手必看操作指南
开心动漫网站制作软件下载,十分开心动画为何停播?
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
如何快速搭建支持数据库操作的智能建站平台?
北京建设网站制作公司,北京古代建筑博物馆预约官网?
如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本
娃派WAP自助建站:免费模板+移动优化,快速打造专业网站
大连网站制作公司哪家好一点,大连买房网站哪个好?
如何在阿里云域名上完成建站全流程?
较简单的网站制作软件有哪些,手机版网页制作用什么软件?
上海网站制作开发公司,上海买房比较好的网站有哪些?
头像制作网站在线制作软件,dw网页背景图像怎么设置?
javascript中对象的定义、使用以及对象和原型链操作小结
,制作一个手机app网站要多少钱?
中山网站推广排名,中山信息港登录入口?
linux top下的 minerd 木马清除方法
建站主机与虚拟主机有何区别?如何选择最优方案?
如何用VPS主机快速搭建个人网站?
网站制作软件有哪些,制图软件有哪些?
定制建站模板如何实现SEO优化与智能系统配置?18字教程
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
网站按钮制作软件,如何实现网页中按钮的自动点击?
宝塔新建站点为何无法访问?如何排查?
成都网站制作公司哪家好,四川省职工服务网是做什么用?
单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?
免费ppt制作网站,有没有值得推荐的免费PPT网站?
制作网站外包平台,自动化接单网站有哪些?
建站主机数据库如何配置才能提升网站性能?
建站之星代理费用多少?最新价格详情介绍
如何在万网自助建站中设置域名及备案?
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
如何获取PHP WAP自助建站系统源码?
已有域名如何免费搭建网站?
建站之星官网登录失败?如何快速解决?
重庆网站制作公司哪家好,重庆中考招生办官方网站?
c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】
*请认真填写需求信息,我们会在24小时内与您取得联系。