2 个不稳定版本
0.2.0 | 2021 年 4 月 5 日 |
---|---|
0.1.0 | 2021 年 3 月 26 日 |
#966 在 数学
15KB
127 行
希尔伯特索引
Rust 的 D 维希尔伯特曲线。
要求
由于需要 const-generics,这个工具包需要 Rust 1.51 或更高版本。Const-generics 允许我们使用 [usize; D]
而不是 Vec<usize>
。
特性
这个工具包提供了基于 D 维 Hilbert 曲线,在 usize
(希尔伯特索引)和 [usize; D]
(网格点)之间进行转换的功能。希尔伯特曲线填充 D 维立方体中的所有网格点,可用于 D 维数据结构,如 Hilbert R-tree。
具有级别(顺序)l
的 D
维希尔伯特曲线是从索引 0..2.pow(D*l)
到网格点 [usize; D]
的映射,其组件 x
满足 0 <= x < 2.pow(l)
。相邻的索引给出相邻的网格点。不支持范围之外的输入,可能会导致意外结果。
实现的算法基于 Chris Hamilton 报告中 Butz 的算法,"紧凑希尔伯特索引"。另请参阅 紧凑希尔伯特索引:具有不同边长的域的空间填充曲线。
用法
此工具包提供了两个特性,FromHilbertIndex
和 ToHilbertIndex
。此外,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
- hilbert
- hilbert_2d(仅限2D)
- hilbert_curve(仅限2D)
- fast_hilbert(仅限2D)