Bezier

Latest version: v2020.5.19

Safety actively analyzes 629052 Python packages for vulnerabilities to keep your Python projects secure.

Scan your dependencies

Page 20 of 21

0.6.1

Python Changes

Documentation

- Noting that `Surface.intersect()` can return a list of either `CurvedPolygon` or `Surface` instances ([`16e77d7`][0.6.1-5]).

Breaking Changes

- Removing `IntersectionClassification` enum from `_status.pxd` ([`4da969e`][0.6.1-4]).

Non-Public API

- Adding getters and setters for parameters used during curve-curve intersection ([`ef4ebc0`][0.6.1-7]):
- `bezier._geometric_intersection.set_max_candidates()`
- `bezier._geometric_intersection.get_max_candidates()`
- `bezier._geometric_intersection.set_similar_ulps()`
- `bezier._geometric_intersection.get_similar_ulps()`

ABI Changes

Surface Changes

- Switching from `int` to an actual enum for relevant functions with output values that are enums:
- In `surface_intersection.h::surface_intersections`, `contained` is now a `SurfaceContained` ([`0a9c0c3`][0.6.1-3]) and `status` is now a `Status` ([`c356c32`][0.6.1-2])
- In `curve_intersection.h::bbox_intersect`, `enum_` is now a `BoxIntersectionType` ([`ef856af`][0.6.1-1])
- In `curve_intersection.h::curve_intersections`, `status` is now a `Status` ([`ef856af`][0.6.1-1])
- Adding getters and setters for parameters used during curve-curve intersection ([`ef4ebc0`][0.6.1-7]):
- `curve_intersection.h::set_max_candidates`
- `curve_intersection.h::get_max_candidates`
- `curve_intersection.h::set_similar_ulps`
- `curve_intersection.h::get_similar_ulps`

Breaking Changes

- Removing inputs `curve_start / curve_end` and outputs `true_start / true_end` in `curve.h::specialize_curve` ([`959c547`][0.6.1-6])

0.6.01

0.6.0

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]).

0.5.0

Performance Optimizations
- Change `wiggle_interval` to return `success` bool instead of raising an exception. This allows the implicitization approach to use it without having to use exceptions for flow-control. (Fixes [22][5].)
- Switching Fortran speedups from `f2py` to Cython (this is because `f2py` artificially limits the feature set of Fortran, i.e. user defined types)
- Moving some more code to Fortran (e.g. `bbox_line_intersect()` [`3dcf640`][11])

New Features
- Making Fortran features available outside of Python (see [Native Libraries][1])
- C headers for each Fortran module (via [`bezier.get_include()`][2])
- Cython `.pxd` declarations for all Fortran modules
- `libbezier` static library (via [`bezier.get_lib()`][3])
- Implementing [`bezier_roots()`][13] polynomial root solver for polynomials written in Bernstein basis. ([`0dd6369`][12])

Miscellany
- Getting `bezier` [published][10] in the Journal of Open Source Science (JOSS). See [review][9]. ([`e6c4536`][7] and [`975ac6b`][8])
- Updating error message for `locate()` methods and adding a note that `locate()` / `evaluate*()` are (essentially) inverses. H/T to pdknsk [36][4]
- Using Fortran-contiguous arrays in `_check_non_simple()`. ([`b06c78e`][6])
- Moving most of `Curve.subdivide()` and `Surface.subdivide()` logic into helpers. This is part of an effort to make all helpers take low-level data types rather than `Curve`s, `Surface`s, etc. ([`34515bd`][14] and [`1fc80e5`][15])
- Split `speedup.f90` into submodules `curve.f90`, `surface.f90`, etc. ([`75349b7`][16], [`dfd6bba`][17], [`7096a9d`][18], [`c326c00`][19])
- Adding `BEZIER_JOURNAL` option to `setup.py`. This stores a record of compiler commands invoked during installation. See [Native Libraries][1] for more details. ([`3d832e7`][20] and [`c64a97a`][21])

