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
_verifyswitch toSurface.locate()(doc) andCurve.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()andSurface.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
0or1. (4a8458c)
New Features
Adding optional
strategyargument (one of geometric or algebraic) to theSurface.intersect()methodAdded “algebraic”
IntersectionStrategyenum via curve implicitization (reference)
Adding
Curve.reduce_()method which acts as a partial inverse toCurve.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
showkeyword fromCurve.plot()(doc),Surface.plot()(doc) andCurvedPolygon.plot()(doc)(Breaking change) Splitting the
Surface.evaluate_multi()method intoSurface.evaluate_barycentric_multi()(doc) andSurface.evaluate_cartesian_multi()(doc)Adding
__dict__helpers onCurve,CurvedPolygonandSurface. These are@propertys intended only for REPL use, since classes with__slots__no longer have a__dict__attribute.