1个不稳定版本

0.1.0 2021年12月27日

#683 in 数学


splinify中使用

MIT/Apache

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维曲线的xy向量,以及N维曲线的uxyn向量。

  • 使用spliny来使用生成的样条曲线,例如计算曲线坐标或样条曲线的导数。此包还实现了将样条表示以JSON文件的形式输入和输出的基本工具,以及样条图形。它完全用Rust编写,并且不需要Fortran编译器。

  • dierckx-sys 包含了 Paul Dierckx 的 FITPACK 库的外部函数接口。它被 splinify 使用,但除非你想自己探索 Paul Dierckx 库,否则在用 splinifyspliny 时可以忽略。

要使用此库,请将以下内容添加到你的 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 许可证定义的,任何故意提交以包含在你所做的工作中的贡献,将按上述方式双重许可,不附加任何额外的条款或条件。

依赖项

~5–7.5MB
~136K SLoC