PyPI link to release 0.6.0 Documentation for release 0.6.0

Performance Optimizations

  • Added recommended performance flags for gfortran based on recommendations on fortran90.org (3877982).
    • Extensions can be compiled in debug mode by setting DEBUG=True (b62460b).
    • Setting BEZIER_NO_EXTENSIONS=True will build pure-Python modules only (3f6280c)
  • Added QUADPACK to use in curve.f90::compute_length (985a4c0).
  • Implemented curve-curve intersection completely in Fortran (e.g. 4a8f801) which resulted in a 10x speedup when called from Python. Also implemented surface-surface intersection completely in Fortran, resulting in a 3x speedup.

Python Changes

New Features

  • Added CurvedPolygon._metadata to track where edges originated, e.g. from a surface-surface intersection (871d23d). This is used for sanity checking in functional tests (e253da2).
  • Made speedup checks specific to the module, not all four. I.e. bezier._HAS_SPEEDUP was dropped in favor of five members, e.g. _HAS_CURVE_SPEEDUP (d798f66).
  • Added bezier.__author__ and bezier.__version__ attributes.
  • Added bezier.get_dll() for Windows (699e39b).
  • Added bezier/__config__.py that adds libbezier to %PATH% on Windows (8538af4).
  • Fortran / Cython speedups added:
    • _curve_speedup.pyx::subdivide_nodes
    • _curve_speedup.pyx::newton_refine
    • _curve_speedup.pyx::locate_point
    • _curve_speedup.pyx::elevate_nodes
    • _curve_speedup.pyx::get_curvature
    • _curve_speedup.pyx::reduce_pseudo_inverse
    • _curve_speedup.pyx::full_reduce
    • _curve_speedup.pyx::compute_length
    • _curve_intersection_speedup.pyx::all_intersections
    • _curve_intersection_speedup.pyx::free_curve_intersections_workspace
    • _helpers_speedup.pyx::contains_nd
    • _helpers_speedup.pyx::vector_close
    • _helpers_speedup.pyx::in_interval
    • _helpers_speedup.pyx::ulps_away
    • _surface_speedup.pyx::specialize_surface
    • _surface_speedup.pyx::subdivide_nodes
    • _surface_speedup.pyx::compute_edge_nodes
    • _surface_intersection_speedup.pyx::newton_refine
    • _surface_intersection_speedup.pyx::locate_point
    • _surface_intersection_speedup.pyx::surface_intersections
    • _surface_intersection_speedup.pyx::free_surface_intersections_workspace

Breaking Changes

  • Curve.intersect() returns s-t parameters rather than x-y values (c309998).
  • Surface.intersect() returns a list with a single Surface when one of the two surfaces is contained in the other (05b1fd9).
  • Surface.is_valid will only return True if the map B(s, t) determined by the surface has everywhere positive Jacobian. Previously a negative Jacobian was also allowed (260fb51).
  • Removed data members from Curve:
  • Removed data members from Surface:
  • Remove dimension argument in _curve_speedup.pyx::elevate_nodes since it can be inferred from nodes (06501c5).

ABI Changes

New Features

  • Fully implemented curve-curve intersection (as curve_intersection.h::curve_intersections) and surface-surface intersection (as surface_intersection.h::surface_intersections) at the ABI level.
  • Added the surface_intersection.h header file and implementations for the described functions (fafd9ff).
  • Newly added functions
  • Added status.h with an enum for failure states. Each Fortran procedure that returns a status documents the possible values and if each value is set directly or by a called procedure (9fc8575, c2accf7).

Breaking Changes

  • Removed functions
    • curve.h::specialize_curve_generic (d52453b)
    • curve.h::specialize_curve_quadratic (d52453b)
    • curve_intersection.h::from_linearized (d62e462)
    • curve_intersection.h::bbox_line_intersect (72c0179)
    • curve_intersection.h::linearization_error (4a3378b)
    • curve_intersection.h::segment_intersection (4060590)
    • curve_intersection.h::parallel_different (df3e195)
  • Renamed functions
    • curve.h::newton_refine to newton_refine_curve (194ce95)
    • curve.h::elevate_nodes to elevate_nodes_curve (194ce95)
    • curve_intersection.h::newton_refine_intersect to newton_refine_curve_intersect (a055525)
  • Replaced degree with num_nodes (== degree + 1) in functions that operate on curves:
    • curve.h::evaluate_curve_barycentric (13eacdd)
    • curve.h::evaluate_multi (962c288)
    • curve.h::specialize_curve (ac86233)
    • curve.h::evaluate_hodograph (9170855)
    • curve_intersection.h::newton_refine_curve_intersect (80ec491)


  • Added documentation for “native extensions” in DEVELOPMENT (2f9f2c4).
  • Overhauled native-libraries doc with subsections for OS X and Windows (bfa75ee, 72005fb, etc.).
  • Added Fortran unit tests (758bdd1, e8afba7, 3164365, etc.).
  • Began testing in Mac OS X on Travis (9ac5e8e, 85f7619, etc.).
  • Added a workaround (include/bezier/_bool_patch.h) for the missing support for bool in old MSVC versions that are required to work with Python 2.7 (5577178).