spade
Delaunay triangulations for the rust ecosystem
2.15.1
18M downloads/mo
#2233 most downloaded on crates.io
Stoeoef/spade
What this package is like to depend on
Last release 5 months ago
24 Mar 2026
Release timing varies
gaps range from 8 days to 7 months
Nearly every release is documented
notes for 38 of 40 stable releases
Nothing withdrawn
no release was ever pulled
10 years old
40 releases · first in 2016
1 release in the last 12 months
see the full history below
Release timeline
40 releases · Sep 2016 to Mar 2026Releases
latest 40-
2.15.124 Mar 2026Release notes
Open source →Fixed
- Prevents undesired splitting of inner constraint edges when
RefinementParameters::keep_constraint_edgeswas used (#134) - Prevents potential endless loop during refinement (#134)
- Prevents undesired splitting of inner constraint edges when
-
2.15.016 Aug 2025Release notes
Open source →Added
- Implements
ConstrainedDelaunayTriangulation::try_bulk_load_cdtfor loading CDTs without panicking if any constraints intersect (#137)
Changed
ConstrainedDelaunayTriangulation::bulk_load_cdtdoes load all vertices in order by default ("stable").ConstrainedDelaunayTriangulation::bulk_load_cdt_stableis deprecated. Use...::bulk_load_cdtinstead which behaves exactly the same.- Optimized implementation of now stable
ConstrainedDelaunayTriangulation::bulk_load_cdt. It is nearly as fast as its unstable alternative,Triangulation::bulk_load. - Bulk loading a triangulation with a
HierarchyHintGeneratordoes not load the hierarchy sequentially but uses bulk loading. This should speed up creating such triangulations.
- Implements
-
2.14.017 Jun 2025 -
2.13.104 Mar 2025Nothing published for this version
-
2.13.020 Feb 2025 -
2.12.109 Sep 2024Release notes
Open source →Fix
- Fixes #113. This could lead to rare crashes when calling
ConstrainedDelaunayTriangulation::add_constraint_and_split
- Fixes #113. This could lead to rare crashes when calling
-
2.12.013 Aug 2024Release notes
Open source →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_vertexandTriangulation::locate_and_removewill all panic if called with a position with aNANcoordinate. The previous behavior was inconsistent - the methods would either crash or return a nonsensical result.
- Fixes potential crash of
-
2.11.003 Aug 2024Release notes
Open source →Added
- Added
ConstrainedDelaunayTriangulation::remove_constraint_edge(edge)
Fix
- Fixes potential crash when using
ConstrainedDelaunayTriangulation::add_constraint_and_split. See #109
- Added
-
2.10.025 Jul 2024Release notes
Open source →Added
- Added basic
mintsupport via themintfeature - Implements
Triangulation::get_vertex(FixedVertexHandle)(See #106)
Fix
- Fixes potential crash when inserting / locating vertices (See #107)
- Added basic
-
2.9.014 Jun 2024Release notes
Open source →Added
- Added
ConstrainedDelaunayTriangulation::try_add_constraint - Added
ConstrainedDelaunayTriangulation::add_constraint_and_split
- Added
-
2.8.022 May 2024Release notes
Open source →Added
- Added
LineIntersectionIteratorandIntersection - Added
Cdt::get_conflicting_edges_between_verticesandCdt::get_conflicting_edges_between_points
- Added
-
2.7.017 May 2024Release notes
Open source →Added
- Implements
ConstrainedDelaunayTriangulation::bulk_load_cdt - Implements
ConstrainedDelaunayTriangulation::bulk_load_cdt_stable
- Implements
-
2.6.014 Jan 2024Release notes
Open source →Added
- Implements
DelaunayTriangulation::bulk_load_stable(See #77) - Implements
FixedVertexHandle::from_index(usize)
- Implements
-
2.5.128 Dec 2023Release notes
Open source →Fix
- Locating or inserting vertices into a CDT could sometimes end up in an infinite loop. See #98.
-
2.5.026 Dec 2023Release notes
Open source →Added
- Implements natural neighbor interpolation. See type
NaturalNeighborfor more on this!
Fix
- Fixes
PointProjection::reversed()- the method would return a projection that gives sometimes incorrect results.
- Implements natural neighbor interpolation. See type
-
2.4.102 Dec 2023Release notes
Open source →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.019 Nov 2023Release notes
Open source →Added
- Implements Delaunay refinement: Adds
ConstrainedDelaunayTriangulation::refine, along withRefinementParametersto modify the refinement behavior. - Added method
ConstrainedDelaunayTriangulation::add_constraint_edgesfor simpler creation of strips and loops of connected constraint edges. - Adds
impl From<DelaunayTriangulation<...>>forConstrainedDelaunayTriangulation<...>for converting regular triangulations into CDTs.
- Implements Delaunay refinement: Adds
-
2.3.114 Nov 2023Release notes
Open source →Fix
- Fixes compilation issues when using
serdetogether with--no-default-features(#95)
- Fixes compilation issues when using
-
2.3.009 Nov 2023 -
2.2.102 Nov 2023Release notes
Open source →Changed
- Specializes
nthandnth_backfor any vertex, face and edge iterator - Removed
optionaldependency (#91) - Updated
robustcrate to 1.1.0 (#90)
- Specializes
-
2.2.018 Apr 2023Release notes
Open source →Added
- Added
DirectedEdgeHandle::centerandUndirectedEdgeHandle::center - Added
UndirectedEdgeHandle::nearest_point - Adds
UndirectedEdgeHandle::is_constraint_edgeandDirectedEdgeHandle::is_constraint_edge(only implemented for edge handles of a CDT)
Fix
- Fix
nearest_neighborhinting
- Added
-
2.1.001 Jan 2023Release notes
Open source →Added
- Added
crate::FloatTriangulationsfor additional methods of triangulations overf32orf64 - 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
indexfunction for any fixed and dynamic handle, returning the internal index of the element. - Added missing
DelaunayTriangulation::Cloneimplementation - Added
DirectedEdgeHandle::positions - Added
Triangulation::clear
Bugfixes
- (breaking fix)
ConstrainedDelaunayTriangulation::can_add_constraint_edgeaccidentally returned the wrong result (truewhen it should have returnedfalseand vice versa) #75 - Fixes a crash that could occur when inserting an element into a CDT (#78)
- Added
-
2.0.029 Jan 2022Release notes
Open source →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
f64andf32can be used as scalar types. - Removed support for
cgmathandnalgebracrate to slim down the crate dependencies. - Removed
PointN. Using Spade now requires to convert any position intoSpade::Point2. - Removed r-tree data structure (it has been moved into the
rstarcrate) - 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
HierarchyHintGeneratorinstead.
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
handlesmodule for more information):- Introduced
UndirectedEdgeHandleto refer to undirected edges of the triangulation FaceHandleis 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
handlesmodule) - Fixed directed edge handles can now be
reversed
- Introduced
- Both
DelaunayTriangulationandCDTnow allow to also annotate undirected edges with arbitrary data - Added
Triangulation::convex_hullwhich allows to directly iterate over the triangulation's convex hull - Added
Triangulation::bulk_loadfor efficient bulk creation of triangulations.
Changed
- Performance improvements
- The newly introduced
HierarchyHintGeneratorshould outperform the r-tree based hint generator consistently for uniformly distributed data sets (2x - 3x times faster) LastUsedVertexHintGeneratorand its predecessorDelaunayWalkLocateare still comparable.- The new
Triangulation::bulk_loadwill 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_prevfunction tonext/prev. - Renamed
symtorev - 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:
FloatDelaunayTriangulationandFloatCdthave been replaced byDelaunayTriangulationandConstrainedDelaunayTriangulationIntDelaunayTriangulationis not supported anymore. Usef64orf32as scalar type instead if possible.DelaunayWalkLocatehas been renamed toLastUsedVertexHintGeneratorDelaunayTreeLocatehas been replaced byHierarchyHintGenerator
-
1.8.201 Apr 2020Release notes
Open source →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.105 Sep 2019Nothing published for this version
-
1.8.020 Jun 2019Release notes
Open source →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.008 Feb 2019Release notes
Open source →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.001 Nov 2018Release notes
Open source →SimpleEdge,SimpleCircle,BoundingRectnow deriveClone,Copy,PartialEq,Eq,PartialOrd,OrdandHashCdtEdgeis now public - the type cannot be used, but may be necessary for method signatures containing CDTs.- Added some standard
derives 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.112 Jun 2018 -
1.5.007 Jun 2018Release notes
Open source →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.*
- Added
-
1.4.025 Feb 2018Release notes
Open source →Added
- Added cargo feature 'serde_serialize', rtrees, triangulations and primitives now support serialization with serde!
RTrees implementDebug- New constructor:
BoundingRect::from_points
Changed
- Bumped compatible nalgebra version to 0.14.*
Bugfixes
BoundingRectnow implementsSpatialObject
-
1.3.006 Jan 2018Release notes
Open source →Deprecated
spade::delaunay::DelaunayTriangulation::lookupis deprecated, uselocate_vertexinsteadspade::delaunay::DelaunayTriangulation::lookup_and_removeis deprecated, uselocate_and_removeinstead
Changed
- Bumped compatible
cgmathandnalgebraversions. - Spade's various kernels are not instantiable anymore and implement
Clone.
Added
- Spade now implements constrained delaunay triangulations!
locateandnearest_neighbornow also work with degenerate triangulations- Added constrained triangulation example
- Added bulk loading for r-trees
DelaunayTriangulationnow implementsClone- New method for triangulations:
get_edge_from_neighborsto get an existing edge from its two adjacent points.
Bugfixes
- Fixed
SimpleCircledistance calculation for more than 2 dimensions.
-
1.2.013 May 2017Release notes
Open source →Changed
- Bumped compatible
cgmathandnalgebraversions. Unfortunately, due to the way Cargo handles "external dependencies" (thus, dependencies whose types are part of spade's public API likecgmathandnalgebraPoints), this must be considered a breaking change. FloatKernelnow works happily withf32coordinates. 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.
- Bumped compatible
-
1.1.012 Apr 2017Release notes
Open source →Deprecated
spade::delaunay::RTreeDelaunayLocate<T>is deprecated, usespade::delaunay::DelaunayTreeLocate<T>insteadspade::delaunay::TriangulationWalkLocate<T>is deprecated, usespade::delaunay::DelaunayWalkLocateinstead ( without any type argument)
Changed
- Insertion into a delaunay triangulation now uses
SmallVecfrom thesmallveccrate 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.002 Mar 2017Release notes
Open source →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
VectorNrenamed toPointN- Bumped supported nalgebra version to
0.11.* Point2,Point3... from cgmath and nalgebra crates do implementVectorNVector2,Vector3... from cgmath and nalgebra crates do not implementVectorN- 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_triangulationtolocate - Renamed
DelaunayTriangulation::handle(..)tovertex(..)
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
locateandlookupcan now be used with a hint (see{insert|locate}_with_hint)- Added type shorthands
spade::delaunay::{Float|Int}Triangulationand quick creation methodswith_tree_lookupandwith_walk_lookup - Added struct
EdgeHandleand typeFixedEdgeHandle. - Added struct
FaceHandleand typeFixedFaceHandle. - Added methods
DelaunayTriangulation::edge(..)and::face(..) - Added
DelaunayTriangulation::infinite_face() - Added
DelaunayTriangulation::is_degenerate() - Added
DelaunayTriangulation::num_{edges|triangles|faces}() CCWIteratorandONextIteratornow both implementDoubleEndedIterator
Removed
- Removed support for pointer like types (e.g. inserting
Box<Point2<_>>) to simplify type signatures. - Removed
DelaunayTriangulation::lookup_in_circle(..)andlookup_in_rect(..). These methods will likely be added again in a later release.
-
0.3.010 Dec 2016Release notes
Open source →Changed
VectorNtrait trimmed down, now contains only a small set of functions.
Added
[S; 2],[S; 3]and[S; 4]now implementVectorNandTwoDimensionalorThreeDimensionalwhen appropriate. This change allows to insert fixed size arrays that encode positions directly intoRTreeorDelaunayInterpolation.
Removed
- Removed dependencies on crate
randand cratenoise
-
0.2.111 Oct 2016Release notes
Open source →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_normalandestimate_gradient
- Function signatures of
-
0.2.008 Oct 2016Release notes
Open source →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
RTreeandDelaunayTriangulationhave now an additional parameter,B. This allows to insert pointer like objects (that is, an objectB: Borrow<T>) into the tree.
-
0.1.128 Sep 2016Release notes
Open source →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 thoughFloatKernelwas 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.023 Sep 2016