[1]: http://bezier.readthedocs.io/en/0.5.0/native-libraries.html
[2]: http://bezier.readthedocs.io/en/0.5.0/reference/bezier.htmlbezier.get_include
[3]: http://bezier.readthedocs.io/en/0.5.0/reference/bezier.htmlbezier.get_lib
[4]: https://github.com/dhermes/bezier/pull/36
[5]: https://github.com/dhermes/bezier/pull/22
[6]: https://github.com/dhermes/bezier/commit/b06c78e50d53bf673bcf0b71fa84b36c8df564d8
[7]: https://github.com/dhermes/bezier/commit/e6c45360f0c8412ae90d967463a14c49490d70ee
[8]: https://github.com/dhermes/bezier/commit/975ac6b1a4313db4dcdc17396d6d34561005939e
[9]: https://github.com/openjournals/joss-reviews/issues/267
[10]: http://joss.theoj.org/papers/10.21105/joss.00267
[11]: https://github.com/dhermes/bezier/commit/3dcf64090bb5874320dcde86eaf449e94278dd08
[12]: https://github.com/dhermes/bezier/commit/0dd6369b0f77e4c0cf8113f2d25812addc90482a
[13]: http://bezier.readthedocs.io/en/0.5.0/algorithm-helpers.htmlbezier._implicitization.bezier_roots
[14]: https://github.com/dhermes/bezier/commit/34515bd6246f57fbb311b4089520a24e8237294a
[15]: https://github.com/dhermes/bezier/commit/1fc80e54ad1b45cb628af06e5a2100eeb9282865
[16]: https://github.com/dhermes/bezier/commit/75349b745063a9bbc623808b3f7bbf6b7641c008
[17]: https://github.com/dhermes/bezier/commit/dfd6bba303ac0a8492fac1f309086b685e52ab59
[18]: https://github.com/dhermes/bezier/commit/7096a9d646930378476e650c77d0652a48bf148a
[19]: https://github.com/dhermes/bezier/commit/c326c00a5c0ee74f9aa53c2b104ac6d4eb5c6794
[20]: https://github.com/dhermes/bezier/commit/3d832e78af2a951a642ff5860b9593abfa674ec3
[21]: https://github.com/dhermes/bezier/commit/c64a97aa5599220b927094a41de04b0c75bbec33

0.4.0

