四叉树地图在计算机和机器人领域应用的很广,但是初学者可能会发现四叉树地图有各种不同的实现方式,很多在机器人领域不适用或是在计算机存储领域不适用。今天我就讲解下各类四叉树的实现方式和应用场景。
史上最详细四叉树地图不同技术应用和代码详解
本文禁止转载,主要是为了有不同见解的同学可以方便联系我,我的邮箱 fanzexuan135@163.com
四叉树地图:应用与研究综述
1. 引言
四叉树地图是一种重要的空间索引结构,广泛应用于机器人导航、计算机图形学、地理信息系统等领域。通过递归地将二维空间划分为四个象限,形成层次化的树状结构,四叉树地图能够高效地组织和检索空间数据。本文将深入探讨四叉树地图的应用场景、主要变体及其研究进展,重点关注在机器人领域的应用。
2. 四叉树地图的基本概念
四叉树地图的核心思想是将二维空间递归地划分为四个大小相等的象限,直到满足特定的停止条件,如达到最大深度或象限内的数据量低于阈值。每个节点都有四个子节点,分别对应于左上、右上、左下和右下四个象限。通过这种层次化的划分,四叉树地图能够高效地索引和查询空间数据。
标准四叉树(Standard Quadtree)是最基本的四叉树形式,其构建过程如下:
- 将整个二维空间作为根节点的边界。
- 递归地将当前节点的空间划分为四个象限,生成四个子节点。
- 重复步骤2,直到满足停止条件,如达到最大深度或象限内的数据量低于阈值。
标准四叉树的查询过程通常从根节点开始,递归地判断查询区域与当前节点的交集,并访问相关的子节点,直到找到所有满足条件的数据。
Finkel和Bentley[1]在1974年首次提出了四叉树的概念,并讨论了其在检索复合键数据方面的应用。Samet[2]在1984年的综述文章中全面介绍了四叉树及其相关的层次化数据结构。
3. 四叉树地图的变体
为了适应不同的应用场景和数据特点,研究者们提出了多种四叉树地图的变体,下面介绍几种主要的变体:
3.1 点区域四叉树(Point-Region Quadtree)
点区域四叉树用于存储点数据,其构建过程与标准四叉树类似,但停止条件变为每个象限内最多包含一个点。叶子节点要么为空,要么包含一个点。点区域四叉树适用于快速检索特定位置附近的点数据。
Samet[3]在其著作中详细讨论了点区域四叉树在计算机图形学、图像处理和地理信息系统中的应用。Hjaltason和Samet[4]提出了一种基于点区域四叉树的距离浏览技术,用于高效地查询空间数据库中的近邻点。
3.2 面区域四叉树(Region Quadtree)
面区域四叉树用于存储二维空间中的面数据,如图像或地图中的区域。其构建过程与标准四叉树类似,但停止条件变为每个象限内的像素值或属性相同,或达到最大深度。面区域四叉树适用于压缩和检索二维区域数据。
Samet[5]研究了基于面区域四叉树的邻域查找技术,用于高效地检索图像中与给定区域相邻的区域。Shneier[6]讨论了使用面区域四叉树计算几何属性的方法,如区域面积、周长等。
区域四叉树是四叉树地图的一种重要变体,主要用于表示和处理二维空间中的区域数据,如图像、地图等。与其他类型的四叉树相比,区域四叉树具有以下特点和应用场景。
3.2.1 特点与应用场景
-
数据表示:区域四叉树适用于表示和存储二维空间中的区域数据,如图像、地图、占据栅格等。每个节点表示一个正方形区域,节点的属性可以是区域的颜色、标签、占据概率等。
-
数据压缩:区域四叉树可以通过合并相似或同质的区域来实现数据压缩。对于大型图像或地图,使用区域四叉树可以显著减少存储空间,提高传输和处理效率。
-
图像分割:区域四叉树可以用于图像分割任务,将图像划分为不同的区域或对象。通过递归地划分和合并区域,可以获得层次化的图像分割结果,有助于后续的图像理解和分析。
-
空间索引:区域四叉树提供了高效的空间索引机制,可以快速查询和检索给定区域内的数据。这在图像检索、地图查询等应用中非常有用。
-
图像处理:区域四叉树可以用于各种图像处理任务,如图像滤波、增强、分割等。通过在四叉树上进行相应的操作,可以实现高效、多尺度的图像处理算法。
3.2.2 与其他四叉树的区别
-
与标准四叉树的区别:标准四叉树主要用于点数据的存储和检索,而区域四叉树专门用于处理区域数据。区域四叉树的节点表示正方形区域,而不是单个点。
-
与点区域四叉树的区别:点区域四叉树的叶子节点要么为空,要么包含一个点;而区域四叉树的叶子节点表示一个同质的区域,可以包含多个像素或网格。
-
与线性四叉树的区别:线性四叉树主要用于优化点数据的存储和检索,使用线性编码方案;而区域四叉树则专注于表示和处理区域数据,通常使用树形结构。
3.2.3 代码示例
以下是一个简单的区域四叉树示例代码,用于表示和压缩二值图像:
class RegionQuadTreeNode:def __init__(self, image, x, y, size):self.image = imageself.x = xself.y = yself.size = sizeself.value = Noneself.children = []def is_leaf(self):return len(self.children) == 0def subdivide(self):if self.is_leaf():half_size = self.size // 2self.children = [RegionQuadTreeNode(self.image, self.x, self.y, half_size),RegionQuadTreeNode(self.image, self.x + half_size, self.y, half_size),RegionQuadTreeNode(self.image, self.x, self.y + half_size, half_size),RegionQuadTreeNode(self.image, self.x + half_size, self.y + half_size, half_size)]for child in self.children:child.build()def build(self):if self.size == 1:self.value = self.image[self.y][self.x]else:self.subdivide()def compress(self, threshold):if self.is_leaf():returnif all(child.is_leaf() and child.value == self.children[0].value for child in self.children):self.value = self.children[0].valueself.children = []else:for child in self.children:child.compress(threshold)def reconstruct(self, image):if self.is_leaf():for y in range(self.y, self.y + self.size):for x in range(self.x, self.x + self.size):image[y][x] = self.valueelse:for child in self.children:child.reconstruct(image)# 示例用法
image = [[0, 0, 1, 1],[0, 0, 1, 1],[1, 1, 0, 0],[1, 1, 0, 0]
]tree = RegionQuadTreeNode(image, 0, 0, len(image))
tree.build()
tree.compress(threshold=1)reconstructed_image = [[0] * len(image) for _ in range(len(image))]
tree.reconstruct(reconstructed_image)print("Original image:")
for row in image:print(row)print("Reconstructed image:")
for row in reconstructed_image:print(row)
该示例代码实现了一个简单的区域四叉树,用于表示和压缩二值图像。RegionQuadTreeNode
类表示区域四叉树的节点,包含区域的位置、大小和像素值等属性。build
方法用于构建区域四叉树,compress
方法用于合并相似的区域,reconstruct
方法用于从区域四叉树重建图像。
示例代码首先创建一个二值图像,然后构建区域四叉树,并进行压缩。最后,从压缩后的区域四叉树重建图像,并输出原始图像和重建后的图像。
区域四叉树在图像处理、计算机图形学、地理信息系统等领域有广泛的应用。通过合理利用区域四叉树的特性,可以开发出高效、智能的算法和系统,处理大规模的区域数据。
3.3 线性四叉树(Linear Quadtree)
线性四叉树是一种用于存储点数据的四叉树变体,其特点是将二维空间映射到一维空间,从而提高存储效率。每个节点用一个整数编码表示其在树中的位置,通过位运算可以快速计算父子节点之间的关系。线性四叉树适用于存储稀疏点数据。
Gargantini[7]提出了一种基于线性四叉树的紧凑表示方法,使用一个整数序列来编码节点位置,显著减少了存储开销。Abel和Smith[8]研究了基于线性四叉树的矩形检索算法,通过线性编码加速空间查询。
线性四叉树是四叉树地图的另一种重要变体,主要用于优化点数据的存储和检索效率。与其他类型的四叉树相比,线性四叉树具有以下特点和应用场景。
3.3.1 特点与应用场景
-
空间填充曲线:线性四叉树利用空间填充曲线(如Morton编码、Hilbert曲线等)将二维或高维空间映射为一维空间,从而将点数据转化为一维序列。这种映射方式保留了空间局部性,相邻的点在一维序列中也相邻。
-
紧凑存储:线性四叉树通过一维序列来表示点数据,避免了显式存储树结构,因此具有更紧凑的存储方式。这对于存储大规模点云数据、高维数据非常有利。
-
快速检索:线性四叉树支持高效的范围查询和最近邻查询。通过对一维序列进行二分查找或顺序扫描,可以快速定位查询范围内的点,避免了遍历整个树结构的开销。
-
数据压缩:线性四叉树可以通过合并连续的空节点来实现数据压缩。在稀疏数据集中,这种压缩方式可以显著减少存储空间。
-
空间数据库:线性四叉树常用于空间数据库的索引结构,如PostgreSQL的SP-GiST索引。它能够高效地支持空间查询,如点查询、范围查询、最近邻查询等。
3.3.2 与其他四叉树的区别
-
与标准四叉树的区别:标准四叉树使用树形结构来表示空间划分,而线性四叉树则使用一维序列来表示点数据,通过空间填充曲线来保留空间局部性。
-
与点区域四叉树的区别:点区域四叉树的叶子节点包含单个点,而线性四叉树的节点可以表示多个点,通过一维序列来存储。
-
与区域四叉树的区别:区域四叉树用于表示和处理区域数据,而线性四叉树主要用于优化点数据的存储和检索。
3.3.3 代码示例
以下是一个简单的线性四叉树示例代码,使用Morton编码实现二维点数据的插入和范围查询:
def morton_encode(x, y):morton_code = 0for i in range(16):morton_code |= (x & (1 << i)) << i | (y & (1 << i)) << (i + 1)return morton_codedef morton_decode(morton_code):x = 0y = 0for i in range(16):x |= (morton_code >> (2 * i)) & 1 << iy |= (morton_code >> (2 * i + 1)) & 1 << ireturn x, yclass LinearQuadTree:def __init__(self):self.points = []def insert(self, x, y):morton_code = morton_encode(x, y)self.points.append((morton_code, (x, y)))self.points.sort()def range_query(self, x_min, y_min, x_max, y_max):morton_min = morton_encode(x_min, y_min)morton_max = morton_encode(x_max, y_max)start = self._binary_search(morton_min)end = self._binary_search(morton_max)return [p[1] for p in self.points[start:end+1]]def _binary_search(self, morton_code):left = 0right = len(self.points) - 1while left <= right:mid = (left + right) // 2if self.points[mid][0] < morton_code:left = mid + 1else:right = mid - 1return left# 示例用法
tree = LinearQuadTree()
tree.insert(1, 2)
tree.insert(3, 4)
tree.insert(5, 6)
tree.insert(7, 8)query_result = tree.range_query(2, 3, 6, 7)
print("Query result:", query_result)
该示例代码实现了一个简单的线性四叉树,使用Morton编码将二维点数据映射为一维Morton码,并存储在一个有序列表中。insert
方法用于插入点数据,range_query
方法用于执行范围查询,返回给定查询矩形内的所有点。
示例代码首先定义了morton_encode
和morton_decode
函数,分别用于将二维坐标编码为Morton码和将Morton码解码为二维坐标。然后定义了LinearQuadTree
类,包含insert
方法用于插入点数据,range_query
方法用于执行范围查询,以及_binary_search
方法用于在有序列表中进行二分查找。
示例代码插入了几个点数据,然后执行一个范围查询,输出查询结果。
线性四叉树在空间数据库、点云数据存储、高维数据索引等领域有广泛的应用。通过利用空间填充曲线和紧凑存储,线性四叉树能够高效地支持大规模点数据的存储和查询,提供了一种优化的空间索引方法。
3.4 X-Quad树(X-Quadtree)
X-Quad树是一种结合标准四叉树和线性四叉树特点的变体,旨在优化机器人导航中的路径规划和环境表示。X-Quad树的构建过程如下:
- 将二维空间递归地划分为四个象限,直到达到预设的最大深度或满足其他停止条件。
- 对于每个节点,使用线性编码方案(如Morton编码)为其分配一个唯一的整数标识符。
- 根据节点的线性编码,将节点按照特定的顺序存储在一维数组中。
- 在进行空间查询时,首先根据查询区域的线性编码计算出相关的节点范围,然后在一维数组中进行高效的查找和检索。
X-Quad树的优点包括紧凑的存储、快速查询和良好的适应性。Wurm等人[9]在其论文中介绍了OctoMap,一种基于八叉树(Octree)的概率三维地图表示,其中使用了类似X-Quad树的线性编码方案。Einhorn等人[10]提出了一种自适应分辨率的网格地图方法,根据数据分布动态调整网格大小,与X-Quad树的思想相似。
4. 四叉树地图在机器人领域的应用
四叉树地图在机器人导航、环境建模和路径规划等任务中有着广泛的应用。下面结合示例代码,讨论X-Quad树在机器人领域的典型应用场景。
4.1 环境表示与建模
机器人导航需要对环境进行表示和建模,以支持定位、路径规划等任务。X-Quad树可以用于构建紧凑、高效的环境地图。示例代码中的XQuadTreeNode
类实现了X-Quad树的基本功能,包括插入点数据、划分空间和查询区域内的点等。
通过递归地划分空间,X-Quad树能够自适应地表示不同分辨率的环境细节。在稀疏区域,可以使用较大的网格;在密集区域,可以使用较小的网格。这种自适应性使得X-Quad树能够在有限的存储空间内表示大型、复杂的环境。
4.2 路径规划与导航
基于X-Quad树的环境地图,机器人可以进行高效的路径规划和导航。示例代码中的query_range
方法展示了如何在X-Quad树中查询指定区域内的点数据,这是路径规划的基础。
通过分层查询X-Quad树,可以快速确定机器人周围的可通行区域和障碍物分布。在路径规划时,可以利用X-Quad树的空间索引结构,加速路径搜索和优化过程。例如,可以在X-Quad树上应用A*算法,通过启发式估计和剪枝策略,找到从起点到目标点的最优路径。
4.3 碰撞检测与避障
机器人导航过程中,需要实时进行碰撞检测和避障,以确保安全。X-Quad树可以用于高效地检测机器人与环境中障碍物的碰撞。
示例代码中的query_range
方法可以用于查询机器人周围的障碍物分布。通过将机器人的边界框与X-Quad树中的节点进行交集测试,可以快速判断是否存在碰撞风险。根据碰撞检测的结果,机器人可以调整运动方向和速度,实现实时避障。
4.4 占据栅格地图构建
占据栅格地图是机器人导航中常用的一种环境表示方法,它将环境划分为固定大小的网格,并标记每个网格是否被占据。X-Quad树可以用于构建占据栅格地图,并支持动态更新。
示例代码中的insert
方法展示了如何将点数据插入到X-Quad树中。通过将传感器数据(如激光雷达点云)插入到X-Quad树,并统计每个网格内的点数量,可以构建占据栅格地图。X-Quad树的自适应性使得它能够在不同分辨率下表示占据信息,提高地图的精度和效率。
5. 总结与展望
四叉树地图是一种强大的空间索引结构,在机器人导航、计算机图形学、地理信息系统等领域有着广泛的应用。本文介绍了四叉树地图的基本概念、主要变体及其研究进展,重点讨论了X-Quad树在机器人领域的应用。
通过示例代码,我们展示了如何使用X-Quad树表示环境地图、进行路径规划、碰撞检测和占据栅格地图构建。X-Quad树的自适应性、紧凑存储和快速查询等特点,使其成为机器人导航中的理想选择。
未来的研究方向包括进一步优化X-Quad树的存储和查询效率,结合机器学习技术自适应地调整X-Quad树的参数,以及将X-Quad树扩展到三维空间和动态环境中。此外,将X-Quad树与其他传感器数据融合,如视觉信息和语义信息,也是一个有趣的研究方向。
总之,四叉树地图及其变体在机器人导航中扮演着重要的角色。通过深入理解和应用四叉树地图,我们可以开发出更加智能、高效、鲁棒的机器人系统,推动机器人技术的不断发展。
6. 示例代码解析
本节将详细解析提供的X-Quad树示例代码,并讨论其中各个方法的应用场景和差异。
import random
import matplotlib.pyplot as plt
import matplotlib.patches as patches# 定义表示矩形边界的Rectangle类
class Rectangle:def __init__(self, x, y, w, h):self.x = xself.y = yself.w = wself.h = hdef contains(self, point):return (self.x <= point.x < self.x + self.w andself.y <= point.y < self.y + self.h)def intersects(self, other):return not (self.x + self.w <= other.x orother.x + other.w <= self.x orself.y + self.h <= other.y orother.y + other.h <= self.y)def draw(self, ax):rect = patches.Rectangle((self.x, self.y), self.w, self.h, linewidth=1, edgecolor='black', facecolor='none')ax.add_patch(rect)# 定义表示点的Point类
class Point:def __init__(self, x, y):self.x = xself.y = y# 定义表示x-quad树节点的XQuadTreeNode类
class XQuadTreeNode:def __init__(self, boundary, depth):self.boundary = boundaryself.depth = depthself.points = []self.divided = Falseself.northwest = Noneself.northeast = Noneself.southwest = Noneself.southeast = Nonedef insert(self, point):if not self.boundary.contains(point):return Falseif self.depth == 0:self.points.append(point)return Trueif not self.divided:self.subdivide()if self.northwest.insert(point):return Trueif self.northeast.insert(point):return Trueif self.southwest.insert(point):return Trueif self.southeast.insert(point):return Truereturn Falsedef subdivide(self):x, y, w, h = self.boundary.x, self.boundary.y, self.boundary.w, self.boundary.hself.northwest = XQuadTreeNode(Rectangle(x, y, w/2, h/2), self.depth - 1)self.northeast = XQuadTreeNode(Rectangle(x+w/2, y, w/2, h/2), self.depth - 1)self.southwest = XQuadTreeNode(Rectangle(x, y+h/2, w/2, h/2), self.depth - 1)self.southeast = XQuadTreeNode(Rectangle(x+w/2, y+h/2, w/2, h/2), self.depth - 1)self.divided = Truedef query_range(self, boundary):points = []if not self.boundary.intersects(boundary):return pointsfor point in self.points:if boundary.contains(point):points.append(point)if self.divided:points.extend(self.northwest.query_range(boundary))points.extend(self.northeast.query_range(boundary))points.extend(self.southwest.query_range(boundary))points.extend(self.southeast.query_range(boundary))return pointsdef draw(self, ax):self.boundary.draw(ax)for point in self.points:ax.plot(point.x, point.y, 'ko', markersize=2)if self.divided:self.northwest.draw(ax)self.northeast.draw(ax)self.southwest.draw(ax)self.southeast.draw(ax)# 创建x-quad树
boundary = Rectangle(0, 0, 800, 600)
quad_tree = XQuadTreeNode(boundary, 6)# 模拟机器人轨迹
for _ in range(1000):x = random.randint(0, 800)y = random.randint(0, 600)point = Point(x, y)quad_tree.insert(point)# 绘制x-quad树和机器人轨迹
fig, ax = plt.subplots(figsize=(8, 6))
quad_tree.draw(ax)
ax.set_xlim(0, 800)
ax.set_ylim(0, 600)
ax.set_aspect('equal')
ax.set_title('x-quad tree')
plt.show()
6.1 Rectangle类
Rectangle
类表示一个矩形区域,用于定义X-Quad树节点的边界。它包含以下方法:
__init__(self, x, y, w, h)
:初始化矩形的位置和大小。contains(self, point)
:判断给定点是否在矩形内部。intersects(self, other)
:判断两个矩形是否相交。draw(self, ax)
:在Matplotlib的Axes对象上绘制矩形。
Rectangle
类的主要作用是为X-Quad树提供空间划分和边界表示的功能。在机器人导航中,可以使用Rectangle
类来表示机器人的工作空间、感知范围或障碍物的边界。
6.2 Point类
Point
类表示二维平面上的一个点,包含x
和y
坐标。在示例代码中,Point
类用于表示机器人轨迹上的点。在实际应用中,Point
类可以扩展为包含其他属性,如时间戳、置信度等,以满足不同的需求。
6.3 XQuadTreeNode类
XQuadTreeNode
类是X-Quad树的核心部分,表示树的节点。它包含以下方法:
__init__(self, boundary, depth)
:初始化节点的边界和深度。insert(self, point)
:将一个点插入到X-Quad树中。subdivide(self)
:将当前节点划分为四个子节点。query_range(self, boundary)
:查询给定矩形范围内的所有点。draw(self, ax)
:在Matplotlib的Axes对象上绘制X-Quad树。
XQuadTreeNode
类的insert
方法实现了将点插入到X-Quad树中的逻辑。如果当前节点的深度为0,表示达到了叶子节点,直接将点存储在当前节点中。否则,如果当前节点还没有划分,就调用subdivide
方法进行划分,然后递归地将点插入到对应的子节点中。
subdivide
方法将当前节点的空间划分为四个象限,生成四个子节点。这个过程体现了X-Quad树自适应划分空间的特点。在点密集的区域,X-Quad树会进行更细粒度的划分;在点稀疏的区域,划分粒度较粗。
query_range
方法用于查询给定矩形范围内的所有点。它首先判断查询矩形与当前节点的边界是否相交,如果不相交,直接返回空结果。否则,对当前节点内的所有点进行判断,并递归地查询子节点。这个过程利用了X-Quad树的空间索引特性,可以快速定位相关的点。
draw
方法用于可视化X-Quad树的结构和点的分布情况。它递归地绘制节点的边界和内部的点,直观地展示了X-Quad树的划分结果。
6.4 应用场景与差异
示例代码中的X-Quad树主要用于存储和查询二维平面上的点数据,特别适用于机器人轨迹的表示和分析。通过自适应地划分空间,X-Quad树可以高效地组织和检索大量的轨迹点。
与其他类型的四叉树相比,X-Quad树有以下特点:
-
与标准四叉树相比,X-Quad树使用线性编码方案(如Morton编码)为节点分配唯一标识符,提高了存储和查询效率。
-
与点区域四叉树相比,X-Quad树不限制每个节点只能包含一个点,因此更适合表示密集的点云数据。
-
与面区域四叉树相比,X-Quad树主要用于处理点数据,而不是区域数据。但X-Quad树可以扩展为存储其他类型的数据,如线段、多边形等。
-
与线性四叉树相比,X-Quad树保留了树形结构,便于进行区域查询和邻域分析。同时,X-Quad树利用线性编码加速了节点的定位和检索。
总的来说,X-Quad树综合了标准四叉树和线性四叉树的优点,在机器人导航、轨迹分析、点云处理等领域有广泛的应用前景。
7. 未来研究方向
尽管X-Quad树已经展现出优异的性能和应用潜力,但仍有许多值得探索的研究方向。以下是几个有前景的研究方向:
-
动态更新:随着机器人的运动,环境地图和轨迹数据会不断变化。如何高效地更新X-Quad树,同时保持其性能和一致性,是一个具有挑战性的问题。
-
三维扩展:将X-Quad树扩展到三维空间,形成X-Octree(X-八叉树),可以处理更复杂的环境和任务,如三维重建、碰撞检测等。
-
多传感器融合:将X-Quad树与其他传感器数据(如视觉、雷达、惯性等)进行融合,可以构建更完整、准确的环境模型,提高机器人的感知和决策能力。
-
语义信息集成:在X-Quad树中集成语义信息,如物体类别、属性等,可以实现语义级别的环境理解和交互,如语义地图构建、自然语言导航等。
-
机器学习结合:利用机器学习技术,如深度学习、强化学习等,自适应地调整X-Quad树的参数和结构,提高其在不同场景下的性能和鲁棒性。
这些研究方向的探索和突破,将进一步提升X-Quad树在机器人领域的应用价值,推动智能机器人技术的发展。
8. 结论
上面全面介绍了四叉树地图的概念、变体及其在机器人领域的应用。重点讨论了X-Quad树这一优化的四叉树变体,通过示例代码详细解析了其数据结构和算法。X-Quad树综合了标准四叉树和线性四叉树的优点,在机器人导航、环境表示、路径规划等任务中展现出优异的性能。
未来的研究方向包括动态更新、三维扩展、多传感器融合、语义信息集成和机器学习结合等。这些方向的探索将进一步提升X-Quad树的应用价值,推动智能机器人技术的发展。
总之,四叉树地图,特别是X-Quad树,是机器人领域的重要工具和研究热点。深入理解和应用四叉树地图,对于开发高效、智能、鲁棒的机器人系统具有重要意义。随着研究的不断深入和技术的进步,四叉树地图必将在未来的机器人应用中发挥更大的作用。
参考文献
[1] Finkel, R. A., & Bentley, J. L. (1974). Quad trees a data structure for retrieval on composite keys. Acta informatica, 4(1), 1-9.
[2] Samet, H. (1984). The quadtree and related hierarchical data structures. ACM Computing Surveys (CSUR), 16(2), 187-260.
[3] Samet, H. (1990). Applications of spatial data structures: Computer graphics, image processing, and GIS. Addison-Wesley Longman Publishing Co., Inc.
[4] Hjaltason, G. R., & Samet, H. (1999). Distance browsing in spatial databases. ACM Transactions on Database Systems (TODS), 24(2), 265-318.
[5] Samet, H. (1982). Neighbor finding techniques for images represented by quadtrees. Computer graphics and image processing, 18(1), 37-57.
[6] Shneier, M. (1981). Calculations of geometric properties using quadtrees. Computer Graphics and Image Processing, 16(3), 296-302.
[7] Gargantini, I. (1982). An effective way to represent quadtrees. Communications of the ACM, 25(12), 905-910.
[8] Abel, D. J., & Smith, J. L. (1983). A data structure and algorithm based on a linear key for a rectangle retrieval problem. Computer Vision, Graphics, and Image Processing, 24(1), 1-13.
[9] Wurm, K. M., Hornung, A., Bennewitz, M., Stachniss, C., & Burgard, W. (2010). OctoMap: A probabilistic, flexible, and compact 3D map representation for robotic systems. Proceedings of the ICRA 2010 workshop on best practice in 3D perception and modeling for mobile manipulation, 2.
[10] Einhorn, E., Schröter, C., & Groß, H. M. (2011). Finding the adequate resolution for grid mapping-Cell sizes locally adapting on-the-fly. 2011 IEEE International Conference on Robotics and Automation, 1843-1848.