#lerp #numeric #linear-interpolation #interpolation #math #extrapolate

lerp derive

泛型线性插值和扩展,自动为多种数值类型实现

1 个不稳定版本

0.4.0 2021年1月19日

6#lerp 中排名

Download history 701/week @ 2023-12-11 664/week @ 2023-12-18 78/week @ 2023-12-25 203/week @ 2024-01-01 568/week @ 2024-01-08 192/week @ 2024-01-15 324/week @ 2024-01-22 438/week @ 2024-01-29 539/week @ 2024-02-05 297/week @ 2024-02-12 111/week @ 2024-02-19 279/week @ 2024-02-26 269/week @ 2024-03-04 231/week @ 2024-03-11 194/week @ 2024-03-18 171/week @ 2024-03-25

870 每月下载量
2 个crate中(通过 lerp)使用

MIT 许可证

9KB
154

Lerp

Build Status

线性插值和迭代,自动在大多数浮点兼容类型上实现。

只需要知道三和五之间的中间值是什么吗?

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