1个不稳定版本
0.1.0 | 2021年12月27日 |
---|
#683 in 数学
在splinify中使用
42KB
389 行
Spliny:处理样条曲线
样条曲线是分段多项式(参数)曲线,用于插值、曲线拟合和数据平滑。
Spliny
是一个(小巧的)纯Rust库,用于使用样条曲线,基于spliny
的节点和控制点在SplineCurve<K,N>
中,并且可以绘制样条曲线——目前限于1维和2维样条曲线——以检查结果。它不会将样条函数拟合到数据集中:请参见Splinify
-crate。
示例1:李萨如曲线拟合
获取一个李萨如数据集的样条曲线,带有图形和JSON表示
use splinify::{CubicSplineFit2D, Result};
fn lissajous(t:f64, a: f64, kx: f64, b: f64, ky: f64) -> [f64;2] {
[
a * (kx * t).cos(),
b * (ky * t).sin()
]
}
fn main() -> Result<()> {
// Generate Lissajous data points, with angle parameter `u`
// ranging from 0 to 180º, with 1º-steps.
let u: Vec<f64> = (0..=180u32).into_iter().map(|v|(v as f64).to_radians()).collect();
let xy: Vec<f64> = u.iter().flat_map(|t|lissajous(*t,1.0, 3.0, 1.0, 5.0)).collect();
// fit Cubic Spline with Splinify's CubicSplineFit
let s = CubicSplineFit2D::new(u, xy)?.smoothing_spline(5e-3)?;
// Output fit results as JSON file and plot
println!("{}", serde_json::to_string_pretty(&s)?);
s.plot_with_control_points("lissajous.png", (800,800))?;
Ok(())
}
以下是它的相关的Spliny
JSON表示
{
"t": [
0.0, 0.0, 0.0, 0.0, 0.4014257279586958, 0.7853981633974483,
0.9948376736367679, 1.1868238913561442, 1.3788101090755203,
1.5707963267948966, 1.7802358370342162, 1.9722220547535925,
2.1642082724729685, 2.356194490192345, 2.7576202181510405,
3.141592653589793, 3.141592653589793, 3.141592653589793,
3.141592653589793
],
"c": [
0.9961805460172887, 1.01581609212485, 0.45785551737300106,
-0.6743400479743561, -1.04606086926188, -0.9655723250526262,
-0.5757280827332156, 0.017487591989126007, 0.610401362313724,
0.9866605336566671, 1.0335232431543322, 0.6453772441164307,
-0.4846359310719992, -1.014195365951515, -0.9964502165043656,
-0.027374797128379907, 0.770580186441133, 1.5844468932141083,
-0.7504988105159386, -1.1533053154158592, -0.39940623356854926,
0.669953241001308, 1.1822672685309246, 0.6182210556297563,
-0.493261782484514, -1.1530136311265229, -0.6885569654105621,
1.6217843337199846, 0.7207977628265237, -0.02317389641793977
],
"k": 3,
"n": 2
}
示例2:4个控制点的三次样条
这里从4个控制点构建了一个三次样条
use spliny::{CubicSpline2D, Result};
pub fn main() -> Result<()> {
let spline = CubicSpline2D::new(
vec![1.0, 1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 2.0],
vec![0.0, 0.5, 1.0, 3.0, 2.0, -3.0, 3.0, -3.0]
);
spline.plot_with_control_points("cubic2d.png", (800,800))?;
Ok(())
}
控制点是4个控制点:(0,2),(0.5,-3),(1,3),和(3,-3),曲线有8个节点。
用法
Spliny是作为三个crate中的一个开发出来的,但也可以独立使用
-
splinify将(非均匀)B-Spline曲线拟合到输入数据,并将结果拟合为
spliny
-crate的CurveSpline
。数据输入是1维曲线的x
和y
向量,以及N维曲线的u
和xyn
向量。 -
使用
spliny
来使用生成的样条曲线,例如计算曲线坐标或样条曲线的导数。此包还实现了将样条表示以JSON文件的形式输入和输出的基本工具,以及样条图形。它完全用Rust编写,并且不需要Fortran编译器。 -
dierckx-sys 包含了 Paul Dierckx 的 FITPACK 库的外部函数接口。它被
splinify
使用,但除非你想自己探索 Paul Dierckx 库,否则在用splinify
和spliny
时可以忽略。
要使用此库,请将以下内容添加到你的 Cargo.toml
文件中
[dependencies]
spliny = "0.1"
样条曲线
Spliny
中的基本样条表示形式是 SplineCurve<K,N>
对象 ——一个 knots 向量和拟合系数的包装器,其中 K 是样条度,N 是曲线样条的空间维度。
为了方便,已经定义了以下别名
别名 | K | N |
---|---|---|
线性样条 |
1 | 1 |
三次样条 |
3 | 1 |
五次样条 |
5 | 1 |
二维线性样条 |
1 | 2 |
二维三次样条 |
3 | 2 |
二维五次样条 |
5 | 2 |
三维线性样条 |
1 | 3 |
三维三次样条 |
3 | 3 |
三维五次样条 |
5 | 3 |
许可证
所有内容 ©2021 Harbers Bik LLC,并受以下其中一项许可协议的许可
- Apache 许可证 2.0 版 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT?)
任选其一。
贡献
除非你明确表示,否则根据 Apache-2.0 许可证定义的,任何故意提交以包含在你所做的工作中的贡献,将按上述方式双重许可,不附加任何额外的条款或条件。
依赖项
~5–7.5MB
~136K SLoC