diff --git a/Constrained_triangulation_3/doc/Constrained_triangulation_3/PackageDescription.txt b/Constrained_triangulation_3/doc/Constrained_triangulation_3/PackageDescription.txt index cfb6f3cfb12..5ba751134e7 100644 --- a/Constrained_triangulation_3/doc/Constrained_triangulation_3/PackageDescription.txt +++ b/Constrained_triangulation_3/doc/Constrained_triangulation_3/PackageDescription.txt @@ -10,6 +10,9 @@ \defgroup PkgConstrainedTriangulation3Classes Classes and Class Templates \ingroup PkgConstrainedTriangulation3Ref +\defgroup PkgDrawCDT_3 Draw a 3D Constrained Triangulation +\ingroup PkgConstrainedTriangulation3Ref + \addtogroup PkgConstrainedTriangulation3Ref \cgalPkgDescriptionBegin{3D Constrained Triangulations,PkgConstrainedTriangulation3} \cgalPkgPicture{cdt3-small.png} @@ -56,4 +59,9 @@ a conforming constrained Delaunay triangulation in 3D, an instance of the class - `CGAL::Conforming_constrained_Delaunay_triangulation_3` - `CGAL::Conforming_constrained_Delaunay_triangulation_vertex_base_3` - `CGAL::Conforming_constrained_Delaunay_triangulation_cell_base_3` + +\cgalCRPSection{Draw a 3D Constrained Triangulation} + +- \link PkgDrawCDT_3 CGAL::draw() \endlink + */ diff --git a/Constrained_triangulation_3/examples/Constrained_triangulation_3/conforming_constrained_Delaunay_triangulation_3.cpp b/Constrained_triangulation_3/examples/Constrained_triangulation_3/conforming_constrained_Delaunay_triangulation_3.cpp index a427856938f..6c5bf5a7134 100644 --- a/Constrained_triangulation_3/examples/Constrained_triangulation_3/conforming_constrained_Delaunay_triangulation_3.cpp +++ b/Constrained_triangulation_3/examples/Constrained_triangulation_3/conforming_constrained_Delaunay_triangulation_3.cpp @@ -1,7 +1,7 @@ #include #include #include -#include +#include #include @@ -28,7 +28,7 @@ int main(int argc, char* argv[]) << "Number of constrained facets in the CDT: " << ccdt.number_of_constrained_facets() << '\n'; - CGAL::draw(ccdt.triangulation()); + CGAL::draw(ccdt); return EXIT_SUCCESS; -} +} \ No newline at end of file diff --git a/Constrained_triangulation_3/examples/Constrained_triangulation_3/conforming_constrained_Delaunay_triangulation_3_from_soup.cpp b/Constrained_triangulation_3/examples/Constrained_triangulation_3/conforming_constrained_Delaunay_triangulation_3_from_soup.cpp index b2682ef6a40..d80c46e837a 100644 --- a/Constrained_triangulation_3/examples/Constrained_triangulation_3/conforming_constrained_Delaunay_triangulation_3_from_soup.cpp +++ b/Constrained_triangulation_3/examples/Constrained_triangulation_3/conforming_constrained_Delaunay_triangulation_3_from_soup.cpp @@ -1,7 +1,7 @@ #include #include #include -#include +#include #include @@ -29,7 +29,7 @@ int main(int argc, char* argv[]) << "Number of constrained facets in the CDT: " << ccdt.number_of_constrained_facets() << '\n'; - CGAL::draw(ccdt.triangulation()); + CGAL::draw(ccdt); return EXIT_SUCCESS; } diff --git a/Constrained_triangulation_3/examples/Constrained_triangulation_3/conforming_constrained_Delaunay_triangulation_3_from_soup_fpmap.cpp b/Constrained_triangulation_3/examples/Constrained_triangulation_3/conforming_constrained_Delaunay_triangulation_3_from_soup_fpmap.cpp index feefcdfcf60..833d1ddbabf 100644 --- a/Constrained_triangulation_3/examples/Constrained_triangulation_3/conforming_constrained_Delaunay_triangulation_3_from_soup_fpmap.cpp +++ b/Constrained_triangulation_3/examples/Constrained_triangulation_3/conforming_constrained_Delaunay_triangulation_3_from_soup_fpmap.cpp @@ -1,5 +1,5 @@ // Copy the content from the old file to the new file, but update all occurrences of 'fmap' in the filename and code to 'fpmap'. -#include +#include #include #include #include @@ -57,7 +57,8 @@ int main(int argc, char* argv[]) << "Number of constrained facets in the CDT: " << ccdt.number_of_constrained_facets() << '\n'; - CGAL::draw(ccdt.triangulation()); + + CGAL::draw(ccdt); return EXIT_SUCCESS; } diff --git a/Constrained_triangulation_3/include/CGAL/Conforming_constrained_Delaunay_triangulation_3.h b/Constrained_triangulation_3/include/CGAL/Conforming_constrained_Delaunay_triangulation_3.h index d112bc9065f..fcd8c457838 100644 --- a/Constrained_triangulation_3/include/CGAL/Conforming_constrained_Delaunay_triangulation_3.h +++ b/Constrained_triangulation_3/include/CGAL/Conforming_constrained_Delaunay_triangulation_3.h @@ -14,6 +14,8 @@ #include +#include + #include #include @@ -876,7 +878,7 @@ public: * This allows the use of all non-modifying functions of the base triangulation. * See the other overload for a way to move the triangulation out of this object and then modify it. */ - const Triangulation& triangulation() & { + const Triangulation& triangulation() const& { return cdt_impl; } diff --git a/Constrained_triangulation_3/include/CGAL/Conforming_constrained_Delaunay_triangulation_3_fwd.h b/Constrained_triangulation_3/include/CGAL/Conforming_constrained_Delaunay_triangulation_3_fwd.h new file mode 100644 index 00000000000..4c34cafbc33 --- /dev/null +++ b/Constrained_triangulation_3/include/CGAL/Conforming_constrained_Delaunay_triangulation_3_fwd.h @@ -0,0 +1,24 @@ +// Copyright (c) 2025 GeometryFactory Sarl (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Laurent Rineau + +#ifndef CGAL_CONFORMING_CONSTRAINED_DELAUNAY_TRIANGULATION_3_FWD_H +#define CGAL_CONFORMING_CONSTRAINED_DELAUNAY_TRIANGULATION_3_FWD_H + +#include + +namespace CGAL { + +template +class Conforming_constrained_Delaunay_triangulation_3; + +} // namespace CGAL + +#endif // CGAL_CONFORMING_CONSTRAINED_DELAUNAY_TRIANGULATION_3_FWD_H diff --git a/Constrained_triangulation_3/include/CGAL/draw_constrained_triangulation_3.h b/Constrained_triangulation_3/include/CGAL/draw_constrained_triangulation_3.h new file mode 100644 index 00000000000..b4c39a3fd24 --- /dev/null +++ b/Constrained_triangulation_3/include/CGAL/draw_constrained_triangulation_3.h @@ -0,0 +1,88 @@ +// Copyright (c) 2025 GeometryFactory SARL (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Laurent Rineau + +#ifndef CGAL_DRAW_CONSTRAINED_T3_H +#define CGAL_DRAW_CONSTRAINED_T3_H + +#include +#include +#include +#include +#include + +namespace CGAL { +#if defined(CGAL_USE_BASIC_VIEWER) || defined(DOXYGEN_RUNNING) + +/*! +\ingroup PkgDrawCDT_3 + +opens a new window and draws the constrained triangulation. + +A call to this function blocks the execution of the program until the drawing window is closed. This function requires `CGAL_Qt6`, and is only available if the macro `CGAL_USE_BASIC_VIEWER` is defined. +Linking with the cmake target `CGAL::CGAL_Basic_viewer` will link with `CGAL_Qt6` and add the definition `CGAL_USE_BASIC_VIEWER`. +*/ +template +void draw(const Conforming_constrained_Delaunay_triangulation_3& ccdt, + const char *title="Constrained 3D Triangulation Basic Viewer") +{ + using Tr = CGAL::cpp20::remove_cvref_t; + using Vertex_handle = typename Tr::Vertex_handle; + using Cell_handle = typename Tr::Cell_handle; + using Edge_descriptor = typename Tr::Finite_edges_iterator; + using Facet_descriptor = typename Tr::Finite_facets_iterator; + + using Face_index = CGAL::cpp20::remove_cvref_t< + decltype(std::declval()->surface_patch_index(0))>; + + Face_index nb_colors = 0; + std::for_each( + ccdt.constrained_facets_begin(), ccdt.constrained_facets_end(), + [&](const auto& f) { + auto [c, index] = f; + nb_colors = (std::max)(nb_colors, c->ccdt_3_data().face_constraint_index(index) + 1); + }); + std::vector colors(nb_colors); + std::generate(colors.begin(), colors.end(), []() { + return CGAL::get_random_color(CGAL::get_default_random()); + }); + CGAL::Graphics_scene_options options; + options.draw_face = [](const Tr&, Facet_descriptor f) { + auto [c, index] = *f; + return c->ccdt_3_data().is_facet_constrained(index); + }; + options.colored_face = [](const Tr&, Facet_descriptor f) { + return true; + }; + options.face_color = [&](const Tr&, Facet_descriptor f) { + auto [c, index] = *f; + return colors[c->ccdt_3_data().face_constraint_index(index)]; + }; + draw(ccdt.triangulation(), options, title); +} + +/*! +\ingroup PkgDrawCDT_3 + +A shortcut to \link PkgDrawTriangulation3 `CGAL::add_to_graphics_scene(ccdt.triangulation(), gs_options, title)` \endlink. +*/ +template +void draw(const Conforming_constrained_Delaunay_triangulation_3& ccdt, + const GSOptions& gs_options, + const char *title="Constrained 3D Triangulation Basic Viewer") +{ + draw(ccdt.triangulation(), gs_options, title); +} + +#endif // CGAL_USE_BASIC_VIEWER || DOXYGEN_RUNNING + +} // End namespace CGAL + +#endif // CGAL_DRAW_CONSTRAINED_T3_H