#bezier #spline #graphics #point #points #path

nightly no-std stroke

一个零分配库,提供Bézier曲线、B-Spline曲线和N维欧几里得空间中最高到三次Bézier曲线的专用实现。它旨在用于通用/嵌入式/wasm,支持100%安全的Rust编写的#![no_std]环境。

2个不稳定版本

0.2.0 2023年6月7日
0.1.0 2021年2月22日

#686 in 数学

每月下载量30次

MIT许可证

115KB
1.5K SLoC

stroke

Rust
一个零分配库,提供Bézier曲线、B-Spline曲线和N维欧几里得空间中最高到三次Bézier曲线的专用实现。它旨在用于通用/嵌入式/wasm,支持100%安全的Rust编写的#![no_std]环境,具有最少的依赖。

库大量使用const-generics和某些相关未稳定功能,因此需要nightly编译器。
它提供了一个const-generic的N维点类型,这样您就可以在不添加任何其他依赖的情况下使用该库。
如果您想与其他库提供的类型集成,您可以通过实现库所依赖的小型Point trait来完成此操作(因为它不区分点及其位置向量)。

A Cubic Bézier Curve with Bounding Box and Convex Hull rendered by plotters.rs

plotters.rs创建

目前,泛型版本没有实现专用版本的所有方法(因为算法稍微复杂一些),但最终应该达到同等水平。

目标

  • 提供泛型Bézier曲线和B-Splines。由于它们的使用频率很高,还进一步提供直线、二次和三次Bézier曲线
  • 支持所有目标的无std
  • 广泛的单元测试和代码覆盖率
  • 对其他泛型数学库的集成测试(待定 - 可能是optimath、aljabar、micromath、nalgebra),因为点类型在许多库中重复

非目标

  • 专注于渲染或最高性能(无GPU)的使用

功能

这些都是主要支持的功能。在某些情况下还公开了一些其他实用方法。

二次和三次Bézier曲线

  • 评估(De Casteljau,直接)
  • 分割
  • 导数
  • 弧长(线性近似)
  • 弧长(Legendre-Gauss)
  • 曲率/半径(Frenet-Serret Frame)
  • 边界框
  • 紧边界框

泛型Bézier曲线

  • 评估(De Casteljau)
  • 分割
  • 导数
  • 弧长(线性近似)
  • 弧长(Legendre-Gauss)
  • 曲率/半径(Frenet-Serret Frame)
  • 边界框
  • 紧边界框

泛型B-Spline

  • 评估(De Boor)
  • 分割
  • 导数
  • 弧长(线性近似)
  • 弧长(Legendre-Gauss)
  • 曲率/半径(Frenet-Serret Frame)
  • 边界框
  • 紧边界框

如果您正在寻找具有gpu支持的已发布crate进行渲染,请检查Lyon,我从其中获得了灵感,它真的很不错。它具有线条、二次和三次贝塞尔曲线,以及弧线、三角形和其他几何对象,但没有一般的贝塞尔曲线或B样条。它似乎也支持wasm。

此外,还有Twinklebear/bspline,这是一个非常干净且有用的bspline库。然而,它依赖于std,并且其简单的Interpolate trait没有提供访问点各个维度的途径,因此在库中不实现导数。

这本清晰的在线书籍贝塞尔曲线入门帮助我解决了许多算法问题。

依赖项

~1MB
~21K SLoC