4 个版本

0.2.1 2024 年 5 月 29 日
0.2.0 2023 年 10 月 1 日
0.1.1 2023 年 6 月 29 日
0.1.0 2023 年 6 月 1 日

#327 in 数据结构

MIT/Apache

38KB
891

Qutee

Crates.io Crates.io GitHub Workflow Status (with branch)

Qutee 是四叉树的简单实现。Qutee 允许您选择用于坐标的原始数字类型。四叉树的项不需要任何特质界限。

边界

可以使用 Boundary::newBoundary::between_points 来构造边界。 Boundary::new 接收一个 Point 作为第一个参数,然后是宽度和高度。 Boundary::between_points 接收两个 Point 对象。

二维空间中的一个点。可以使用 Point::new 来构造一个点。这个函数接收一个 xy 参数。大多数函数不需要直接接收 Point,而是接收 impl Into<Point> 作为参数。这允许使用一个元组作为点,其中第一个元素是 x,第二个是 `y'。

四叉树

QuadTree 提供了实际的四叉树实现。QuadTree 有两个必需参数和一个可选泛型参数。前两个参数是坐标和项类型。第三个参数定义了如何确定每个级别的最大容量。默认情况下,此参数设置为 DynCapacity。如果您在编译时知道大小,可以将其更改为 ConstCapacity

创建

要创建 QuadTree,您可以使用三种方法之一

  1. new_with_capacity 接收一个 Boundary 和类型为 Capacity 的参数。
  2. new_with_dyn_cap 接收一个 Boundary 和一个类型为 usize 的容量。此函数仅在容量是动态时可用。
  3. new_with_const_cap 接收一个 Boundary。此函数仅在容量在编译时已知时可用。

插入

可以使用 insert 函数插入项。此函数要求项实现 AsPoint。如果您的项没有实现 AsPoint,您可以使用 insert_at。第一个参数是点,第二个是项。

查询

query 接收一个 Boundary 并返回一个类型为 Query 的 Iterator

迭代

iter 返回一个包含树中所有项的 Iter 类型的迭代器。

示例

use qutee::*;
// Create a new quadtree where the area's top left corner is at -10, -10, with a width and height of 20.
let mut tree = QuadTree::new_with_dyn_cap(Boundary::new((-10., -10.), 20., 20.), 5);
assert!(tree.insert_at((0.5, 0.1), "A").is_ok());
assert!(tree.insert_at((-1., 1.), "B").is_ok());
// This point is outside the tree
assert_eq!(tree.insert_at((10.1, 5.), "C"), Err(QuadTreeError::OutOfBounds));
// Search elements inside a boundary. A boundary can also be defined as an area between two points.
let mut query = tree.query(Boundary::between_points((0.,0.),(1.,1.)));
assert_eq!(query.next(), Some(&"A"));
assert!(query.next().is_none());
// Get an iterator over all items
let mut iter = tree.iter();
assert_eq!(iter.next(), Some(&"A"));
assert_eq!(iter.next(), Some(&"B"));
assert!(iter.next().is_none());

依赖项

~155KB