史上最详细四叉树地图不同技术应用和代码详解

四叉树地图在计算机和机器人领域应用的很广,但是初学者可能会发现四叉树地图有各种不同的实现方式,很多在机器人领域不适用或是在计算机存储领域不适用。今天我就讲解下各类四叉树的实现方式和应用场景。
史上最详细四叉树地图不同技术应用和代码详解
本文禁止转载,主要是为了有不同见解的同学可以方便联系我,我的邮箱 fanzexuan135@163.com

四叉树地图:应用与研究综述

1. 引言

四叉树地图是一种重要的空间索引结构,广泛应用于机器人导航、计算机图形学、地理信息系统等领域。通过递归地将二维空间划分为四个象限,形成层次化的树状结构,四叉树地图能够高效地组织和检索空间数据。本文将深入探讨四叉树地图的应用场景、主要变体及其研究进展,重点关注在机器人领域的应用。

2. 四叉树地图的基本概念

四叉树地图的核心思想是将二维空间递归地划分为四个大小相等的象限,直到满足特定的停止条件,如达到最大深度或象限内的数据量低于阈值。每个节点都有四个子节点,分别对应于左上、右上、左下和右下四个象限。通过这种层次化的划分,四叉树地图能够高效地索引和查询空间数据。

标准四叉树(Standard Quadtree)是最基本的四叉树形式,其构建过程如下:

  1. 将整个二维空间作为根节点的边界。
  2. 递归地将当前节点的空间划分为四个象限,生成四个子节点。
  3. 重复步骤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 特点与应用场景
  1. 数据表示:区域四叉树适用于表示和存储二维空间中的区域数据,如图像、地图、占据栅格等。每个节点表示一个正方形区域,节点的属性可以是区域的颜色、标签、占据概率等。

  2. 数据压缩:区域四叉树可以通过合并相似或同质的区域来实现数据压缩。对于大型图像或地图,使用区域四叉树可以显著减少存储空间,提高传输和处理效率。

  3. 图像分割:区域四叉树可以用于图像分割任务,将图像划分为不同的区域或对象。通过递归地划分和合并区域,可以获得层次化的图像分割结果,有助于后续的图像理解和分析。

  4. 空间索引:区域四叉树提供了高效的空间索引机制,可以快速查询和检索给定区域内的数据。这在图像检索、地图查询等应用中非常有用。

  5. 图像处理:区域四叉树可以用于各种图像处理任务,如图像滤波、增强、分割等。通过在四叉树上进行相应的操作,可以实现高效、多尺度的图像处理算法。

3.2.2 与其他四叉树的区别
  1. 与标准四叉树的区别:标准四叉树主要用于点数据的存储和检索,而区域四叉树专门用于处理区域数据。区域四叉树的节点表示正方形区域,而不是单个点。

  2. 与点区域四叉树的区别:点区域四叉树的叶子节点要么为空,要么包含一个点;而区域四叉树的叶子节点表示一个同质的区域,可以包含多个像素或网格。

  3. 与线性四叉树的区别:线性四叉树主要用于优化点数据的存储和检索,使用线性编码方案;而区域四叉树则专注于表示和处理区域数据,通常使用树形结构。

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 特点与应用场景
  1. 空间填充曲线:线性四叉树利用空间填充曲线(如Morton编码、Hilbert曲线等)将二维或高维空间映射为一维空间,从而将点数据转化为一维序列。这种映射方式保留了空间局部性,相邻的点在一维序列中也相邻。

  2. 紧凑存储:线性四叉树通过一维序列来表示点数据,避免了显式存储树结构,因此具有更紧凑的存储方式。这对于存储大规模点云数据、高维数据非常有利。

  3. 快速检索:线性四叉树支持高效的范围查询和最近邻查询。通过对一维序列进行二分查找或顺序扫描,可以快速定位查询范围内的点,避免了遍历整个树结构的开销。

  4. 数据压缩:线性四叉树可以通过合并连续的空节点来实现数据压缩。在稀疏数据集中,这种压缩方式可以显著减少存储空间。

  5. 空间数据库:线性四叉树常用于空间数据库的索引结构,如PostgreSQL的SP-GiST索引。它能够高效地支持空间查询,如点查询、范围查询、最近邻查询等。

3.3.2 与其他四叉树的区别
  1. 与标准四叉树的区别:标准四叉树使用树形结构来表示空间划分,而线性四叉树则使用一维序列来表示点数据,通过空间填充曲线来保留空间局部性。

  2. 与点区域四叉树的区别:点区域四叉树的叶子节点包含单个点,而线性四叉树的节点可以表示多个点,通过一维序列来存储。

  3. 与区域四叉树的区别:区域四叉树用于表示和处理区域数据,而线性四叉树主要用于优化点数据的存储和检索。

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_encodemorton_decode函数,分别用于将二维坐标编码为Morton码和将Morton码解码为二维坐标。然后定义了LinearQuadTree类,包含insert方法用于插入点数据,range_query方法用于执行范围查询,以及_binary_search方法用于在有序列表中进行二分查找。

