36 个版本 (稳定版)

4.3.2 2024年2月29日
4.3.1 2023年11月22日
4.3.0 2023年9月23日
4.2.0 2023年2月1日
0.2.3 2018年10月13日

#3科学

Download history 2443/week @ 2024-04-22 2345/week @ 2024-04-29 1539/week @ 2024-05-06 1935/week @ 2024-05-13 2509/week @ 2024-05-20 1431/week @ 2024-05-27 1921/week @ 2024-06-03 1838/week @ 2024-06-10 1934/week @ 2024-06-17 2661/week @ 2024-06-24 2985/week @ 2024-07-01 2850/week @ 2024-07-08 3030/week @ 2024-07-15 2826/week @ 2024-07-22 3781/week @ 2024-07-29 4045/week @ 2024-08-05

每月下载量 13,795
14 个 Crates (直接使用 11 个) 中使用

BSD-3-Clause

40KB
503

此 crate 提供 样条,通过控制键(即节点)定义的数学曲线。

请查阅 在线文档 获取更多信息。

轻松实现样条插值。

此 crate 提供了样条,其中每个部分都可以独立于其他部分进行插值 - 即可以在一个部分上使用线性插值器,然后切换到下一个部分的三次 Hermite 插值器。

此 crate 主要由三种类型组成

  • [Key],它表示样条必须通过的控制点。
  • Interpolation,每个段可能的插值类型。
  • Spline,您可以从中通过插值 采样 点的样条。

添加控制点时,您将添加新部分。两个控制点定义一个部分 - 即不能没有至少两个控制点来定义样条。每次添加新的控制点时,都会创建一个新的部分。每个部分都分配了一个插值模式,该模式从其下控制点中选择。

快速创建样条

use splines::{Interpolation, Key, Spline};

let start = Key::new(0., 0., Interpolation::Linear);
let end = Key::new(1., 10., Interpolation::default());
let spline = Spline::from_vec(vec![start, end]);

您会注意到我们为第一个键使用了 Interpolation::Linear。第一个键 start 的插值将用于由这两个键定义的整个段。不会使用 end 的插值。在理论上,您可以使用任何您想要的 Interpolation 用于最后一个键。我们使用默认值,因为我们不在乎。

插值值

样条曲线的整个目的在于将离散值插值成连续值。这通常使用 Spline::sample 方法来实现。此方法期望采样参数(通常是你的模拟时间)作为参数,并将生成一个插值值。

如果你尝试在范围之外的采样参数中进行采样,你将得到一个空值。

assert_eq!(spline.sample(0.), Some(0.));
assert_eq!(spline.clamped_sample(1.), Some(10.));
assert_eq!(spline.sample(1.1), None);

有可能你希望在范围之外也能得到一个值。这对于模拟/动画尤其重要。你可以自由使用 Spline::clamped_interpolation 来实现这一目的。

assert_eq!(spline.clamped_sample(-0.9), Some(0.)); // clamped to the first key
assert_eq!(spline.clamped_sample(1.1), Some(10.)); // clamped to the last key

多态采样类型

Spline 曲线既由所携带的值(即要插值的值)参数化,也由采样类型参数化。通常使用 f32f64,但实际上,从理论上讲,你可以使用任何类型的类型;但是,该类型必须实现一组特质的合同来执行。有关详细信息,请参阅此模块的文档

特性和自定义

这个crate是带有特性烘焙并隐藏在特性门后面的。这个想法是,默认配置(即你只需将 "splines = …" 添加到你的 Cargo.toml)将始终为您提供样条曲线、键/节点和插值模式的最低、核心和原始概念。然而,你可能需要更多。为了避免让其他人做额外的工作来添加对非常著名和有用的特性的实现——并且以更无效的方式实现,因为他们无法访问此crate的内部,可以通过一种即兴的方式启用特性。

这个机制不是最终的,目前这只是一个实验,看看人们是否喜欢它。特别是看看它是如何处理文档的。

以下是当前支持的特性以及如何启用它们

  • Serde。
    • 此特性为该crate导出的所有类型实现了 SerializeDeserialize 特性。
    • 使用 "serde" 特性启用。
  • cgmath 实现者。
    • 为某些 cgmath 类型添加了一些有用的 Interpolate 实现。
    • 使用 "cgmath" 特性启用。
  • glam 实现者。
    • 为某些 glam 类型添加了一些有用的 Interpolate 实现。
    • 使用 "glam" 特性启用。
  • nalgebra 实现者。
    • 为某些 nalgebra 类型添加了一些有用的 Interpolate 实现。
    • 使用 "nalgebra" 特性启用。
  • 标准库/无标准库。
    • 你可以编译针对标准库,或者在没有它的情况下继续。
    • 默认情况下,启用编译标准库。
    • 在您的 Cargo.toml 中使用 default-features = [] 来禁用。
    • 通过使用 "std" 功能来显式启用。

依赖项

约 0–1.6MB
约 40K SLoC