Re-triangulation
After generating the contour lines, the next crucial step is to triangulate the
assembled contour mesh and refine it to create a high-quality final mesh. This
process is handled by the triangulateAssembledMesh
function within the
ContourConstraint
class. The function utilizes the CGAL library, specifically
the Constrained_Delaunay_triangulation_2
class, to perform the triangulation
while respecting the contour constraints.
1. TriangulateAssembledMesh function
The triangulateAssembledMesh
function is responsible for taking the non-triangulated
mesh, which consists of edges from the computed contour lines, and generating a
triangulated mesh that adheres to these constraints. This is crucial for
ensuring that the contour lines are preserved in the final mesh.
std::unique_ptr<ContourConstraint::mesh_type> ContourConstraint::triangulateAssembledMesh(mesh_type const &nonTriangulated)
{
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef CGAL::Triangulation_vertex_base_2<K> Vb;
typedef CGAL::Constrained_triangulation_face_base_2<K> Fb;
typedef CGAL::Triangulation_data_structure_2<Vb, Fb> Tds;
typedef CGAL::Constrained_Delaunay_triangulation_2<K, Tds> CDT;
typedef CDT::Point Point;
CDT cdt;
for (const auto &edge : nonTriangulated.edges())
{
Point p1(edge->point(0).x(), edge->point(0).y());
Point p2(edge->point(1).x(), edge->point(1).y());
cdt.insert_constraint(p1, p2);
}
CGAL::make_conforming_Delaunay_2(cdt);
std::unique_ptr<mesh_type> ret = std::make_unique<mesh_type>();
for (auto fit = cdt.finite_faces_begin(); fit != cdt.finite_faces_end(); ++fit)
{
auto v0 = fit->vertex(0)->point();
auto v1 = fit->vertex(1)->point();
auto v2 = fit->vertex(2)->point();
auto p0 = ret->addPoint(std::make_unique<mesh_type::point_type>(v0.x(), v0.y(), 0));
auto p1 = ret->addPoint(std::make_unique<mesh_type::point_type>(v1.x(), v1.y(), 0));
auto p2 = ret->addPoint(std::make_unique<mesh_type::point_type>(v2.x(), v2.y(), 0));
auto tri = std::make_unique<mesh_type::triangle_type>(p0, p1, p2);
ret->addTriangle(std::move(tri));
}
return ret;
}
2. CGAL and constrained Delaunay triangulation
The CGAL library provides a robust framework for computational geometry, and
one of its key offerings is the Constrained_Delaunay_triangulation_2
class.
This class extends the concept of Delaunay triangulation by allowing the
inclusion of constraints, such as the edges composing the contour lines in our case.
A Delaunay triangulation is a triangulation where no point in the set is inside the circumcircle of any triangle. However, when constraints are applied, such as pre-existing edges that must be part of the triangulation (in this case, contour lines), the triangulation may no longer fulfill the strict Delaunay criterion. This is where constrained Delaunay triangulation (CDT) comes in.
3. How constrained Delaunay triangulation works
-
Inserting constraints: The
triangulateAssembledMesh
function begins by iterating over the edges of the non-triangulated mesh. Each edge represents a segment of a contour line. These edges are inserted into theConstrained_Delaunay_triangulation_2
object (cdt
) as constraints using theinsert_constraint
method. This ensures that the resulting triangulation respects the contour lines. -
Conforming Delaunay triangulation: Once all constraints are inserted, the
CGAL::make_conforming_Delaunay_2
function is called. This function refines the triangulation to ensure that the resulting mesh is as close as possible to a Delaunay triangulation, given the constraints. The refinement involves flipping edges and inserting additional vertices as needed to satisfy the Delaunay condition (source) wherever possible, without violating the constraints. -
Generating the final mesh: After the constrained Delaunay triangulation is complete, the function iterates over the faces of the triangulation. For each triangular face, the vertices are added to the final mesh, and the corresponding triangle is created and stored.
4. Implementation in the project
In the provided code, the ContourConstraint
class makes extensive use of CDT via the CGAL::Constrained_Delaunay_triangulation_2
class from the CGAL library. This class enables the project to handle complex geometries with constraints, such as terrain contours or other critical boundaries.
The triangulation is performed by inserting constraints—typically line segments or polylines—into the CDT, which then computes a triangulation that honors these constraints while attempting to maintain as much of the Delaunay property as possible.
Here’s a brief overview of how this is applied in the code:
-
Constraint insertion: Constraints are inserted using the
insert_constraint
method ofCGAL::Constrained_Delaunay_triangulation_2
, which ensures that the specified edges appear in the triangulation. -
Triangulation: Once the constraints are in place, the CDT algorithm generates the triangulated mesh, which is then used for further processing or export.
-
Post-processing: After triangulation, additional steps such as merging duplicate points and restoring the original heights (z-values) of vertices are performed to refine the mesh.
The following key features and types from the CGAL library are used:
-
Traits: Defines the geometric properties and operations needed for the triangulation.
-
Tds: The Triangulation Data Structure, which organizes the vertices, edges, and faces of the triangulation.
-
Itag: Determines how the intersection of constraints is handled.
In summary, the triangulateAssembledMesh
function leverages CGAL's
Constrained_Delaunay_triangulation_2
to create a high-quality, triangulated
mesh that respects the original contour lines. This process is critical for
maintaining the accuracy of the terrain model while reducing the complexity of
the mesh.
References
-
[cemosis] Cemosis. Center for Modeling and Simulation in Strasbourg. 2024. (www.cemosis.fr)
-
[irma] IRMA. Institut de recherche mathématique avancée. 2024 (irma.math.unistra.fr)
-
[unistra] University of Strasbourg. 2024. (en.unistra.fr)
-
[numpex] PEPR Numpex. Priority Research Program and Equipment for Numerical Exascale computing. 2024. (numpex.org/numpex-program)
-
[exama] Exa-MA. Methods and Algorithms for Exascale. 2024. (numpex.org/exama-methods-and-algorithms-for-exascale)
-
[ktirio] Ktirio Urban Building application. Prud’homme Christophe. Expanding horizons: Ktirio and the urban building vision in Hidalgo2. October 2023. 2024. (github.com/orgs/feelpp/discussions/2167)
-
[hidalgo2] CoE Hidalgo2. HPC and big data technologies for global challenges. 2024. (www.hidalgo2.eu/about)
-
[ubm] CoE Hidalgo2. The Urban Building Model 2024. (www.hidalgo2.eu/urban-building-model)
-
[inria] Inria. National Institute for Research in Digital Science and Technology. 2024. (www.inria.fr/en)
-
[eea1] European Environment Agency. Greenhouse gas emissions from energy use in buildings in Europe. Octber 2023. 2024. (www.eea.europa.eu/en/analysis/indicators/greenhouse-gas-emissions-from-energy?activeAccordion=546a7c35-9188-4d23-94ee-005d97c26f2b)
-
[eea2] European Environment Agency. Accelerating the energy efficiency renovation of residential buildings — a behavioural approach. June 2023. 2024. (www.eea.europa.eu/publications/accelerating-the-energy-efficiency)
-
[ec1] European Commission. 2050 long-term strategy. 2024. (climate.ec.europa.eu/eu-action/climate-strategies-targets/2050-long-term-strategy_en#:~:text=Striving%20to%20become%20the%20world’s%20first%20climate%2Dneutral%20continent%20by%202050.&text=The%20EU%20aims%20to%20be,to%20the%20European%20Climate%20Law%20.)
-
[ec2] European Commission. The European Green Deal. 2024. (commission.europa.eu/strategy-and-policy/priorities-2019-2024/european-green-deal_en)
-
[ec3] European Commission. European Climate Law. 2024. (climate.ec.europa.eu/eu-action/european-climate-law_en)
-
[ubp] Urban Building Pilot. Prud’homme Christophe. CoE Hidalgo2 Urban Building Pilot at NumPEx workshop on Discretization@Exascale. November 2023. 2024. (github.com/orgs/feelpp/discussions/2188)
-
[eurohpc] EuroHPC JU. The European High Performance Computing Joint Undertaking. 2024. (eurohpc-ju.europa.eu/index_en)
-
[mapbox] Wikipedia contributors. Mapbox. Wikipedia, The Free Encyclopedia. August 2024. 2024. (en.wikipedia.org/wiki/Mapbox)
-
[mapbox-terrain-rgb] Mapbox. Mapbox Terrain-RGB v1. Mapbox Documentation. 2024. (docs.mapbox.com/data/tilesets/reference/mapbox-terrain-rgb-v1)
-
[mapbox-raster-tiles] Mapbox. Mapbox Raster Tiles API. Mapbox Documentation. 2024. (docs.mapbox.com/api/maps/raster-tiles)
-
[json-nlohmann] Lohmann, Niels. JSON for Modern C++. 2024. (json.nlohmann.me)
-
[curl] Stenberg, Daniel. cURL: A Command Line Tool and Library for Transferring Data with URLs. 2024. (curl.se)
-
[libpng] libpng: The Official PNG Reference Library. 2024. (www.libpng.org/pub/png/libpng.html)
-
[cgal] CGAL: The Computational Geometry Algorithms Library. 2024. (www.cgal.org)
-
[stl] STL (STereoLithography) File Format Specification. 2024. (www.fabbers.com/tech/STL_Format)
-
[gmsh] Geuzaine Christophe, and Jean-François Remacle. Gmsh: A 3D Finite Element Mesh Generator with Built-in Pre- and Post-Processing Facilities. Version 4.10, 2024. (gmsh.info)
-
[msh] MSH: The Gmsh Mesh File Format. 2024. (gmsh.info/doc/texinfo/gmsh.html#MSH-file-format)
-
[img:lat-lon] Latitude and Longitude. BBC Bitesize. 2024. (www.bbc.co.uk/bitesize/guides/ztqtyrd/revision/1)
-
[world-geodetic-system] Wikipedia contributors. World Geodetic System. Wikipedia, The Free Encyclopedia. 2024. (en.wikipedia.org/wiki/World_Geodetic_System)
-
[marcator-projection] Wikipedia contributors. Mercator projection. Wikipedia, The Free Encyclopedia. 2024. (en.wikipedia.org/wiki/Mercator_projection)
-
[web-marcator-projection] Wikipedia contributors. Web Mercator projection. Wikipedia, The Free Encyclopedia. 2024. (en.wikipedia.org/wiki/Web_Mercator_projection)
-
[cdt1] Wikipedia contributors. Constrained Delaunay triangulation. Wikipedia, The Free Encyclopedia. 2024. (en.wikipedia.org/wiki/Constrained_Delaunay_triangulation)
-
[cdt2] L. Paul Chew. Constrained Delaunay Triangulations. Dartmouth College. 1987. 2024. (www.cs.jhu.edu/~misha/Spring16/Chew87.pdf)
-
[dt] Wikipedia contributors. Delaunay triangulation. Wikipedia, The Free Encyclopedia. 2024. (en.wikipedia.org/wiki/Voronoi_diagram)
-
[voronoi] Wikipedia contributors. Voronoi diagram. Wikipedia, The Free Encyclopedia. 2024. ()
-
[tiled-web-map] Wikipedia contributors. Tiled web map. Wikipedia, The Free Encyclopedia. 2024. (en.wikipedia.org/wiki/Tiled_web_map)
-
[img:tiles-coordinates] XYZ Tiles coordinate numbers. Wikipedia, The Free Encyclopedia. 2024. (en.wikipedia.org/wiki/File:XYZ_Tiles.png)
-
[img:tiled-web-map] Tiled Web Map. Wikipedia, The Free Encyclopedia. 2024. (en.wikipedia.org/wiki/Tiled_web_map#/media/File:Tiled_web_map_Stevage.png)
-
[img:dt] Delaunay triangulation. Wikipedia, The Free Encyclopedia. 2024. (en.wikipedia.org/wiki/Delaunay_triangulation#/media/File:Delaunay_circumcircles_vectorial.svg)
-
[img:dt-centers] Delaunay triangulation with all the circumcircles and their centers. Wikipedia, The Free Encyclopedia. 2024. (en.wikipedia.org/wiki/Delaunay_triangulation#/media/File:Delaunay_circumcircles_centers.svg)
-
[img:dt-voronoi] Delaunay triangulation and its Voronoi diagram. Wikipedia, The Free Encyclopedia. 2024. (en.wikipedia.org/wiki/Delaunay_triangulation#/media/File:Delaunay_Voronoi.svg)
-
[img:constrained-mesh] Pierre Alliez, Senior Researcher and Team Leader at Inria, Image provided during personal communication. 2024.
-
[img:constrained-refined-mesh] Pierre Alliez, Senior Researcher and Team Leader at Inria, Image provided during personal communication. 2024.