CDT is a C++ library for generating constraint or conforming Delaunay triangulations.
If CDT helped you please consider adding a star on GitHub. This means a lot to the authors 🤩
CDT::IntersectingConstraintEdges::TryResolve
)Latest online documentation (automatically generated with Doxygen).
CDT::VertexInsertionOrder
:
CDT::VertexInsertionOrder::Auto
uses breadth-first traversal of a Kd-tree for initial bulk-load [4] and randomized insertion order for the subsequent calls of CDT::Triangulation::insertVertices
. Randomization improves performance and avoid worst-case scenarios. Generally vertex insertion with CDT::VertexInsertionOrder::Auto
is faster.CDT::VertexInsertionOrder::AsProvided
when constructing a triangulation. Pre-conditions:
Post-conditions:
Supports three ways of removing outer triangles:
CDT::Triangulation::eraseSuperTriangle
: produce a convex-hullCDT::Triangulation::eraseOuterTriangles
: remove all outer triangles until a boundary defined by constraint edgesCDT::Triangulation::eraseOuterTrianglesAndHoles
: remove outer triangles and automatically detected holes. Starts from super-triangle and traverses triangles until outer boundary. Triangles outside outer boundary will be removed. Then traversal continues until next boundary. Triangles between two boundaries will be kept. Traversal to next boundary continues (this time removing triangles). Stops when all triangles are traversed.Supports overlapping boundaries
Removing duplicate points and re-mapping constraint edges can be done using functions: CDT::RemoveDuplicatesAndRemapEdges
, CDT::RemoveDuplicates
, CDT::RemapEdges
Uses William C. Lenthe's implementation of robust orientation and in-circle geometric predicates: github.com/wlenthe/GeometricPredicates
On old compilers without C++11 support Boost is used as a fall back for missing C++11 standard library features.
A demonstrator tool is included: requires Qt for GUI. When running demo-tool make sure that working directory contains files from 'data' folder.
CDT port is available in Microsoft's vcpkg.
CDT is not in the conan-center but there's a conanfile.py
recipe provided (in this repo).
Note that it might need small adjustments like changing boost version to fit your needs.
A recipe for CDT is available in spack.
CDT uses modern CMake and should just work out of the box without any surprises. The are many ways to consume CDT:
add_subdirectory
find_package
CMake options
Option | Default value | Description |
---|---|---|
CDT_USE_64_BIT_INDEX_TYPE | OFF | Use 64bits to store vertex/triangle index types. Otherwise 32bits are used (up to 4.2bn items) |
CDT_USE_AS_COMPILED_LIBRARY | OFF | Instantiate templates for float and double and compiled into a library |
Adding to CMake project directly
Can be done with add_subdirectory
command (e.g., see CDT visualizer's CMakeLists.txt).
# add CDT as subdirectory to CMake project
add_subdirectory(../CDT CDT)
Adding to non-CMake project directly
To use as header-only copy headers from CDT/include
To use as a compiled library define CDT_USE_AS_COMPILED_LIBRARY
and compile CDT.cpp
Consume pre-build CDT in CMake project with find_package
CDT provides package config files that can be included by other projects to find and use it.
# from CDT folder
mkdir build && cd build
# configure with desired CMake flags
cmake -DCDT_USE_AS_COMPILED_LIBRARY=ON ..
# build and install
cmake --build . && cmake --install .
# In consuming CMakeLists.txt
find_package(CDT REQUIRED CONFIG)
Public API is provided in two places:
CDT::Triangulation
class is used for performing constrained Delaunay triangulations.CDT.h
provide some additional functionality for removing duplicates, re-mapping edges and triangle depth-peelingDelaunay triangulation without constraints (triangulated convex-hull)
#include "CDT.h"
CDT::Triangulation<double> cdt;
cdt.insertVertices(/* points */);
cdt.eraseSuperTriangle();
/* access triangles */ = cdt.triangles;
/* access vertices */ = cdt.vertices;
/* access boundary (fixed) edges */ = cdt.fixedEdges;
/* calculate all edges (on demand) */ = CDT::extractEdgesFromTriangles(cdt.triangles);
Constrained Delaunay triangulation (auto-detected boundaries and holes)
// ... same as above
cdt.insertVertices(/* points */);
cdt.insertEdges(/* boundary edges */);
cdt.eraseOuterTrianglesAndHoles();
/* access triangles */ = cdt.triangles;
/* access vertices */ = cdt.vertices;
/* access boundary (fixed) edges */ = cdt.fixedEdges;
/* calculate all edges (on demand) */ = CDT::extractEdgesFromTriangles(cdt.triangles);
Conforming Delaunay triangulation
Use CDT::Triangulation::conformToEdges
instead of CDT::Triangulation::insertEdges
Resolve edge intersections by adding new points and splitting edges
Pass CDT::IntersectingConstraintEdges::TryResolve
to CDT::Triangulation
constructor.
Custom point/edge type
struct CustomPoint2D
{
double data[2];
};
struct CustomEdge
{
std::pair<std::size_t, std::size_t> vertices;
};
// containers other than std::vector will work too
std::vector<CustomPoint2D> points = /*...*/;
std::vector<CustomEdge> edges = /*...*/;
CDT::Triangulation<double> cdt;
cdt.insertVertices(
points.begin(),
points.end(),
[](const CustomPoint2D& p){ return p.data[0]; },
[](const CustomPoint2D& p){ return p.data[1]; }
);
cdt.insertEdges(
edges.begin(),
edges.end(),
[](const CustomEdge& e){ return e.vertices.first; },
[](const CustomEdge& e){ return e.vertices.second; }
);
For work-in-progress on Python bindings check-out PythonCDT
Any feedback and contributions are welcome.
Mozilla Public License, v. 2.0
For attribution you can use the following template:
This software is based part on CDT (C++ library for constrained Delaunay triangulation):
Copyright © 2019 Leica Geosystems Technology AB
Copyright © The CDT Contributors
Licensed under the MPL-2.0 license.
https://github.com/artem-ogre/CDT
${INSERT_FULL_MPL_2.0_TEXT}
[1] Marc Vigo Anglada, An improved incremental algorithm for constructing restricted Delaunay triangulations, Computers & Graphics, Volume 21, Issue 2, 1997, Pages 215-223, ISSN 0097-8493.
[2] Borut Žalik and Ivana Kolingerová, An incremental construction algorithm for Delaunay triangulation using the nearest-point paradigm, International Journal of Geographical Information Science, Volume 17, Issue 2, Pages 119-138, 2003, DOI 10.1080/713811749.
[3] Olivier Devillers, Sylvvain Pion, Monique Tellaud, Walking in a triangulation, International Journal of Foundations of Computer Science, Volume 13, Issue 2, Pages 181-199, 2002
[4] Liu, Jianfei & Yan, Jinhui & Lo, S.. A new insertion sequence for incremental Delaunay triangulation. Acta Mechanica Sinica, Volume 29, 2013