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 数据结构
50KB
612 行
PointND
一个简单且灵活的 no-std
结构体,用于表示任何维度上的点
兼容性
这个crate被设计为与 no_std
和 wasm
兼容,并已在这些环境中进行了测试。
这个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;
可以通过传递给 apply
、apply_vals
、apply_dims
和 apply_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上可用的版本提前几步,因此您可能值得检查一些新的功能和错误修复。