rust_nurbs#
Welcome to rust_nurbs, a Python API for evaluation of Non-Uniform Rational B-Splines (NURBS) curves and surfaces implemented in Rust. The primary goals of this package are to allow for extremely fast NURBS evaluation while providing a user-friendly interface through Python with zero external dependencies.
Speed Comparison#
Performance can be of high importance when evaluating NURBS objects, especially when evaluating many points on surfaces with high degrees. See the below image for a comparison of the performance of this library versus an essentially identical pure-Python implementation.
Comparison of the Rust NURBS implementation vs. a pure-Python implementation for several cases#
Case |
Description |
Samples/Size |
|---|---|---|
Case 1 |
Degree 10 Bernstein polynomial evaluation at random \(t\)-values |
500,000 |
Case 2 |
Degree 4 Bézier curve evaluation at random \(t\)-values |
500,000 |
Case 3 |
Cubic B-spline curve evaluation at random \(t\)-values |
500,000 |
Case 4 |
\(1 \times 4\) Bézier surface evaluation at random \((u,v)\)-pairs |
500,000 |
Case 5 |
\(1 \times 4\) Bézier surface grid evaluation |
\(500 \times 500\) |
Case 6 |
\(2 \times 4\) NURBS surface of revolution grid evaluation |
\(500 \times 500\) |
Case 7 |
\(2 \times 9\) NURBS surface of revolution grid evaluation |
\(500 \times 500\) |
Basic Installation#
Installation is straightforward using the simple
pip install rust-nurbs
Note
The command pip install rust_nurbs also works. This underscore must be used when importing the library inside of Python because a hyphen in an import statement is not valid Python syntax.
If using the Stable version, the single pip install command should work for all major operating versions, CPU architectures, and versions of Python >=3.8. See Installation for more detailed installation instructions if you have an unsupported architecture or are a developer and would like to extend or develop the library.
Quick Start#
After installing rust_nurbs in the current environment and starting a Python console (or from inside a .py script), an example Bézier surface with degree \(n=1\) and \(m=3\) can be evaluated at \((u,v) = (0.3, 0.8)\) using the following code:
import rust_nurbs
p = np.array([
[[0.0, 0.0, 0.0], [0.3, 0.2, 0.0], [0.6, -0.1, 0.0], [1.2, 0.1, 0.0]],
[[0.0, 0.0, 1.0], [0.3, 0.4, 1.0], [0.6, -0.2, 1.0], [1.2, 0.2, 1.0]]
])
surf_point = np.array(rust_nurbs.bezier_surf_eval(p, 0.3, 0.8))
If desired, all the functions listed in the API Reference can be dumped to the current namespace to shorten the function names:
from rust_nurbs import *
p = np.array([
[[0.0, 0.0, 0.0], [0.3, 0.2, 0.0], [0.6, -0.1, 0.0], [1.2, 0.1, 0.0]],
[[0.0, 0.0, 1.0], [0.3, 0.4, 1.0], [0.6, -0.2, 1.0], [1.2, 0.2, 1.0]]
])
surf_point = np.array(bezier_surf_eval(p, 0.3, 0.8))
See the test file for more examples.
Source & API#
The source code can be viewed on GitHub here. See the API Reference section for a detailed Python API reference.
Examples#
See the test file for example usages of each function.
Contents#
- Installation
- Testing
- API Reference
- rust_nurbs
- Functions
- Module Contents
bernstein_poly()bezier_curve_eval()bezier_curve_eval_dp()bezier_curve_dcdt()bezier_curve_dcdt_dp()bezier_curve_d2cdt2()bezier_curve_d2cdt2_dp()bezier_curve_eval_grid()bezier_curve_eval_dp_grid()bezier_curve_dcdt_grid()bezier_curve_dcdt_dp_grid()bezier_curve_d2cdt2_grid()bezier_curve_d2cdt2_dp_grid()bezier_curve_eval_tvec()bezier_curve_eval_dp_tvec()bezier_curve_dcdt_tvec()bezier_curve_dcdt_dp_tvec()bezier_curve_d2cdt2_tvec()bezier_curve_d2cdt2_dp_tvec()bezier_surf_eval()bezier_surf_dsdu()bezier_surf_dsdv()bezier_surf_d2sdu2()bezier_surf_d2sdv2()bezier_surf_eval_dp()bezier_surf_dsdu_dp()bezier_surf_dsdv_dp()bezier_surf_d2sdu2_dp()bezier_surf_d2sdv2_dp()bezier_surf_eval_dp_iso_u()bezier_surf_eval_dp_iso_v()bezier_surf_dsdu_dp_iso_u()bezier_surf_dsdu_dp_iso_v()bezier_surf_dsdv_dp_iso_u()bezier_surf_dsdv_dp_iso_v()bezier_surf_d2sdu2_dp_iso_u()bezier_surf_d2sdu2_dp_iso_v()bezier_surf_d2sdv2_dp_iso_u()bezier_surf_d2sdv2_dp_iso_v()bezier_surf_eval_dp_grid()bezier_surf_dsdu_dp_grid()bezier_surf_dsdv_dp_grid()bezier_surf_d2sdu2_dp_grid()bezier_surf_d2sdv2_dp_grid()bezier_surf_eval_iso_u()bezier_surf_eval_iso_v()bezier_surf_dsdu_iso_u()bezier_surf_dsdu_iso_v()bezier_surf_dsdv_iso_u()bezier_surf_dsdv_iso_v()bezier_surf_d2sdu2_iso_u()bezier_surf_d2sdu2_iso_v()bezier_surf_d2sdv2_iso_u()bezier_surf_d2sdv2_iso_v()bezier_surf_eval_grid()bezier_surf_dsdu_grid()bezier_surf_dsdv_grid()bezier_surf_d2sdu2_grid()bezier_surf_d2sdv2_grid()bezier_surf_eval_uvvecs()bezier_surf_dsdu_uvvecs()bezier_surf_dsdv_uvvecs()bezier_surf_d2sdu2_uvvecs()bezier_surf_d2sdv2_uvvecs()rational_bezier_curve_eval()rational_bezier_curve_eval_dp()rational_bezier_curve_dcdt()rational_bezier_curve_dcdt_dp()rational_bezier_curve_d2cdt2()rational_bezier_curve_d2cdt2_dp()rational_bezier_curve_eval_grid()rational_bezier_curve_eval_dp_grid()rational_bezier_curve_dcdt_grid()rational_bezier_curve_dcdt_dp_grid()rational_bezier_curve_d2cdt2_grid()rational_bezier_curve_d2cdt2_dp_grid()rational_bezier_curve_eval_tvec()rational_bezier_curve_eval_dp_tvec()rational_bezier_curve_dcdt_tvec()rational_bezier_curve_dcdt_dp_tvec()rational_bezier_curve_d2cdt2_tvec()rational_bezier_curve_d2cdt2_dp_tvec()rational_bezier_surf_eval()rational_bezier_surf_dsdu()rational_bezier_surf_dsdv()rational_bezier_surf_d2sdu2()rational_bezier_surf_d2sdv2()rational_bezier_surf_eval_dp()rational_bezier_surf_dsdu_dp()rational_bezier_surf_dsdv_dp()rational_bezier_surf_d2sdu2_dp()rational_bezier_surf_d2sdv2_dp()rational_bezier_surf_eval_dp_iso_u()rational_bezier_surf_eval_dp_iso_v()rational_bezier_surf_dsdu_dp_iso_u()rational_bezier_surf_dsdu_dp_iso_v()rational_bezier_surf_dsdv_dp_iso_u()rational_bezier_surf_dsdv_dp_iso_v()rational_bezier_surf_d2sdu2_dp_iso_u()rational_bezier_surf_d2sdu2_dp_iso_v()rational_bezier_surf_d2sdv2_dp_iso_u()rational_bezier_surf_d2sdv2_dp_iso_v()rational_bezier_surf_eval_dp_grid()rational_bezier_surf_dsdu_dp_grid()rational_bezier_surf_dsdv_dp_grid()rational_bezier_surf_d2sdu2_dp_grid()rational_bezier_surf_d2sdv2_dp_grid()rational_bezier_surf_eval_iso_u()rational_bezier_surf_eval_iso_v()rational_bezier_surf_dsdu_iso_u()rational_bezier_surf_dsdu_iso_v()rational_bezier_surf_dsdv_iso_u()rational_bezier_surf_dsdv_iso_v()rational_bezier_surf_d2sdu2_iso_u()rational_bezier_surf_d2sdu2_iso_v()rational_bezier_surf_d2sdv2_iso_u()rational_bezier_surf_d2sdv2_iso_v()rational_bezier_surf_eval_grid()rational_bezier_surf_dsdu_grid()rational_bezier_surf_dsdv_grid()rational_bezier_surf_d2sdu2_grid()rational_bezier_surf_d2sdv2_grid()rational_bezier_surf_eval_uvvecs()rational_bezier_surf_dsdu_uvvecs()rational_bezier_surf_dsdv_uvvecs()rational_bezier_surf_d2sdu2_uvvecs()rational_bezier_surf_d2sdv2_uvvecs()bspline_curve_eval()bspline_curve_eval_dp()bspline_curve_dcdt()bspline_curve_dcdt_dp()bspline_curve_d2cdt2()bspline_curve_d2cdt2_dp()bspline_curve_eval_grid()bspline_curve_eval_dp_grid()bspline_curve_dcdt_grid()bspline_curve_dcdt_dp_grid()bspline_curve_d2cdt2_grid()bspline_curve_d2cdt2_dp_grid()bspline_curve_eval_tvec()bspline_curve_eval_dp_tvec()bspline_curve_dcdt_tvec()bspline_curve_dcdt_dp_tvec()bspline_curve_d2cdt2_tvec()bspline_curve_d2cdt2_dp_tvec()bspline_surf_eval()bspline_surf_dsdu()bspline_surf_dsdv()bspline_surf_d2sdu2()bspline_surf_d2sdv2()bspline_surf_eval_dp()bspline_surf_dsdu_dp()bspline_surf_dsdv_dp()bspline_surf_d2sdu2_dp()bspline_surf_d2sdv2_dp()bspline_surf_eval_iso_u()bspline_surf_eval_iso_v()bspline_surf_dsdu_iso_u()bspline_surf_dsdu_iso_v()bspline_surf_dsdv_iso_u()bspline_surf_dsdv_iso_v()bspline_surf_d2sdu2_iso_u()bspline_surf_d2sdu2_iso_v()bspline_surf_d2sdv2_iso_u()bspline_surf_d2sdv2_iso_v()bspline_surf_eval_dp_iso_u()bspline_surf_eval_dp_iso_v()bspline_surf_dsdu_dp_iso_u()bspline_surf_dsdu_dp_iso_v()bspline_surf_dsdv_dp_iso_u()bspline_surf_dsdv_dp_iso_v()bspline_surf_d2sdu2_dp_iso_u()bspline_surf_d2sdu2_dp_iso_v()bspline_surf_d2sdv2_dp_iso_u()bspline_surf_d2sdv2_dp_iso_v()bspline_surf_eval_grid()bspline_surf_dsdu_grid()bspline_surf_dsdv_grid()bspline_surf_d2sdu2_grid()bspline_surf_d2sdv2_grid()bspline_surf_eval_uvvecs()bspline_surf_dsdu_uvvecs()bspline_surf_dsdv_uvvecs()bspline_surf_d2sdu2_uvvecs()bspline_surf_d2sdv2_uvvecs()bspline_surf_eval_dp_grid()bspline_surf_dsdu_dp_grid()bspline_surf_dsdv_dp_grid()bspline_surf_d2sdu2_dp_grid()bspline_surf_d2sdv2_dp_grid()bspline_surf_eval_dp_uvvecs()bspline_surf_dsdu_dp_uvvecs()bspline_surf_dsdv_dp_uvvecs()bspline_surf_d2sdu2_dp_uvvecs()bspline_surf_d2sdv2_dp_iuvvecs()nurbs_curve_eval()nurbs_curve_eval_dp()nurbs_curve_dcdt()nurbs_curve_dcdt_dp()nurbs_curve_d2cdt2()nurbs_curve_d2cdt2_dp()nurbs_curve_eval_grid()nurbs_curve_eval_dp_grid()nurbs_curve_dcdt_grid()nurbs_curve_dcdt_dp_grid()nurbs_curve_d2cdt2_grid()nurbs_curve_d2cdt2_dp_grid()nurbs_curve_eval_tvec()nurbs_curve_eval_dp_tvec()nurbs_curve_dcdt_tvec()nurbs_curve_dcdt_dp_tvec()nurbs_curve_d2cdt2_tvec()nurbs_curve_d2cdt2_dp_tvec()nurbs_surf_eval()nurbs_surf_dsdu()nurbs_surf_dsdv()nurbs_surf_d2sdu2()nurbs_surf_d2sdv2()nurbs_surf_eval_iso_u()nurbs_surf_eval_iso_v()nurbs_surf_dsdu_iso_u()nurbs_surf_dsdu_iso_v()nurbs_surf_dsdv_iso_u()nurbs_surf_dsdv_iso_v()nurbs_surf_d2sdu2_iso_u()nurbs_surf_d2sdu2_iso_v()nurbs_surf_d2sdv2_iso_u()nurbs_surf_d2sdv2_iso_v()nurbs_surf_eval_grid()nurbs_surf_dsdu_grid()nurbs_surf_dsdv_grid()nurbs_surf_d2sdu2_grid()nurbs_surf_d2sdv2_grid()nurbs_surf_eval_uvvecs()nurbs_surf_dsdu_uvvecs()nurbs_surf_dsdv_uvvecs()nurbs_surf_d2sdu2_uvvecs()nurbs_surf_d2sdv2_uvvecs()
- rust_nurbs