# 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.

## Miscellany¶

• Adding IntersectionClassification enum to docs (ref)

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