2 个不稳定版本

0.2.0 2021 年 4 月 5 日
0.1.0 2021 年 3 月 26 日

#966数学

MIT 许可证

15KB
127

希尔伯特索引

crates.io Documentation

Rust 的 D 维希尔伯特曲线。

要求

由于需要 const-generics,这个工具包需要 Rust 1.51 或更高版本。Const-generics 允许我们使用 [usize; D] 而不是 Vec<usize>

特性

这个工具包提供了基于 D 维 Hilbert 曲线,在 usize(希尔伯特索引)和 [usize; D](网格点)之间进行转换的功能。希尔伯特曲线填充 D 维立方体中的所有网格点,可用于 D 维数据结构,如 Hilbert R-tree

具有级别(顺序)lD 维希尔伯特曲线是从索引 0..2.pow(D*l) 到网格点 [usize; D] 的映射,其组件 x 满足 0 <= x < 2.pow(l)。相邻的索引给出相邻的网格点。不支持范围之外的输入,可能会导致意外结果。

实现的算法基于 Chris Hamilton 报告中 Butz 的算法,"紧凑希尔伯特索引"。另请参阅 紧凑希尔伯特索引:具有不同边长的域的空间填充曲线

用法

此工具包提供了两个特性,FromHilbertIndexToHilbertIndex。此外,indices 函数提供了一个生成所有希尔伯特索引的迭代器。

将索引转换为网格点。

use hilbert_index::FromHilbertIndex;
const D: usize = 3;

let level = 2;
for hindex in hilbert_index::indices::<D>(level) {
    let position: [usize; D] = hindex.from_hilbert_index(level);
    println!("p[{:02}] = {:?}", hindex, position);
}

您还可以使用 from_hindex 而不是 from_hilbert_index

将网格点转换为希尔伯特索引。

use hilbert_index::ToHilbertIndex;

let level = 1;
assert_eq!( 0, [ 0, 0, 0 ].to_hilbert_index(level));
assert_eq!( 1, [ 0, 1, 0 ].to_hilbert_index(level));
assert_eq!( 2, [ 0, 1, 1 ].to_hilbert_index(level));
assert_eq!( 3, [ 0, 0, 1 ].to_hilbert_index(level));
assert_eq!( 4, [ 1, 0, 1 ].to_hilbert_index(level));
assert_eq!( 5, [ 1, 1, 1 ].to_hilbert_index(level));
assert_eq!( 6, [ 1, 1, 0 ].to_hilbert_index(level));
assert_eq!( 7, [ 1, 0, 0 ].to_hilbert_index(level));

您还可以使用 to_hindex 而不是 to_hilbert_index

类似的crate

无运行时依赖