示例代码插入了几个点数据,然后执行一个范围查询,输出查询结果。

线性四叉树在空间数据库、点云数据存储、高维数据索引等领域有广泛的应用。通过利用空间填充曲线和紧凑存储,线性四叉树能够高效地支持大规模点数据的存储和查询,提供了一种优化的空间索引方法。

3.4 X-Quad树(X-Quadtree)

X-Quad树是一种结合标准四叉树和线性四叉树特点的变体,旨在优化机器人导航中的路径规划和环境表示。X-Quad树的构建过程如下:

  1. 将二维空间递归地划分为四个象限,直到达到预设的最大深度或满足其他停止条件。
  2. 对于每个节点,使用线性编码方案(如Morton编码)为其分配一个唯一的整数标识符。
  3. 根据节点的线性编码,将节点按照特定的顺序存储在一维数组中。
  4. 在进行空间查询时,首先根据查询区域的线性编码计算出相关的节点范围,然后在一维数组中进行高效的查找和检索。

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类表示二维平面上的一个点,包含xy坐标。在示例代码中,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树有以下特点:

  1. 与标准四叉树相比,X-Quad树使用线性编码方案(如Morton编码)为节点分配唯一标识符,提高了存储和查询效率。

  2. 与点区域四叉树相比,X-Quad树不限制每个节点只能包含一个点,因此更适合表示密集的点云数据。

  3. 与面区域四叉树相比,X-Quad树主要用于处理点数据,而不是区域数据。但X-Quad树可以扩展为存储其他类型的数据,如线段、多边形等。

  4. 与线性四叉树相比,X-Quad树保留了树形结构,便于进行区域查询和邻域分析。同时,X-Quad树利用线性编码加速了节点的定位和检索。

总的来说,X-Quad树综合了标准四叉树和线性四叉树的优点,在机器人导航、轨迹分析、点云处理等领域有广泛的应用前景。

7. 未来研究方向

尽管X-Quad树已经展现出优异的性能和应用潜力,但仍有许多值得探索的研究方向。以下是几个有前景的研究方向:

  1. 动态更新:随着机器人的运动,环境地图和轨迹数据会不断变化。如何高效地更新X-Quad树,同时保持其性能和一致性,是一个具有挑战性的问题。

  2. 三维扩展:将X-Quad树扩展到三维空间,形成X-Octree(X-八叉树),可以处理更复杂的环境和任务,如三维重建、碰撞检测等。

  3. 多传感器融合:将X-Quad树与其他传感器数据(如视觉、雷达、惯性等)进行融合,可以构建更完整、准确的环境模型,提高机器人的感知和决策能力。

  4. 语义信息集成:在X-Quad树中集成语义信息,如物体类别、属性等,可以实现语义级别的环境理解和交互,如语义地图构建、自然语言导航等。

  5. 机器学习结合:利用机器学习技术,如深度学习、强化学习等,自适应地调整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.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/851206.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Bio-Info每日一题:Rosalind-06-Counting Point Mutations

&#x1f389; 进入生物信息学的世界&#xff0c;与Rosalind一起探索吧&#xff01;&#x1f9ec; Rosalind是一个在线平台&#xff0c;专为学习和实践生物信息学而设计。该平台提供了一系列循序渐进的编程挑战&#xff0c;帮助用户从基础到高级掌握生物信息学知识。无论你是初…

Navicat导入json文件(json文件数据导入到MySQL表中)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

多目标融合参数搜索

多目标融合 权重分类目人群。 trick normlize 不同Score之间含义、量级和分布差异较大&#xff1a;评分计算的不同部分的意义、范围和分布存在显著差异&#xff0c;这使得直接比较或融合它们的结果变得困难。显式反馈&#xff08;如点赞率&#xff09;存在用户间差异&#…

【9】openssl 代码调试

0x01 前言 最近在学习密码学&#xff0c;但是国密算法(SM2&#xff0c;SM3,SM4,SM9)的细节都在openssl项目里&#xff0c;当然一些国际算法也在。想着看下代码执行过程和理论结合起来。中间走了一些弯路&#xff0c;做个笔记。 0x02 openssl安装 一开始认为是不是直接下载好的…

Layui实现下拉多选功能

1、问题概述? 提供源码下载 在项目中有很多地方需要使用到下拉框,并且实现选择多个信息,下面是展示。 支持如下功能: 1、分页 2、主题自定义 3、国际化 4、下拉方向 5、Tips修改等 6、Style自定义样式 7、取值 8、赋值 2、资源准备及测试? 2.1、资源下载

Leetcode 力扣113. 路径总和 II (抖音号:708231408)

给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum 22 输出&a…

中山大学和字节发布「视频虚拟试穿」扩散模型VITON-DiT,一键生成换装后视频!

视频虚拟试穿技术日益受到关注&#xff0c;然而现有的工作局限于将服装图像转移到姿势和背景简单的视频上&#xff0c;对于随意拍摄的视频则效果不佳。最近&#xff0c;Sora 揭示了 Diffusion Transformer (DiT) 在生成具有真实场景的逼真视频方面的可扩展性&#xff0c;可以说…

