三次样条

一个高性能的三次样条。

用法

    import CubicSpline
    import CubicSplineUI

    let points:[SIMD2<Double>] = [[0.0,0.9],[0.3,1.0],[0.7,0.0],[0.9,0.6],[1.4,0.6],[2,1.0]]
    
    let spline = CubicSpline(points:points)

像这样创建一个SwiftUI视图

SplineView(spline:spline)

Spline

这个视图会拉伸样条以适应可用空间。如果这不是你想要的,你可以从样条中获取路径

let path = spline.path

此路径将与用于创建样条的点处于相同的坐标系中。 然后你可以根据需要变换路径并构建自己的形状。

样条是可调用的,值范围为 0...1

    let u = spline(t: 0.1)

你可以获得一个三次曲线数组,它们也是可调用的,值范围为 0...1

    let curve = spline.cubicCurves.first!
    let v = curve(t: 0.5)

Spline

闭合样条

要从点数组创建闭合样条,只需为 closed 传递 true

    let spline = CubicSpline(points:points, closed:true)

Spline

更高维度

CubicSpline 也支持 3 维和更高维度的样条。所有标量为 Double 的 SIMD 类型都将有效。

性能

$O(n)$

CubicSpline 使用 Accelerate 框架(或 Linux 上的 LAPack)来加速线性代数运算。在 M1 Max Mac Pro 上构建一个包含 10000 个点的样条需要 0.02 秒。

Linux

我尚未在 Linux 上进行测试,但它应该可以工作。 你需要安装 LAPack

sudo apt-get install liblapacke-dev

请注意,CubicSplineUI 在 Linux 上不可用,因为它需要 SwiftUI。

参考

https://mathworld.net.cn/CubicSpline.html