6 个版本 (重大更新)
0.5.0 | 2023 年 6 月 17 日 |
---|---|
0.4.0 | 2021 年 1 月 19 日 |
0.3.0 | 2020 年 10 月 6 日 |
0.2.0 | 2016 年 8 月 6 日 |
0.1.1 | 2016 年 8 月 5 日 |
在 算法 中排名 420
每月下载量 24,130
在 11 crates 中使用
12KB
127 行
Lerp
线性插值和迭代,自动适用于大多数与浮点数兼容的类型。
只需知道三个和五个之间的中点是什么?
use lerp::Lerp;
assert_eq!(3.0.lerp(5.0, 0.5), 4.0);
想要在该范围内迭代一些点?
// bring the trait into scope
use lerp::LerpIter;
// iterate and produce four items evenly spaced between 3.0 and 5.0
// note that the default, open iterator does not include both endpoints
// this makes chaining lerping iterators simpler
let items: Vec<_> = 3.0_f64.lerp_iter(5.0, 4).collect();
assert_eq!(vec![3.0, 3.5, 4.0, 4.5], items);
// closed iterators return both ends
assert_eq!(vec![3.0, 5.0], 3.0.lerp_iter_closed(5.0, 2).collect::<Vec<_>>());
当然,它的真正好处是它的推导足够广泛,还包括诸如 num::Complex<T>
这样的类型。如果您有一个数组处理库,并且数组是 T: Add<Output = T> + Mul<F: Float, Output = T>
,它也会对它们起作用。
派生 Lerp
除了对单个浮点值起作用外,该库还提供了一个 derive 宏,通过 derive
功能提供,可以自动生成实现。
此 derive 实现将独立插值结构的每个字段,并假设 Lerp 在 Float
类型上有一个泛型实现。如果任何字段仅对浮点值(f32、f64)之一泛型,可以通过 #[lerp(f32)]
或 #[lerp(f64)]
属性分别指定。
如果您希望lerp实现忽略一个字段(或者它不继承lerp),可以使用#[lerp(skip)]
或#[lerp(ignore)]
属性,这将产生一个值,从左侧值不受影响。
并非所有类型都支持这个继承宏。请参见GitHub问题以获取讨论和更多信息。
[dependencies]
lerp = { version = "0.4", features = ["derive"] }
use lerp::Lerp;
#[derive(Lerp, PartialEq, Debug)]
struct Data {
a: f64,
b: f64
}
assert_eq!(
Data { a: 0.0, b: 1.0 }.lerp(Data { a: 1.0, b: 0.0 }, 0.5),
Data { a: 0.5, b: 0.5 }
);
更多继承示例可以在测试中看到。
使用方法
[dependencies]
lerp = "0.4"
文档
自动构建于Travis:https://coriolinus.github.io/lerp-rs/
依赖
~95–365KB