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 在 算法
386 每月下载量
在 aoer-plotty-rs 中使用
46KB
737 行
cubic_spline
在已知点集范围内计算三次样条点的插值方法。
示例
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