19个版本 (1个稳定版)

1.0.0 2020年12月14日
0.9.9 2020年11月4日
0.9.3 2020年7月25日
0.9.1 2020年2月8日
0.7.8 2019年6月20日

#604算法

Download history 161/week @ 2024-03-13 126/week @ 2024-03-20 101/week @ 2024-03-27 137/week @ 2024-04-03 138/week @ 2024-04-10 210/week @ 2024-04-17 113/week @ 2024-04-24 85/week @ 2024-05-01 45/week @ 2024-05-08 115/week @ 2024-05-15 89/week @ 2024-05-22 88/week @ 2024-05-29 67/week @ 2024-06-05 72/week @ 2024-06-12 128/week @ 2024-06-19 100/week @ 2024-06-26

386 每月下载量
aoer-plotty-rs 中使用

MIT 许可证

46KB
737

cubic_spline

Crates.io npm

在已知点集范围内计算三次样条点的插值方法。

在线文档
演示

example

示例

use cubic_spline::{Points, Point, SplineOpts, TryFrom};


fn main() {
  let source = vec![(10.0, 200.0), (256.0, 390.0), (512.0, 10.0), (778.0, 200.0)];
  
  let opts = SplineOpts::new()
    .tension(0.5);
  
  let mut points = Points::try_from(&source).expect("expect valid points but");
  let result = points.calc_spline(&opts).expect("cant construct spline points");
  
  assert_eq!(result.get_ref().len(), 49);
  
  let inner_vec: &mut Vec<Point> = points.get_mut();
  inner_vec.push(Point::new(7.7, 1.3));
  inner_vec[1].x += 0.79;
  inner_vec.last_mut().iter_mut().for_each(|mut p| {p.tension = Some(0.7);});
  
  points.invert_vertically(400.0);
  
  assert_eq!(points.get_ref()[1].y, 10.0);
  
  let calculated_points = points
    .calc_spline(&opts.num_of_segments(33))
    .unwrap();
  
  assert_eq!(calculated_points.into_inner().len(), 133);

}

有关如何构建曲线以及应接受哪些点的信息,请参阅相应的结构。

自定义点

如果您已经有一些点,可以为From trait实现Point结构体,并直接传递您的点。

示例

use cubic_spline::{SplineOpts, Point, Points};

#[derive(Default)]
struct MyPoint {
  vertical: u8,
  horizontal: u8,
  color: String,
}

impl<'a> From<&'a MyPoint> for Point {
  fn from(p: &'a MyPoint) -> Self {
    Point::new(&p.horizontal as f64, &p.vertical as f64)
  }
}

fn main() {
  let my_points: Vec<MyPoint> = vec![MyPoint::default(),MyPoint::default()];
  let spline = Points::from(&my_points)
    .calc_spline(&SplineOpts::default())
    .unwrap();
  
  assert_eq!(spline.get_ref().len(), 17);
}

在JavaScript中使用

它还编译为wasm模块。您可以在JavaScript代码中使用它,但不是完全的。现在只有一个函数可用

import { getCurvePoints } from 'cubic-spline-rs'

const NUM_OF_SEGMENTS = 22

const points = [10.0, 200.0, 256.0, 390.0, 512.0, 10.0, 778.0, 200.0]

const curvePoints = getCurvePoints( points, {
  num_of_segments: NUM_OF_SEGMENTS, // *optional
  // tension: 0.5, // *optional
  // ...  
} )

如果您想将结果点绘制到画布上,代码如下

const ctx = getMyCanvas2DContext()

ctx.beginPath()
ctx.lineWidth = 3
ctx.strokeStyle = '#ffcc00'

ctx.moveTo(curvePoints[0], curvePoints[1])
const length = curvePoints.length - 1
for (let i = 2; i < length; i += 2) {
  ctx.lineTo(curvePoints[i], curvePoints[i + 1])
}

ctx.stroke()
ctx.closePath()

选项

名称 类型 默认值 描述
tension f64 0.5 张力
num_of_segments u32 16 已知点之间计算点的数量
hidden_point_at_start Option<(f64,f64)> None 一个不会绘制但图开始会弯曲如若它在那里存在的点。
hidden_point_at_end Option<(f64,f64)> None 一个不会绘制但图结束会弯曲如若它在那里存在的点。
use cubic_spline::{SplineOpts};

fn main() {
  let options = SplineOpts::new()
    .tension(0.6)
    .num_of_segments(54)
    // .hidden_point_at_start((1.2, 3.1))
    // .hidden_point_at_end((397.9, 105.5))
    ;

}



许可证

此模块遵循MIT许可

依赖项

~220KB