1 个不稳定版本
0.4.0 | 2021年1月19日 |
---|
6 在 #lerp 中排名
870 每月下载量
在 2 个crate中(通过 lerp)使用
9KB
154 行
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
除了对单个浮点值有效外,该crate还提供了一个派生宏,可以通过 derive
功能获得,它能够自动生成实现。
此派生实现将独立线性插值(lerp)结构体的每个字段,并假设了针对 Float
类型的泛型 Lerp 实现。如果任何字段只对可以由 #[lerp(f32)]
或 #[lerp(f64)]
属性指定的 f32 或 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/
依赖项
~1.5MB
~33K SLoC