#hilbert-curve #curve #hilbert #quad-tree #oct-tree #morton

insides

一个紧凑、高性能的空间填充曲线库,适用于 Rust

3 个版本

0.1.2 2022 年 4 月 4 日
0.1.1 2022 年 4 月 3 日
0.1.0 2022 年 3 月 17 日

#997 in 算法

自定义许可证

225KB
549

Crates.io 反资本主义软件许可证 (v 1.4) alexmadeathing [![rustc 1.51+]][Rust 1.51]

警告

此库处于开发阶段的 alpha 阶段。其接口可能随时更改。

有关迁移说明,请参阅: https://github.com/alexmadeathing/insides/releases

insides

一个紧凑、高性能的空间填充曲线库,适用于 Rust。

此库提供了一般化与空间填充曲线交互的抽象接口,以及 morton 曲线实现和相应的操作方法。

支持的曲线

  • Morton - 一个 morton 或 Z-order 曲线实现

我们目前仅支持 Morton 编码,但接口将支持其他曲线实现,例如 Hilbert,我们计划很快包含它们。

功能

  • 高性能 - 可用于性能敏感的环境中
  • N 维 - 适用于多维应用(在特定条件下可达 16 维)
  • 类型安全 - 支持多种输入类型和已知输出类型(支持 u8u16u32u64u128usize
  • no_std - 适用于嵌入式设备(可通过 std 功能启用额外的标准库功能)
  • 可扩展 - 基于灵活特质的实现
  • 最小依赖 - 发布构建仅依赖于 dilate 进行整数膨胀

入门

首先,将insides链接到您的项目的cargo.toml文件中。

请访问crates.io查看最新版本

[dependencies]
insides = "0.1.2"

接下来,将insides导入到您的项目中,并尝试一些功能

use insides::*;

// Create a 3D morton location using u16 coordinate indices
// At the moment, we have to specify the number of dimensions twice, sorry!
// (this will change with improvements to Rust const generics)
let location = Morton::<Expand<u16, 3>, 3>::from_coords([1, 2, 3]);

// Access raw morton location index
// Useful as a map key or array index!
// In this case, we're using a morton curve, so we know the underlying bit
// layout. If we used a different type of curve, the index would be
// different.
assert_eq!(location.index(), 0b110101);

// Get neighbour in the negative X axis
assert_eq!(location.neighbour_on_axis(0, QueryDirection::Negative).coords(), [0, 2, 3]);

// Get neighbour in the positive Y axis
assert_eq!(location.neighbour_on_axis(1, QueryDirection::Positive).coords(), [1, 3, 3]);

// Get sibling on Z axis
// Its use is subtle and may not be apparent at first glance. Imagine the
// world is divided into a grid where each cell contains a cluster of 8
// siblings (in the 3D case). This method operates upon that grid. This is
// mostly useful when applied to tree-like structures.
let sibling = location.sibling_on_axis(2);
assert_eq!(sibling.coords(), [1, 2, 2]);

// Calling again from the sibling gets our original location
assert_eq!(sibling.sibling_on_axis(2), location);

// This gets, either the sibling, or the same location, on the Z axis,
// depending on which is further in the query direction.
assert_eq!(location.sibling_or_same_on_axis(2, QueryDirection::Positive).coords(), [1, 2, 3]);

获取更详细的信息,请参阅代码参考

路线图

请参阅V1.0路线图讨论

贡献

欢迎贡献。

对于错误报告,请提交错误报告

对于功能请求,请提交功能请求

如果您有想法并希望直接贡献,请先在讨论区创建一个想法讨论。在着手工作之前,允许他人进行评论。当所有各方在设计上达成一致后,工作可以开始。当您的代码准备好发布时,请提交一个引用您的想法讨论的pull request。除非是非常小的更改,否则我们不太可能接受未经过此过程的pull request。

许可

insides在反资本主义软件许可证(v 1.4)下授权。这意味着对于不按照资本主义原则运营的个人和组织,它是免费和开源的。

除非明确说明,否则您的贡献将根据此许可证合并。

依赖项