Performance Optimizations
- [Adding][29] Fortran [speedups][30] for many crucial computation helpers including
- intersecting line segments
- (vectorized) Horner's method for evaluating a B&xe9;zier curve at multiple parameters at once
- (vectorized) Horner's method for evaluating a B&xe9;zier surface
- computing "linearization error" (how close a curve is to a line)
- specializing a B&xe9;zier curve to a sub-interval
- using Newton's method to refine a curve-curve intersection
- [Adding][10] `_verify` switch to [`Surface.locate()`][11] and [`Curve.intersect()`][14] 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`][15], [`6064e4c`][16], [`f1804f4`][17])
- Using Horner's method in `Curve.evaluate_multi()` and `Surface.evaluate_barycentric()`, rather than inferior (sometimes non-vectorized) approaches ([`dee8181`][18], [`2611e64`][19])
- Made surface-surface intersection more resilient / lenient for corner intersections. For "nearby" intersections, parameter values can be rounded to `0` or `1`. ([`4a8458c`][25])

New Features
- [Adding][23] optional `strategy` argument (one of geometric or algebraic) to [`Surface.intersect()`][24]
- Added "algebraic" [`IntersectionStrategy`][20] via curve [implicitization][27] ([reference][28])
- Adding [`Curve.reduce_()`][21] which acts as a partial inverse to [`Curve.elevate()`][31]. 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][5] `show` keyword from [`Curve.plot()`][2], [`Surface.plot()`][3] and [`CurvedPolygon.plot()`][4]
- [Adding][32] `color` keyword to [`Curve.plot()`][2]
- [Adding][26] `alpha` keyword to [`Curve.plot()`][2]
- (**Breaking change**) [Splitting][6] the [`Surface.evaluate_multi()`][7] method into [`Surface.evaluate_barycentric_multi()`][8] and [`Surface.evaluate_cartesian_multi()`][9]
- [Adding][22] `__dict__` helpers on `Curve`, `CurvedPolygon` and `Surface`. These are `property`s intended only for REPL use, since classes with `__slots__` no longer have a `__dict__` attribute.

Miscellany
- Adding [`IntersectionClassification`][1] to docs ([ref][5])
- [Moving][12] 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][13] `matplotlib` as a dependency.

[1]: http://bezier.readthedocs.io/en/0.4.0/algorithm-helpers.htmlbezier._surface_helpers.IntersectionClassification
[2]: http://bezier.readthedocs.io/en/0.4.0/reference/bezier.curve.htmlbezier.curve.Curve.plot
[3]: http://bezier.readthedocs.io/en/0.4.0/reference/bezier.surface.htmlbezier.surface.Surface.plot
[4]: http://bezier.readthedocs.io/en/0.4.0/reference/bezier.curved_polygon.htmlbezier.curved_polygon.CurvedPolygon.plot
[5]: https://github.com/dhermes/bezier/commit/828f4238971b12a9d494ce38387cec855d063c91
[6]: https://github.com/dhermes/bezier/commit/cea88285b8c9002a57efd88e69b5bd2ef46e7ca7
[7]: http://bezier.readthedocs.io/en/0.3.0/reference/bezier.surface.htmlbezier.surface.Surface.evaluate_multi
[8]: http://bezier.readthedocs.io/en/0.4.0/reference/bezier.surface.htmlbezier.surface.Surface.evaluate_barycentric_multi
[9]: http://bezier.readthedocs.io/en/0.4.0/reference/bezier.surface.htmlbezier.surface.Surface.evaluate_cartesian_multi
[10]: https://github.com/dhermes/bezier/commit/dcf40f4c9ed2167e96fc8f4675aeedcc2d811a0b
[11]: http://bezier.readthedocs.io/en/0.4.0/reference/bezier.surface.htmlbezier.surface.Surface.locate
[12]: https://github.com/dhermes/bezier/commit/dc4d33cfcf7f9ac6e794b856dc6d76635d362922
[13]: https://github.com/dhermes/bezier/commit/064e2c5efe7fa6498d74a33798a363e2c8e0b83e
[14]: http://bezier.readthedocs.io/en/0.4.0/reference/bezier.curve.htmlbezier.curve.Curve.intersect
[15]: https://github.com/dhermes/bezier/commit/03a72428c6f9d3bd3a1fac9b7f9afa615ce12d46
[16]: https://github.com/dhermes/bezier/commit/6064e4c314d8d717873d46e6ef35c0bbc9772728
[17]: https://github.com/dhermes/bezier/commit/f1804f442f190d0bc36782e940ee0b8a68c5ecd6
[18]: https://github.com/dhermes/bezier/commit/dee81813e34d5f69c52f48aa90f7c11eb4ddc3ec
[19]: https://github.com/dhermes/bezier/commit/2611e64a735e46317cce08a41270d61024705fd9
[20]: http://bezier.readthedocs.io/en/0.4.0/reference/bezier.curve.htmlbezier.curve.IntersectionStrategy
[21]: http://bezier.readthedocs.io/en/0.4.0/reference/bezier.curve.htmlbezier.curve.Curve.reduce_
[22]: https://github.com/dhermes/bezier/commit/f0fca088ac6f70c39f9f5af457c29e3c82f094b5
[23]: https://github.com/dhermes/bezier/commit/e72ca20f0f4ee0f6399b56805b30fe67a02aa04f
[24]: http://bezier.readthedocs.io/en/0.4.0/reference/bezier.surface.htmlbezier.surface.Surface.intersect
[25]: https://github.com/dhermes/bezier/commit/4a8458c823d8acc185818f856889cff6f46300d3
[26]: https://github.com/dhermes/bezier/commit/dcbeefc25b7f5f9a1fa725dac04e81a43039f680
[27]: https://github.com/dhermes/bezier/commits/0.4.0/src/bezier/_implicitization.py
[28]: https://en.wikipedia.org/wiki/Resultant
[29]: https://github.com/dhermes/bezier/commits/0.4.0/src/bezier/speedup.f90
[30]: https://github.com/dhermes/bezier/blob/0.4.0/src/bezier/speedup.f90
[31]: http://bezier.readthedocs.io/en/0.4.0/reference/bezier.curve.htmlbezier.curve.Curve.elevate
[32]: https://github.com/dhermes/bezier/commit/ce838a2aaef2281f06603d1c76324a3aa8289cf9

0.3.0

Performance Optimizations
- Adding `__slots__` for all classes
- Removing all usage of `property` calls from internal callers (to avoid function call overhead)
- Avoiding un-necessary data copying, e.g. `nodes[[0], :]` creates a copy but

python
nodes[0, :].reshape((1, 2))


does not ([more details](https://docs.scipy.org/doc/numpy-1.6.0/reference/arrays.indexing.htmladvanced-indexing))
- Adding `_verify` switches to selectively disable overly defensive value checking. Added to [`CurvedPolygon`](http://bezier.readthedocs.io/en/0.3.0/reference/bezier.curved_polygon.htmlbezier.curved_polygon.CurvedPolygon) constructor, [`Surface.evaluate_barycentric()`](http://bezier.readthedocs.io/en/0.3.0/reference/bezier.surface.htmlbezier.surface.Surface.evaluate_barycentric), [`Surface.evaluate_cartesian()`](http://bezier.readthedocs.io/en/0.3.0/reference/bezier.surface.htmlbezier.surface.Surface.evaluate_cartesian), [`Surface.evaluate_multi()`](http://bezier.readthedocs.io/en/0.3.0/reference/bezier.surface.htmlbezier.surface.Surface.evaluate_multi) and [`Surface.intersect()`](http://bezier.readthedocs.io/en/0.3.0/reference/bezier.surface.htmlbezier.surface.Surface.intersect). Internal callers with already verified data now skip verification steps
- [Bailing out early](https://github.com/dhermes/bezier/commit/db816eb5a748bb997adcc2d7d9008638e22a824c) if surface bounding boxes are disjoint in [`Surface.intersect()`](http://bezier.readthedocs.io/en/0.3.0/reference/bezier.surface.htmlbezier.surface.Surface.intersect)

Breaking Changes
- Requiring `degree` in [`Curve`](http://bezier.readthedocs.io/en/0.3.0/reference/bezier.curve.htmlbezier.curve.Curve) and [`Surface`](http://bezier.readthedocs.io/en/0.3.0/reference/bezier.surface.htmlbezier.surface.Surface) constructors, but adding [`Curve.from_nodes()`](http://bezier.readthedocs.io/en/0.3.0/reference/bezier.curve.htmlbezier.curve.Curve.from_nodes) and [`Surface.from_nodes()`](http://bezier.readthedocs.io/en/0.3.0/reference/bezier.surface.htmlbezier.surface.Surface.from_nodes) factories to accept nodes only (computing the degree in the constructor every time is a waste of flops, especially if the caller knows the degree)
- [Removing](https://github.com/dhermes/bezier/commit/3393b9010c26b55a9c29afc2702426bb179b85a1) public [`Curve.copy()`](http://bezier.readthedocs.io/en/0.2.1/reference/bezier.curve.htmlbezier.curve.Curve.copy) and [`Surface.copy()`](http://bezier.readthedocs.io/en/0.2.1/reference/bezier.surface.htmlbezier.surface.Surface.copy)
- [Removing](https://github.com/dhermes/bezier/commit/3393b9010c26b55a9c29afc2702426bb179b85a1) custom equality checks for [`Curve`](http://bezier.readthedocs.io/en/0.2.1/reference/bezier.curve.htmlbezier.curve.Curve.__eq__) and [`Surface`](http://bezier.readthedocs.io/en/0.2.1/reference/bezier.surface.htmlbezier.surface.Surface.__eq__) objects. The previous implementation did not factor in all relevant values
- Returning `1xD` arrays [instead of flattened](https://github.com/dhermes/bezier/commit/b5e5b327594c6143956ed98703f596ff82b7501a) `D`-dimensional 1D arrays from [`Curve.evaluate()`](http://bezier.readthedocs.io/en/0.3.0/reference/bezier.curve.htmlbezier.curve.Curve.evaluate), [`Surface.evaluate_barycentric()`](http://bezier.readthedocs.io/en/0.3.0/reference/bezier.surface.htmlbezier.surface.Surface.evaluate_barycentric), [`Surface.evaluate_cartesian()`](http://bezier.readthedocs.io/en/0.3.0/reference/bezier.surface.htmlbezier.surface.Surface.evaluate_cartesian), and related helpers
- Renaming [`Intersection.left/right`](http://bezier.readthedocs.io/en/0.2.1/algorithm-helpers.htmlbezier._intersection_helpers.Intersection.left) as [`first/second`](http://bezier.readthedocs.io/en/0.3.0/algorithm-helpers.htmlbezier._intersection_helpers.Intersection.first) (They were poorly named originally, since "left" and "right" were in reference to where they were used **in code**, not geometry. This class is not part of the public interface, but it is documented.)

Bug Fixes
- Handling cases where one corner of a surface touches another but their interiors don't intersect (in [`Surface.intersect()`](http://bezier.readthedocs.io/en/0.3.0/reference/bezier.surface.htmlbezier.surface.Surface.intersect)). Adding `ignored_corner` classification to handle these curve-curve intersecions that don't contribute to a surface-surface intersection
- Throwing exception in [`Curve.locate()`](http://bezier.readthedocs.io/en/0.3.0/reference/bezier.curve.htmlbezier.curve.Curve.locate) when the subdivided intervals are very far apart (13)
- Improving [`Surface.is_valid`](http://bezier.readthedocs.io/en/0.3.0/reference/bezier.surface.htmlbezier.surface.Surface.is_valid) by considering the signs of the Jacobian determinant at corner nodes (12)

Miscellany
- Adding possible strategy to avoid linear convergence in [`newton_refine()`](http://bezier.readthedocs.io/en/0.3.0/algorithm-helpers.htmlbezier._intersection_helpers.newton_refine)
- Adding AppVeyor configuration to make sure there are no Windows issues, testing exclusively with `conda` install
- Updating generated images with `matplotlib` 2.0

Page 20 of 21

© 2024 Safety CLI Cybersecurity Inc. All Rights Reserved.