# Change Log All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). ## [2.12.1] - 2024-09-09 ### Fix - Fixes #113. This could lead to rare crashes when calling `ConstrainedDelaunayTriangulation::add_constraint_and_split` ## [2.12.0] - 2024-08-13 ### Fix - Fixes potential crash of `ConstrainedDelaunayTriangulation::add_constraint_and_split`. This could only happen in rare situations if a newly inserted split point would lie very close to other vertices or edges of the triangulation. See #111 - **Potentially breaking**: `Triangulation::locate`, `Triangulation::locate_with_hint`, `Triangulation::locate_vertex` and `Triangulation::locate_and_remove` will all panic if called with a position with a `NAN` coordinate. The previous behavior was inconsistent - the methods would either crash or return a nonsensical result. ## [2.11.0] - 2024-08-03 ### Added - Added `ConstrainedDelaunayTriangulation::remove_constraint_edge(edge)` ### Fix - Fixes potential crash when using `ConstrainedDelaunayTriangulation::add_constraint_and_split`. See #109 ## [2.10.0] - 2024-07-25 ### Added - Added basic `mint` support via the `mint` feature - Implements `Triangulation::get_vertex(FixedVertexHandle)` (See #106) ### Fix - Fixes potential crash when inserting / locating vertices (See #107) ## [2.9.0] - 2024-06-14 ### Added - Added `ConstrainedDelaunayTriangulation::try_add_constraint` - Added `ConstrainedDelaunayTriangulation::add_constraint_and_split` ## [2.8.0] - 2024-05-22 ### Added - Added `LineIntersectionIterator` and `Intersection` - Added `Cdt::get_conflicting_edges_between_vertices` and `Cdt::get_conflicting_edges_between_points` ## [2.7.0] - 2024-05-17 ### Added - Implements `ConstrainedDelaunayTriangulation::bulk_load_cdt` - Implements `ConstrainedDelaunayTriangulation::bulk_load_cdt_stable` ## [2.6.0] - 2024-01-14 ### Added - Implements `DelaunayTriangulation::bulk_load_stable` (See #77) - Implements `FixedVertexHandle::from_index(usize)` ## [2.5.1] - 2023-12-27 ### Fix - Locating or inserting vertices into a CDT could sometimes end up in an infinite loop. See #98. ## [2.5.0] - 2023-12-26 ### Added - Implements natural neighbor interpolation. See type `NaturalNeighbor` for more on this! ### Fix - Fixes `PointProjection::reversed()` - the method would return a projection that gives sometimes incorrect results. ## [2.4.1] - 2023-12-01 ### Fix - Fixes panic during refinement due to rounding errors (see #96) - Inserting a vertex onto a constraint edge of a degenerate CDT would not create a new constraint edge. ## [2.4.0] - 2023-11-19 ### Added - Implements Delaunay refinement: Adds `ConstrainedDelaunayTriangulation::refine`, along with `RefinementParameters` to modify the refinement behavior. - Added method `ConstrainedDelaunayTriangulation::add_constraint_edges` for simpler creation of strips and loops of connected constraint edges. - Adds `impl From>` for `ConstrainedDelaunayTriangulation<...>` for converting regular triangulations into CDTs. ## [2.3.1] - 2023-11-14 ### Fix - Fixes compilation issues when using `serde` together with `--no-default-features` (#95) ## [2.3.0] - 2023-11-09 ### Added - Adds `no_std` support (when using `default-features = false`, #92) ## [2.2.1] - 2023-11-03 ### Changed - Specializes `nth` and `nth_back` for any vertex, face and edge iterator - Removed `optional` dependency (#91) - Updated `robust` crate to 1.1.0 (#90) ## [2.2.0] - 2023-04-18 ### Added - Added `DirectedEdgeHandle::center` and `UndirectedEdgeHandle::center` - Added `UndirectedEdgeHandle::nearest_point` - Adds `UndirectedEdgeHandle::is_constraint_edge` and `DirectedEdgeHandle::is_constraint_edge` (only implemented for edge handles of a CDT) ### Fix - Fix `nearest_neighbor` hinting ## [2.1.0] - 2023-01-01 ### Added - Added `crate::FloatTriangulations` for additional methods of triangulations over `f32` or `f64` - Added `FloatTriangulation::get_edges_in_rectangle` - Added `FloatTriangulation::get_edges_in_circle` - Added `FloatTriangulation::get_vertices_in_rectangle` - Added `FloatTriangulation::get_vertices_in_circle` - Added `index` function for any fixed and dynamic handle, returning the internal index of the element. - Added missing `DelaunayTriangulation::Clone` implementation - Added `DirectedEdgeHandle::positions` - Added `Triangulation::clear` ### Bugfixes - (breaking fix) `ConstrainedDelaunayTriangulation::can_add_constraint_edge` accidentally returned the wrong result (`true` when it should have returned `false` and vice versa) #75 - Fixes a crash that could occur when inserting an element into a CDT (#78) ## [2.0.0] - 2022-01-29 This release is focussed on API refinement, performance improvements and usability improvements. ### General API refinement Many features of Spade 1 showed too little benefit to legitimize keeping them. Spade 2.0 attempts to slim down the API surface to a few important functions and types and leaves out the more complicated bits to make it more simple to use. ### Removed features (planned to be re-introduced in an upcoming release) - Removed interpolation functions ### Removed features (not planned to re-introduced) - Removed support for integer coordinates. Only `f64` and `f32` can be used as scalar types. - Removed support for `cgmath` and `nalgebra` crate to slim down the crate dependencies. - Removed `PointN`. Using Spade now requires to convert any position into `Spade::Point2`. - Removed r-tree data structure (it has been moved into the `rstar` crate) - Removed geometric primitives (`SimpleCircle`, `SimpleEdge`, `SimpleTriangle`) - Removed support for custom calculation kernels. Spade now uses the precise calculation kernel by default (previously called `FloatKernel`). - Removed support for Delaunay triangulations backed by r-trees. Use the newly introduced `HierarchyHintGenerator` instead. ### Added features - Added basic support for Voronoi diagrams (refer to the documentation of struct `DelaunayTriangulation`) - Added struct `HierarchyHintGenerator`, a hint generator with small performance and memory overhead which is optimized for uniformly distributed data. - Improved conciseness of handle types (refer to the `handles` module for more information): - Introduced `UndirectedEdgeHandle` to refer to undirected edges of the triangulation - `FaceHandle` is now parameterized to denote if it refers to an inner face or to the single outer face - Added some methods on the individual handle types - Added iterators for all handle types (see `handles` module) - Fixed directed edge handles can now be `rev`ersed - Both `DelaunayTriangulation` and `CDT` now allow to also annotate undirected edges with arbitrary data - Added `Triangulation::convex_hull` which allows to directly iterate over the triangulation's convex hull - Added `Triangulation::bulk_load` for efficient bulk creation of triangulations. ### Changed - Performance improvements - The newly introduced `HierarchyHintGenerator` should outperform the r-tree based hint generator consistently for uniformly distributed data sets (2x - 3x times faster) - `LastUsedVertexHintGenerator` and its predecessor `DelaunayWalkLocate` are still comparable. - The new `Triangulation::bulk_load` will be more efficient for creating triangulations from a given set of vertices compared to inserting them incrementally. - Cleaned up crate dependencies: Spade 2.0 depends only on 4 other crates without any transitive dependencies. This should make it more viable to include Spade into other projects. - Renamed any `o_next` / `o_prev` function to `next` / `prev`. - Renamed `sym` to `rev` - Many other smaller changes - they are omitted from this changelog. ### Migration notes Keep in mind that not all features have been preserved before attempting to upgrade. Other than that, upgrading should be mostly consist of renaming: - `FloatDelaunayTriangulation` and `FloatCdt` have been replaced by `DelaunayTriangulation` and `ConstrainedDelaunayTriangulation` - `IntDelaunayTriangulation` is not supported anymore. Use `f64` or `f32` as scalar type instead if possible. - `DelaunayWalkLocate` has been renamed to `LastUsedVertexHintGenerator` - `DelaunayTreeLocate` has been replaced by `HierarchyHintGenerator` ## [1.8.2] - 2020-04-01 ### Bugfixes - Removing elements from an rtree could leave the tree in an inconsistent state (#55). This made some nearest neighbor queries return incorrect results. ## [1.8.0] - 2019-06-20 ### Changed - Bumped compatible nalgebra version to 0.18 - Updated edition to 2018 - Fixed all clippy findings - Cargo fmt'ed source code ### Bugfixes - SimpleTriangle now overwrites both Hash and PartialEq ## [1.7.0] - 2019-02-08 ### Changed - Updated README.md - Merge #41: Use smallvec in barycentric interpolation - Bumped compatible cgmath version to 0.17.* - Bumped compatible nalgebra version to 0.17.* ## [1.6.0] - 2018-11-1 ### - `SimpleEdge`, `SimpleCircle`, `BoundingRect` now derive `Clone`, `Copy`, `PartialEq`, `Eq`, `PartialOrd`, `Ord` and `Hash` - `CdtEdge` is now public - the type cannot be used, but may be necessary for method signatures containing CDTs. - Added some standard `derive`s for various other types that are applicable. ### Changed - Bumped compatible nalgebra version to 0.16.* - Bumped compatible num version to `>=0.1, <=0.2.*`. This may be a breaking change due to the way cargo resolves dependencies. An upgrade to num 0.2 is recommended. ## [1.5.1] - 2018-06-12 ### Bugfixes - `nearest_neighbor` sometimes incorrectly returned `None` ## [1.5.0] - 2018-06-07 ### Added - Added `RTree::nearest_neighbor_iterator` ### Changed - Improved performance of single nearest neighbor queries - Bumped compatible nalgebra version to 0.15.* - Bumped compatible cgmath version to 0.16.* ## [1.4.0] - 2018-02-25 ### Added - Added cargo feature 'serde_serialize', rtrees, triangulations and primitives now support serialization with serde! - `RTree`s implement `Debug` - New constructor: `BoundingRect::from_points` ### Changed - Bumped compatible nalgebra version to 0.14.* ### Bugfixes - `BoundingRect` now implements `SpatialObject` ## [1.3.0] - 2018-01-06 ### Deprecated - `spade::delaunay::DelaunayTriangulation::lookup` is deprecated, use `locate_vertex` instead - `spade::delaunay::DelaunayTriangulation::lookup_and_remove` is deprecated, use `locate_and_remove` instead ### Changed - Bumped compatible `cgmath` and `nalgebra` versions. - Spade's various kernels are not instantiable anymore and implement `Clone`. ### Added - Spade now implements constrained delaunay triangulations! - `locate` and `nearest_neighbor` now also work with degenerate triangulations - Added constrained triangulation example - Added bulk loading for r-trees - `DelaunayTriangulation` now implements `Clone` - New method for triangulations: `get_edge_from_neighbors` to get an existing edge from its two adjacent points. ### Bugfixes - Fixed `SimpleCircle` distance calculation for more than 2 dimensions. ## [1.2.0] - 2017-05-13 ### Changed - Bumped compatible `cgmath` and `nalgebra` versions. Unfortunately, due to the way Cargo handles "external dependencies" (thus, dependencies whose types are part of spade's public API like `cgmath` and `nalgebra` Points), this must be considered a breaking change. - `FloatKernel` now works happily with `f32` coordinates. They will be cast to double precision before the kernel evaluates any query, thus, no performance gain results from this. Only the space requirements will differ. ## [1.1.0] - 2017-04-12 ### Deprecated - `spade::delaunay::RTreeDelaunayLocate` is deprecated, use `spade::delaunay::DelaunayTreeLocate` instead - `spade::delaunay::TriangulationWalkLocate` is deprecated, use `spade::delaunay::DelaunayWalkLocate` instead ( without any type argument) ### Changed - Insertion into a delaunay triangulation now uses `SmallVec` from the `smallvec` crate for better performance. - Improved interpolation performance - natural neighbor interpolation methods will be significantly faster now. ### Added - Added struct `spade::delaunay::DelaunayWalkLocate`. The struct will now keep track of the last query made and use it for the next query. A query can be an interpolation, lookup, locate or nearest neighbor query, insertion will also update the hint to the inserted vertex. This means: Subsequent queries that are close to each other will run in O(1) without the need of giving an explicit hint. This behaviour was only implemented for insertion until now. - Added method `spade::delaunay::DelaunayTriangulation::nearest_neighbor` - Added method `spade::delaunay::DelaunayTriangulation::locate_vertex` - Added method `spade::primitives::SimpleEdge::length2` - Added an interpolation benchmark ## [1.0.0] - 2017-03-02 A lot has changed for the 1.0. release, only larger changes are shown. ### Changed - Changed project license from Apache 2.0 to dual MIT / Apache 2.0 - `VectorN` renamed to `PointN` - Bumped supported nalgebra version to `0.11.*` - `Point2`, `Point3` ... from cgmath and nalgebra crates *do* implement `VectorN` - `Vector2`, `Vector3` ... from cgmath and nalgebra crates *do not* implement `VectorN` - Moved all kernels from the root to `spade::kernels` - Moved delaunay triangulation and handle types to `spade::delaunay` - Moved the rtree to `spade::rtree::RTree` - Renamed `DelaunayTriangulation::lookup_in_triangulation` to `locate` - Renamed `DelaunayTriangulation::handle(..)` to `vertex(..)` ### Added - Added support for vertex removal in delaunay triangulations! - Added `DelaunayTriangulation::barycentric_interpolation(..)` - Added support for different lookup methods for delaunay triangulation (see `DelaunayLookupStructure`) - Added a user guide! Check it out [here](https://stoeoef.gitbooks.io/spade-user-manual/content/) - `locate` and `lookup` can now be used with a hint (see `{insert|locate}_with_hint`) - Added type shorthands `spade::delaunay::{Float|Int}Triangulation` and quick creation methods `with_tree_lookup` and `with_walk_lookup` - Added struct `EdgeHandle` and type `FixedEdgeHandle`. - Added struct `FaceHandle` and type `FixedFaceHandle`. - Added methods `DelaunayTriangulation::edge(..)` and `::face(..)` - Added `DelaunayTriangulation::infinite_face()` - Added `DelaunayTriangulation::is_degenerate()` - Added `DelaunayTriangulation::num_{edges|triangles|faces}()` - `CCWIterator` and `ONextIterator` now both implement `DoubleEndedIterator` ### Removed - Removed support for pointer like types (e.g. inserting `Box>`) to simplify type signatures. - Removed `DelaunayTriangulation::lookup_in_circle(..)` and `lookup_in_rect(..)`. These methods will likely be added again in a later release. ## [0.3.0] - 2016-12-10 ### Changed - `VectorN` trait trimmed down, now contains only a small set of functions. ### Added - `[S; 2]`, `[S; 3]` and `[S; 4]` now implement `VectorN` and `TwoDimensional` or `ThreeDimensional` when appropriate. This change allows to insert fixed size arrays that encode positions directly into `RTree` or `DelaunayInterpolation`. ### Removed - Removed dependencies on crate `rand` and crate `noise` ## [0.2.1] - 2016-10-11 ### Changed - Function signatures of `nn_interpolation_c1_*` slightly modified. - Sibson's c1 interpolant now comes with a flatness factor ### Fixes - Wrong documentation link in crate description - Fixed signatures of `estimate_normal` and `estimate_gradient` ## [0.2.0] - 2016-10-08 ### Added - `DelaunayTriangulation`: `estimate_normal`, `estimate_normals`, `estimate_gradient`, `estimate_gradients` - Added Sibson's c1 interpolant, `DelaunayTriangulation::nn_interpolation_c1_sibson` - Added Farin's c1 interpolant, `DelaunayTriangulation::nn_interpolation_c1_farin` - trait `ThreeDimensional` ### Changed - Type signatures of `RTree` and `DelaunayTriangulation` have now an additional parameter, `B`. This allows to insert pointer like objects (that is, an object `B: Borrow`) into the tree. ## [0.1.1] - 2016-09-28 ### Added - Documentaion to all functions and types intended for public use - `RTree::lookup_mut(..)` - `RTree::contains(..)` - `DelaunayTriangulation::handle_mut(..)` - `DelaunayTriangulation::lookup_mut(..)` - `DelaunayKernel::point_on_edge(..)` - `SimpleTriangle::nearest_point_on_edge(..)` - types `TwoDimensional`, `HasPosition2D` ### Removed - `SimpleEdge::point_on_edge(..)` - `SimpleTriangle::is_ordered_ccw(..)` ### Fixed - Potential crashes when inserting points into a `DelaunayTriangulation`, even though `FloatKernel` was used. ### Changed - cgmath dependency bumped to 0.12.* - DelaunayTriangulations and some primitives now will only work with two-dimensional coordinates. Using higher dimensions actually yielded unspecified results. ## 0.1.0 - 2016-09-23 Initial commit [2.12.1]: https://github.com/Stoeoef/spade/compare/v2.12.0...v2.12.1 [2.12.0]: https://github.com/Stoeoef/spade/compare/v2.11.0...v2.12.0 [2.11.0]: https://github.com/Stoeoef/spade/compare/v2.10.0...v2.11.0 [2.10.0]: https://github.com/Stoeoef/spade/compare/v2.9.0...v2.10.0 [2.9.0]: https://github.com/Stoeoef/spade/compare/v2.8.0...v2.9.0 [2.8.0]: https://github.com/Stoeoef/spade/compare/v2.7.0...v2.8.0 [2.7.0]: https://github.com/Stoeoef/spade/compare/v2.6.0...v2.7.0 [2.6.0]: https://github.com/Stoeoef/spade/compare/v2.5.1...v2.6.0 [2.5.1]: https://github.com/Stoeoef/spade/compare/v2.5.0...v2.5.1 [2.5.0]: https://github.com/Stoeoef/spade/compare/v2.4.1...v2.5.0 [2.4.1]: https://github.com/Stoeoef/spade/compare/v2.4.0...v2.4.1 [2.4.0]: https://github.com/Stoeoef/spade/compare/v2.3.1...v2.4.0 [2.3.1]: https://github.com/Stoeoef/spade/compare/v2.3.0...v2.3.1 [2.3.0]: https://github.com/Stoeoef/spade/compare/v2.2.1...v2.3.0 [2.2.1]: https://github.com/Stoeoef/spade/compare/v2.2.0...v2.2.1 [2.2.0]: https://github.com/Stoeoef/spade/compare/v2.0.0...v2.2.0 [2.1.0]: https://github.com/Stoeoef/spade/compare/v2.0.0...v2.1.0 [2.0.0]: https://github.com/Stoeoef/spade/compare/v1.8.2...v2.0.0 [1.8.2]: https://github.com/Stoeoef/spade/compare/v1.8.0...v1.8.2 [1.8.0]: https://github.com/Stoeoef/spade/compare/v1.7.0...v1.8.0 [1.7.0]: https://github.com/Stoeoef/spade/compare/v1.6.0...v1.7.0 [1.6.0]: https://github.com/Stoeoef/spade/compare/v1.5.1...v1.6.0 [1.5.1]: https://github.com/Stoeoef/spade/compare/v1.5.0...v1.5.1 [1.5.0]: https://github.com/Stoeoef/spade/compare/v1.4.0...v1.5.0 [1.4.0]: https://github.com/Stoeoef/spade/compare/v1.3.0...v1.4.0 [1.3.0]: https://github.com/Stoeoef/spade/compare/v1.2.0...v1.3.0 [1.2.0]: https://github.com/Stoeoef/spade/compare/v1.1.0...v1.2.0 [1.1.0]: https://github.com/Stoeoef/spade/compare/v1.0.0...v1.1.0 [1.0.0]: https://github.com/Stoeoef/spade/compare/v0.3.0...v1.0.0 [0.3.0]: https://github.com/Stoeoef/spade/compare/v0.2.1...v0.3.0 [0.2.1]: https://github.com/Stoeoef/spade/compare/v0.2.0...v0.2.1 [0.2.0]: https://github.com/Stoeoef/spade/compare/v0.1.1...v0.2.0 [0.1.1]: https://github.com/Stoeoef/spade/compare/v0.1.0...v0.1.1