PyPI link to release 0.4.0 Documentation for release 0.4.0

Performance Optimizations

  • Adding Fortran speedups for many crucial computation helpers including

    • intersecting line segments

    • (vectorized) Horner’s method for evaluating a Bézier curve at multiple parameters at once

    • (vectorized) Horner’s method for evaluating a Bézier surface

    • computing “linearization error” (how close a curve is to a line)

    • specializing a Bézier curve to a sub-interval

    • using Newton’s method to refine a curve-curve intersection

  • Adding _verify switch to Surface.locate() (doc) and Curve.intersect() (doc) to selectively disable overly defensive value checking. (Making sure to use this switch during “internal” computation.)

  • Making sure NumPy arrays are Fortran-contiguous as often as possible (e.g. snippets and source, via np.asfortranarray()). This is to avoid (and emphasize) a non-trivial overhead when passing a C-contiguous array to a Fortran function. (03a7242, 6064e4c, f1804f4)

  • Using Horner’s method in Curve.evaluate_multi() and Surface.evaluate_barycentric(), rather than inferior (sometimes non-vectorized) approaches (dee8181, 2611e64)

  • Made surface-surface intersection more resilient / lenient for corner intersections. For “nearby” intersections, parameter values can be rounded to 0 or 1. (4a8458c)

New Features

  • Adding optional strategy argument (one of geometric or algebraic) to the Surface.intersect() method

  • Adding Curve.reduce_() method which acts as a partial inverse to Curve.elevate() method. It is only a complete inverse when a curve is degree-elevated, otherwise it returns the “best” reduced form (in the least squares sense).

Interface Changes

  • (Breaking change) Removing show keyword from Curve.plot() (doc), Surface.plot() (doc) and CurvedPolygon.plot() (doc)

  • Adding color keyword to Curve.plot() method

  • Adding alpha keyword to Curve.plot() method

  • (Breaking change) Splitting the Surface.evaluate_multi() method into Surface.evaluate_barycentric_multi() (doc) and Surface.evaluate_cartesian_multi() (doc)

  • Adding __dict__ helpers on Curve, CurvedPolygon and Surface. These are @propertys intended only for REPL use, since classes with __slots__ no longer have a __dict__ attribute.


  • Adding IntersectionClassification enum to docs (ref)

  • Moving most plotting into a dedicated module. More importantly, importing plotting helpers at runtime rather at import time. So if computational code never plots, it won’t eat the import cost of matplotlib. Removing matplotlib as a dependency.