Performance Optimizations
- Added recommended performance flags for `gfortran` based on [recommendations][0.6.0-3] on `fortran90.org` ([`3877982`][0.6.0-22]).
- Extensions can be compiled in debug mode by setting `DEBUG=True` ([`b62460b`][0.6.0-62]).
- Setting `BEZIER_NO_EXTENSIONS=True` will build pure-Python modules only ([`3f6280c`][0.6.0-25])
- Added [QUADPACK][0.6.0-86] to use in `curve.f90::compute_length` ([`985a4c0`][0.6.0-53]).
- Implemented curve-curve intersection completely in Fortran (e.g. [`4a8f801`][0.6.0-28]) 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`][0.6.0-45]). This is used for sanity checking in functional tests ([`e253da2`][0.6.0-78]).
- 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`][0.6.0-73]).
- Added `bezier.__author__` and [`bezier.__version__`][0.6.0-87] attributes.
- Added [`bezier.get_dll()`][0.6.0-88] for Windows ([`699e39b`][0.6.0-34]).
- Added `bezier/__config__.py` that adds `libbezier` to `%PATH%` on Windows ([`8538af4`][0.6.0-43]).
- 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()`][0.6.0-89] returns `s-t` parameters rather than `x-y` values ([`c309998`][0.6.0-68]).
- [`Surface.intersect()`][0.6.0-90] returns a list with a single `Surface` when one of the two surfaces is contained in the other ([`05b1fd9`][0.6.0-6]).
- [`Surface.is_valid`][0.6.0-91] 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`][0.6.0-1]).
- Removed data members from `Curve`:
- `edge_index` ([`b969488`][0.6.0-63])
- `next_edge` ([`28619e8`][0.6.0-16])
- `previous_edge` ([`28619e8`][0.6.0-16])
- `root` ([`db427f9`][0.6.0-75])
- `start` ([`39ee98b`][0.6.0-23])
- `end` ([`39ee98b`][0.6.0-23])
- Removed data members from `Surface`:
- `base_x` ([`dea75e3`][0.6.0-2])
- `base_y` ([`dea75e3`][0.6.0-2])
- `width` ([`dea75e3`][0.6.0-2])
- Remove `dimension` argument in `_curve_speedup.pyx::elevate_nodes` since it can be inferred from `nodes` ([`06501c5`][0.6.0-7]).
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`][0.6.0-84]).
- Newly added functions
- `curve.h::subdivide_nodes_curve` ([`efb3ce6`][0.6.0-82])
- `curve.h::newton_refine_curve` ([`2257344`][0.6.0-15])
- `curve.h::locate_point_curve` ([`2121101`][0.6.0-14], [`32b0fa9`][0.6.0-20])
- `curve.h::elevate_nodes_curve` ([`b03fc28`][0.6.0-60])
- `curve.h::get_curvature` ([`69cb2f8`][0.6.0-35])
- `curve.h::reduce_pseudo_inverse` ([`7c3db17`][0.6.0-39])
- `curve.h::full_reduce` ([`4abd309`][0.6.0-29])
- `curve.h::compute_length` ([`985a4c0`][0.6.0-53], [`7e71b20`][0.6.0-40])
- `curve_intersection.h::curve_intersections` ([`c92f98d`][0.6.0-96])
- `curve_intersection.h::free_curve_intersections_workspace` ([`c92f98d`][0.6.0-96])
- `helpers.h::contains_nd` ([`36f4b5e`][0.6.0-21])
- `helpers.h::vector_close` ([`9f3716a`][0.6.0-55])
- `helpers.h::in_interval` ([`3c0af5d`][0.6.0-24])
- `helpers.h::ulps_away` ([`0197237`][0.6.0-4])
- `surface.h::specialize_surface` ([`eb8693e`][0.6.0-81], [`fcd5bad`][0.6.0-85])
- `surface.h::subdivide_nodes_surface` ([`6027210`][0.6.0-32], [`4fc5f2a`][0.6.0-30], [`8beb1ac`][0.6.0-47], [`0b2b1f3`][0.6.0-8], [`d27b86f`][0.6.0-70], [`88c302b`][0.6.0-46])
- `surface.h::compute_edge_nodes` ([`2d02590`][0.6.0-17], [`f86649a`][0.6.0-83])
- `surface_intersection.h::newton_refine_surface` ([`93c288d`][0.6.0-50])
- `surface_intersection.h::locate_point_surface` ([`325ea47`][0.6.0-19], [`ca134e6`][0.6.0-69], [`bf69852`][0.6.0-65])
- `surface_intersection.h::surface_intersections`
- `surface_intersection.h::free_surface_intersections_workspace`
- Added [`status.h`][0.6.0-97] 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`][0.6.0-56], [`c2accf7`][0.6.0-67]).
Breaking Changes
- Removed functions
- `curve.h::specialize_curve_generic` ([`d52453b`][0.6.0-71])
- `curve.h::specialize_curve_quadratic` ([`d52453b`][0.6.0-71])
- `curve_intersection.h::from_linearized` ([`d62e462`][0.6.0-72])
- `curve_intersection.h::bbox_line_intersect` ([`72c0179`][0.6.0-37])
- `curve_intersection.h::linearization_error` ([`4a3378b`][0.6.0-27])
- `curve_intersection.h::segment_intersection` ([`4060590`][0.6.0-26])
- `curve_intersection.h::parallel_different` ([`df3e195`][0.6.0-76])
- Renamed functions
- `curve.h::newton_refine` to `newton_refine_curve` ([`194ce95`][0.6.0-11])
- `curve.h::elevate_nodes` to `elevate_nodes_curve` ([`194ce95`][0.6.0-11])
- `curve_intersection.h::newton_refine_intersect` to `newton_refine_curve_intersect` ([`a055525`][0.6.0-57])
- Replaced `degree` with `num_nodes (== degree + 1)` in functions that operate on curves:
- `curve.h::evaluate_curve_barycentric` ([`13eacdd`][0.6.0-10])
- `curve.h::evaluate_multi` ([`962c288`][0.6.0-52])
- `curve.h::specialize_curve` ([`ac86233`][0.6.0-59])
- `curve.h::evaluate_hodograph` ([`9170855`][0.6.0-49])
- `curve_intersection.h::newton_refine_curve_intersect` ([`80ec491`][0.6.0-42])
Miscellany
- Added documentation for "native extensions" in `DEVELOPMENT` ([`2f9f2c4`][0.6.0-92]).
- Overhauled [`native-libraries` doc][0.6.0-95] with subsections for OS X and Windows ([`bfa75ee`][0.6.0-66], [`72005fb`][0.6.0-94], etc.).
- Added Fortran unit tests ([`758bdd1`][0.6.0-38], [`e8afba7`][0.6.0-79], [`3164365`][0.6.0-18], etc.).
- Began testing in Mac OS X on Travis ([`9ac5e8e`][0.6.0-54], [`85f7619`][0.6.0-44], 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`][0.6.0-93]).