#point #geometry #multidimensional #coordinate #points #graphics

no-std point-nd

一个简单且灵活的无std结构体,用于表示任何维度上的点

8个版本 (4个破坏性版本)

0.5.0 2022年5月17日
0.4.1 2022年3月13日
0.3.0 2022年3月11日
0.2.1 2022年3月10日
0.1.1 2022年3月9日

#641 in 数据结构

MIT/Apache

50KB
612

PointND

一个简单且灵活的 no-std 结构体,用于表示任何维度上的点

兼容性

这个crate被设计为与 no_stdwasm 兼容,并已在这些环境中进行了测试。

这个crate使用了泛型,建议使用至少 1.51 版本的Rust。

基本用法

由于 PointND 解引用为一个切片,因此所有针对切片实现的方法都可以使用

创建点

// Creating a 2D point from a given array
let arr = [0,1];
let p = PointND::new(arr);

// Creating a 3D point from values of a given slice
let vec = vec![0, 1, 2];
let p = PointND::<_, 3>::from_slice(&vec);

// Creating a 4D point with all values set to 5
let p = PointND::<_, 4>::fill(5);

查询值和属性

如果点的维度在 1..=4 之间,建议使用便捷获取器来访问值。

let p = PointND::new([0, 1]);

// As the point has 2 dimensions, we can access
//  it's values with the x() and y() methods
let x: &i32 = p.x();
let y = p.y();

assert_eq!(*x, arr[0]);
assert_eq!(*y, arr[1]);

// If the point had 3 dimensions, we could use the above and:
//  let z = p.z();
// Or with 4 dimensions, the above and:
//  let w = p.w();

上述方法未为具有超过4个维度的PointND实现。

我们必须使用索引代替。请参阅文档以了解其他使直接索引更简单的crate。

let p = PointND::new([0,1,2,3,4,5]);

// ERROR: Not implemented for PointND of 6 dimensions
// let x = p.x();

let x: i32 = p[0];
let y_to_z = p[1..3];

要获取点的维度,请使用 dims 方法。

let p = PointND::new([0, 1, 2, 3]);

let dims: usize = p.dims();
assert_eq!(dims, 4);

转换值

如果点的维度在 1..=4 之间,建议使用便捷设置器来设置值。

let mut p = PointND::new([0, 1]);

// As the point has 2 dimensions, we can set
//  it's values with the set_x() and set_y() methods
// There are set_z() and set_w() methods available for
//  points with 3 and 4 dimensions respectively
p.set_x(-10);
p.set_y(-20);

上述方法未为具有超过4个维度的PointND实现。

我们必须使用索引代替。

let p = PointND::new([0,1,2,3,4]);

// ERROR: Not implemented for PointND of 5 dimensions
// p.set_x(1200);

p[0] = 1200;

可以通过传递给 applyapply_valsapply_dimsapply_point 方法的函数来执行复杂转换。

请参阅文档以获取更多信息。

let add_ten = |i: i32| i + 10;
let double  = |i: i32| i * 2;
let sum     = |a: i32, b: i32| a + b;

let p1 = PointND::new([0,1,2,3,4,5]);
let p2 = PointND::new([0,1,2,3,4,5])
         // Adds ten to each item
         .apply(add_ten)
         // Doubles items at indexes 0, 1 and 2
         .apply_dims(&[0,1,2], double)
         // Adds items in p2 to respective items in p1
         .apply_point(p1, sum);

迭代

迭代一个 PointND 与迭代一个切片一样简单

let mut p = PointND::new([0,1]);

for _ in p.iter()      { /* Do stuff     */ }
for _ in p.iter_mut()  { /* Change stuff */ }
for _ in p.into_iter() { /* Move stuff (unless items implement Copy) */ }

贡献

对代码库、文档、README(或任何其他内容)的任何建议都热烈欢迎!

如果遇到任何问题或疑问,请在我们GitHub仓库提交一个问题。

API更改

在未来的某个时间点,仍然可能发生破坏性的API更改。然而,截至v0.5.0,这种情况变得不太可能,未来的主要版本(如果有)更有可能添加新功能而不是重写现有功能。

完整的更改日志可以在我们的GitHub仓库中找到。

我们的GitHub仓库总是比crates.io上可用的版本提前几步,因此您可能值得检查一些新的功能和错误修复。

许可证

此软件包可以在MIT和/或Apache2.0许可证下使用。

依赖关系