Kubernetes入门-大简介

目录 何为微服务 何为云原生 何为编排器 “Kubernetes”这个名字来自希腊语&#xff0c;意思是“舵手”舵手是一个航海/航行术语&#xff0c;指掌舵的人从本质上说&#xff0c;Kubernetes是云原生微服务(cloud-native microservice)应用的编排器(orchestrator) 何为微服务 …

WordPress 高级缓存插件 W3 Total Cache 开启支持 Brotli 压缩算法

今天明月给大家分享一下 WordPress 高级缓存插件 W3 Total Cache 开启支持 Brotli 压缩算法的教程&#xff0c;在撰写【WordPress 高级缓存插件 W3 Total Cache Pro 详细配置教程】一文的时候明月就发现 W3 Total Cache 已经支持 Brotli 压缩算法了&#xff0c;可惜的是在安装完…

ctfshow-web入门-命令执行(web53-web55)

目录 1、web53 2、web54 3、web55 1、web53 这里的代码有点不一样&#xff0c;说一下这两种的区别&#xff1a; &#xff08;1&#xff09;直接执行 system($c); system($c);这种方式会直接执行命令 $c 并将命令的输出直接发送到标准输出&#xff08;通常是浏览器&#xff…

【qsort函数】

前言 我们要学习qsort函数并利用冒泡函数仿照qsort函数 首先我们要了解一下qsort&#xff08;快速排序&#xff09; 这是函数的的基本参数 void qsort (void* base, size_t num, size_t size,int (*compar)(const void*,const void*)); 简单解释一下 base&#xff1a;指向…

23.在游戏中按下Home键呼出辅助窗口

上一个内容&#xff1a;22.钩子注入原理 在 22.钩子注入原理 它的代码上进行修改 效果图&#xff1a; 首先在CWndMain.h文件中添加下图红框里的东西 ChangeShowState函数的实现 void CWndMain::ChangeShowState() {UiShow !UiShow;ShowWindow(UiShow); } OnInitDialog函数…

CISCN2024 初赛 wp 部分复现(Re)

Misc 1. 火锅链观光打卡 答题即可 Re 1. asm_re 感谢智谱清言&#xff0c;可以读出大致加密算法 这是输入 这是加密部分 这里判断 找到疑似密文的部分&#xff0c;手动改一下端序 #asm_wp def dec(char):return (((char - 0x1E) ^ 0x4D) - 0x14) // 0x50 #return (ord(cha…

powerdesigner各种字体设置

1、设置左侧菜单&#xff1a; 步骤如下&#xff1a; tools —> general options —> fonts —> defalut UI font ,选择字体样式及大小即可&#xff0c;同下图。 2、设置Table的字体大小 Tools------>Display Prefrences------>Table------->Format---------…

RabbitMQ系列-rabbitmq无法重新加入集群,启动失败的问题

当前存在3个节点&#xff1a;rabbitmq5672、rabbitmq5673、rabbitmq5674 当rabbitmq5673节点掉线之后&#xff0c;重启失败 重启的时候5672节点报错如下&#xff1a; 解决方案 在集群中取消失败节点 rabbitmqctl forget_cluster_node rabbitrabbitmq5673删除失败节点5673的…

王学岗鸿蒙开发(北向)——————(十)子组件修改父组件的内容与 动画

子组件修改父组件的内容 使用类似Android的回调&#xff0c;父组件传递给子组件一个函数 import { MyComment } from ./component/MyComment import { MyContent } from ./component/MyComtent import { MyTitleComponent } from ./component/MyTitleComponentEntry Componen…

【MySQL数据库基础】

&#x1f308;个人主页&#xff1a;努力学编程’ ⛅个人推荐&#xff1a;基于java提供的ArrayList实现的扑克牌游戏 |C贪吃蛇详解 ⚡学好数据结构&#xff0c;刷题刻不容缓&#xff1a;点击一起刷题 &#x1f319;心灵鸡汤&#xff1a;总有人要赢&#xff0c;为什么不能是我呢 …

【CS.OS】堆管理算法:不同的堆分配和管理算法

1000.5.CS.OS.1.3-基础-内存管理-堆管理算法-Created: 2024-06-09.Sunday10:41 文章目录 1 内存分配算法概述1.1 首次适应&#xff08;First-Fit&#xff09;1.2 最佳适应&#xff08;Best-Fit&#xff09; 2 伙伴系统&#xff08;Buddy System&#xff09; 3 总结References …

Python | 正则表达式

?:标记?之前的字符为可选. used&#xff1f; d可有可无 *:匹配>0个重复的在*号之前的字符。 ab*c 匹配多个b &#xff1a;匹配>1个重复的号前的字符。&#xff08;至少一个&#xff09; {n,m}&#xff1a;匹配num个大括号之前的字符或字符集 &#xff08;n < num …

算法:101. 对称二叉树

对称二叉树 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false提示&#xff1a; 树中节…