Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
2224f9a
display stats about Steiner point types
lrineau Mar 23, 2026
1a76816
rewrite of CGAL::CDT_3::Debug_options::Flags
lrineau Mar 24, 2026
ece4e56
cosmetic changes for cdt_3_from_off.cpp
lrineau Mar 25, 2026
1f5f69c
improve CGAL/IO/IO.h: add Output_rep for tuple-like types
lrineau Mar 27, 2026
38876a3
WIP
lrineau Mar 27, 2026
2f0a8ed
WIP: improve dump_link_mesh_of_vertex_to_ply
lrineau Mar 27, 2026
013cb1f
WIP: deal with infinite cells
lrineau Mar 30, 2026
38936b0
modernize T_2::fill_hole_delaunay
lrineau Apr 3, 2026
4086491
WIP: call to PMP::kernel works well
lrineau Apr 3, 2026
d532f83
fill_hole_delaunay is now a free function
lrineau Apr 7, 2026
b4cb348
WIP remove_Steiner_vertex_from_all_cdt_2
lrineau Apr 7, 2026
b023ee3
fill_hole_delaunay must return the output iterator
lrineau Apr 7, 2026
db7c11c
factorize to remove copy-pasting
lrineau Apr 7, 2026
ec10ca1
remove a warning
lrineau Apr 8, 2026
6bbe13d
refactoring: extract a function
lrineau Apr 8, 2026
8d2c317
simplify the use of make_indenting_guards
lrineau Apr 10, 2026
c586431
move the code to cdt_impl
lrineau Apr 10, 2026
4a774bf
add command line line option --move-Steiner-vertices-to-the-volume
lrineau Apr 10, 2026
4e61dfb
restore documentation of `is_valid()`
lrineau Apr 10, 2026
e538997
use the simplified API of make_indenting_guards()
lrineau Apr 10, 2026
3524bb1
use the right guard, and display timings for move_Steiner_vertices_to…
lrineau Apr 10, 2026
09a61d1
remove a O(n) assertion
lrineau Apr 10, 2026
e50d025
Merge branch 'CDT_3-fix_minor-bugs-lrineau' into CDT_3-Steiner_points…
lrineau Apr 13, 2026
ce66857
move_Steiner_vertices_to_the_volume=true by default
lrineau Apr 13, 2026
e8b2b7a
WIP: refactoring
lrineau Apr 13, 2026
397881c
Merge remote-tracking branch 'cgal/main' into CDT_3-Steiner_points_on…
lrineau Apr 13, 2026
b727ca0
WIP: refactoring
lrineau Apr 13, 2026
cbc9941
WIP: refactoring
lrineau Apr 13, 2026
5113305
new debug flag and command line option
lrineau Apr 13, 2026
8e96a4d
Merge branch 'CDT_3-fix_bugs_6.2.x-lrineau' into CDT_3-Steiner_points…
lrineau Apr 15, 2026
0540374
a bit of refactoring
lrineau Apr 15, 2026
22ca76a
fix create_output_finalizer so that --bisect works as intended
lrineau May 6, 2026
8497119
rename a variable
lrineau May 6, 2026
53a3311
cosmetic
lrineau May 6, 2026
ab79c4d
remove a comment with a false assertion
lrineau May 6, 2026
5658c9f
fix Output_rep of tuple-like
lrineau May 6, 2026
6a2f0b5
factor pieces of code
lrineau May 6, 2026
f86a0b9
avoid a class of names using an enum class
lrineau May 6, 2026
e60441b
turn display_vert into a ostream manipulator
lrineau May 6, 2026
4b9a74b
new type type for CDT: Steiner point in the volume
lrineau May 6, 2026
34f5af9
new constant INVALID_FACE_INDEX instead of -1
lrineau May 6, 2026
c4d2e10
info().is_outside_the_face is now an enum instead of an int
lrineau May 6, 2026
a524218
refactor with convenience functions
lrineau May 6, 2026
6b465ae
replace -1 by a named constant
lrineau May 6, 2026
3e26356
bug fix
lrineau May 6, 2026
9065c9d
add function is_2d_face_also_a_3d_facet
lrineau May 6, 2026
e0a4cea
fix the display of timeings in `ms`
lrineau May 6, 2026
f31d8ba
add an extended bbox
lrineau May 6, 2026
e6eb201
cosmetic changes
lrineau May 6, 2026
45559bb
WIP: moving Steiner vertices seems to work now
lrineau May 6, 2026
451beba
rework the parsing of command line options
lrineau May 6, 2026
e0b455e
Merge remote-tracking branch 'cgal/main' into CDT_3-Steiner_points_on…
lrineau May 6, 2026
2f7d64a
remove one trailing space
lrineau May 7, 2026
a1ce2c5
Merge branch 'CDT_3-fix-lrineau' into CDT_3-Steiner_points_only_in_vo…
lrineau May 7, 2026
f8986fd
modify the debug output
lrineau May 11, 2026
c07f9b4
bug fix
lrineau May 11, 2026
b53a704
add bug test cases and ctest
lrineau May 11, 2026
78c510b
Basic_indenting_stream_guard: do nothing if the string is empty
lrineau May 12, 2026
30faf58
WIP: fix the sub-stars (with a retriangulation)
lrineau May 12, 2026
21e5ebf
the component can no longer be open
lrineau May 13, 2026
eddd278
debug: dump component meshes
lrineau May 13, 2026
df838f9
fix debug messages
lrineau May 26, 2026
428fb56
fix dependencies
lrineau May 26, 2026
d8c633d
use Tds namespace
janetournois Jun 9, 2026
eed33bb
use everywhere functions of the C3T3 instead of functions of the Vb/Cb
janetournois Jun 9, 2026
9fa7271
add everything to use CDT3 as a C3T3 in the context of removing volum…
janetournois Jun 9, 2026
97426ad
add macro to allow negative volume in input
janetournois Jun 9, 2026
3ea0034
add undocumented tetrahedral remeshing of a CCDT
janetournois Jun 9, 2026
62ebf4f
fix can_be_collapsed(edge)
janetournois Jun 15, 2026
5586860
make surface_patch_index(v) return a std::optional<Surface_patch_index>
janetournois Jun 15, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,10 @@ namespace CGAL {
namespace CDT_3 {

struct Debug_options {
enum class Flags {
enum class Flag;
bool get(Flag f) const { return flags[static_cast<int>(f)]; }
auto get(Flag f) { return flags[static_cast<int>(f)]; }
enum class Flag {
Steiner_points = 0,
Steiner_points_construction,
conforming,
Expand All @@ -91,71 +94,77 @@ struct Debug_options {
debug_geometric_errors,
debug_polygon_insertion,
debug_restore_faces,
debug_move_Steiner_vertices,
display_statistics,
use_epeck_for_normals,
use_epeck_for_Steiner_points,
nb_of_flags
};
bool Steiner_points_construction() const { return flags[static_cast<int>(Flags::Steiner_points_construction)]; }
void Steiner_points_construction(bool b) { flags.set(static_cast<int>(Flags::Steiner_points_construction), b); }

bool Steiner_points() const { return flags[static_cast<int>(Flags::Steiner_points)]; }
void Steiner_points(bool b) { flags.set(static_cast<int>(Flags::Steiner_points), b); }
using Flags = std::bitset<static_cast<int>(Flag::nb_of_flags)>;

bool input_faces() const { return flags[static_cast<int>(Flags::input_faces)]; }
void input_faces(bool b) { flags.set(static_cast<int>(Flags::input_faces), b); }
bool Steiner_points_construction() const { return get(Flag::Steiner_points_construction); }
void Steiner_points_construction(bool b) { get(Flag::Steiner_points_construction) = b; }

bool missing_region() const { return flags[static_cast<int>(Flags::missing_region)]; }
void missing_region(bool b) { flags.set(static_cast<int>(Flags::missing_region), b); }
bool Steiner_points() const { return get(Flag::Steiner_points); }
void Steiner_points(bool b) { get(Flag::Steiner_points) = b; }

bool regions() const { return flags[static_cast<int>(Flags::regions)]; }
void regions(bool b) { flags.set(static_cast<int>(Flags::regions), b); }
bool input_faces() const { return get(Flag::input_faces); }
void input_faces(bool b) { get(Flag::input_faces) = b; }

bool copy_triangulation_into_hole() const { return flags[static_cast<int>(Flags::copy_triangulation_into_hole)]; }
void copy_triangulation_into_hole(bool b) { flags.set(static_cast<int>(Flags::copy_triangulation_into_hole), b); }
bool missing_region() const { return get(Flag::missing_region); }
void missing_region(bool b) { get(Flag::missing_region) = b; }

bool validity() const { return flags[static_cast<int>(Flags::validity)]; }
void validity(bool b) { flags.set(static_cast<int>(Flags::validity), b); }
bool regions() const { return get(Flag::regions); }
void regions(bool b) { get(Flag::regions) = b; }

bool copy_triangulation_into_hole() const { return get(Flag::copy_triangulation_into_hole); }
void copy_triangulation_into_hole(bool b) { get(Flag::copy_triangulation_into_hole) = b; }

bool finite_edges_map() const { return flags[static_cast<int>(Flags::debug_finite_edges_map)]; }
void finite_edges_map(bool b) { flags.set(static_cast<int>(Flags::debug_finite_edges_map), b); }
bool validity() const { return get(Flag::validity); }
void validity(bool b) { get(Flag::validity) = b; }

bool subconstraints_to_conform() const { return flags[static_cast<int>(Flags::debug_subconstraints_to_conform)]; }
void subconstraints_to_conform(bool b) { flags.set(static_cast<int>(Flags::debug_subconstraints_to_conform), b); }
bool finite_edges_map() const { return get(Flag::debug_finite_edges_map); }
void finite_edges_map(bool b) { get(Flag::debug_finite_edges_map) = b; }

bool use_finite_edges_map_flag() const { return flags[static_cast<int>(Flags::use_finite_edges_map)]; }
void use_finite_edges_map(bool b) { flags.set(static_cast<int>(Flags::use_finite_edges_map), b); }
bool subconstraints_to_conform() const { return get(Flag::debug_subconstraints_to_conform); }
void subconstraints_to_conform(bool b) { get(Flag::debug_subconstraints_to_conform) = b; }

bool verbose_special_cases() const { return flags[static_cast<int>(Flags::verbose_special_cases)]; }
void verbose_special_cases(bool b) { flags.set(static_cast<int>(Flags::verbose_special_cases), b); }
bool use_finite_edges_map_flag() const { return get(Flag::use_finite_edges_map); }
void use_finite_edges_map(bool b) { get(Flag::use_finite_edges_map) = b; }

bool encroaching_vertices() const { return flags[static_cast<int>(Flags::debug_encroaching_vertices)]; }
void encroaching_vertices(bool b) { flags.set(static_cast<int>(Flags::debug_encroaching_vertices), b); }
bool verbose_special_cases() const { return get(Flag::verbose_special_cases); }
void verbose_special_cases(bool b) { get(Flag::verbose_special_cases) = b; }

bool conforming_validation() const { return flags[static_cast<int>(Flags::debug_conforming_validation)]; }
void conforming_validation(bool b) { flags.set(static_cast<int>(Flags::debug_conforming_validation), b); }
bool encroaching_vertices() const { return get(Flag::debug_encroaching_vertices); }
void encroaching_vertices(bool b) { get(Flag::debug_encroaching_vertices) = b; }

bool constraint_hierarchy() const { return flags[static_cast<int>(Flags::debug_constraint_hierarchy)]; }
void constraint_hierarchy(bool b) { flags.set(static_cast<int>(Flags::debug_constraint_hierarchy), b); }
bool conforming_validation() const { return get(Flag::debug_conforming_validation); }
void conforming_validation(bool b) { get(Flag::debug_conforming_validation) = b; }

bool geometric_errors() const { return flags[static_cast<int>(Flags::debug_geometric_errors)]; }
void geometric_errors(bool b) { flags.set(static_cast<int>(Flags::debug_geometric_errors), b); }
bool constraint_hierarchy() const { return get(Flag::debug_constraint_hierarchy); }
void constraint_hierarchy(bool b) { get(Flag::debug_constraint_hierarchy) = b; }

bool polygon_insertion() const { return flags[static_cast<int>(Flags::debug_polygon_insertion)]; }
void polygon_insertion(bool b) { flags.set(static_cast<int>(Flags::debug_polygon_insertion), b); }
bool geometric_errors() const { return get(Flag::debug_geometric_errors); }
void geometric_errors(bool b) { get(Flag::debug_geometric_errors) = b; }

bool restore_faces() const { return flags[static_cast<int>(Flags::debug_restore_faces)]; }
void restore_faces(bool b) { flags.set(static_cast<int>(Flags::debug_restore_faces), b); }
bool polygon_insertion() const { return get(Flag::debug_polygon_insertion); }
void polygon_insertion(bool b) { get(Flag::debug_polygon_insertion) = b; }

bool display_statistics() const { return flags[static_cast<int>(Flags::display_statistics)]; }
void display_statistics(bool b) { flags.set(static_cast<int>(Flags::display_statistics), b); }
bool restore_faces() const { return get(Flag::debug_restore_faces); }
void restore_faces(bool b) { get(Flag::debug_restore_faces) = b; }

bool use_epeck_for_normals() const { return flags[static_cast<int>(Flags::use_epeck_for_normals)]; }
void use_epeck_for_normals(bool b) { flags.set(static_cast<int>(Flags::use_epeck_for_normals), b); }
bool move_Steiner_vertices() const { return get(Flag::debug_move_Steiner_vertices); }
void move_Steiner_vertices(bool b) { get(Flag::debug_move_Steiner_vertices) = b; }

bool use_epeck_for_Steiner_points() const { return flags[static_cast<int>(Flags::use_epeck_for_Steiner_points)]; }
void use_epeck_for_Steiner_points(bool b) { flags.set(static_cast<int>(Flags::use_epeck_for_Steiner_points), b); }
bool display_statistics() const { return get(Flag::display_statistics); }
void display_statistics(bool b) { get(Flag::display_statistics) = b; }

bool use_epeck_for_normals() const { return get(Flag::use_epeck_for_normals); }
void use_epeck_for_normals(bool b) { get(Flag::use_epeck_for_normals) = b; }

bool use_epeck_for_Steiner_points() const { return get(Flag::use_epeck_for_Steiner_points); }
void use_epeck_for_Steiner_points(bool b) { get(Flag::use_epeck_for_Steiner_points) = b; }

double segment_vertex_epsilon() const { return segment_vertex_epsilon_; }
void set_segment_vertex_epsilon(double eps) { segment_vertex_epsilon_ = eps; }
Expand All @@ -164,7 +173,7 @@ struct Debug_options {
void set_vertex_vertex_epsilon(double eps) { vertex_vertex_epsilon_ = eps; }

private:
std::bitset<static_cast<int>(Flags::nb_of_flags)> flags{};
Flags flags{};
double segment_vertex_epsilon_ = 0.0;
double vertex_vertex_epsilon_ = 0.0;
}; // end struct Debug_options
Expand All @@ -173,32 +182,34 @@ namespace internal {

inline auto& tasks_manager() {
struct Tasks_manager {
enum {
enum class Tm {
READ_INPUT = 0,
MERGE_FACETS,
INSERT_VERTICES,
COMPUTE_DISTANCES,
CONFORMING,
CDT,
MOVE_STEINER_VERTICES,
OUTPUT,
VALIDATION,
NB_TASKS
};

#if CGAL_USE_ITT
__itt_domain* cdt_3_domain = __itt_domain_create("org.cgal.CDT_3");
const std::array<__itt_string_handle*, NB_TASKS> task_handles = {
const std::array<__itt_string_handle*, static_cast<std::size_t>(Tm::NB_TASKS)> task_handles = {
__itt_string_handle_create("CDT_3: read input file"),
__itt_string_handle_create("CDT_3: merge facets"),
__itt_string_handle_create("CDT_3: insert vertices"),
__itt_string_handle_create("CDT_3: compute distances"),
__itt_string_handle_create("CDT_3: conforming"),
__itt_string_handle_create("CDT_3: cdt"),
__itt_string_handle_create("CDT_3: move Steiner vertices"),
__itt_string_handle_create("CDT_3: outputs"),
__itt_string_handle_create("CDT_3: validation")
};
#endif
std::array<CGAL::Real_timer, NB_TASKS> timers{};
std::array<CGAL::Real_timer, static_cast<std::size_t>(Tm::NB_TASKS)> timers{};
struct Scope_guard {
Tasks_manager *instance = nullptr;
int task_id;
Expand All @@ -222,18 +233,19 @@ inline auto& tasks_manager() {
}
};

Scope_guard make_task_scope_guard(int task_id) {
return Scope_guard(this, task_id);
Scope_guard make_task_scope_guard(Tm task_id) {
return Scope_guard(this, static_cast<int>(task_id));
}

Scope_guard READ_INPUT_TASK_guard() { return make_task_scope_guard(READ_INPUT); }
Scope_guard MERGE_FACETS_TASK_guard() { return make_task_scope_guard(MERGE_FACETS); }
Scope_guard INSERT_VERTICES_TASK_guard() { return make_task_scope_guard(INSERT_VERTICES); }
Scope_guard COMPUTE_DISTANCES_TASK_guard() { return make_task_scope_guard(COMPUTE_DISTANCES); }
Scope_guard CONFORMING_TASK_guard() { return make_task_scope_guard(CONFORMING); }
Scope_guard CDT_TASK_guard() { return make_task_scope_guard(CDT); }
Scope_guard OUTPUT_TASK_guard() { return make_task_scope_guard(OUTPUT); }
Scope_guard VALIDATION_TASK_guard() { return make_task_scope_guard(VALIDATION); }
Scope_guard READ_INPUT_TASK_guard() { return make_task_scope_guard(Tm::READ_INPUT); }
Scope_guard MERGE_FACETS_TASK_guard() { return make_task_scope_guard(Tm::MERGE_FACETS); }
Scope_guard INSERT_VERTICES_TASK_guard() { return make_task_scope_guard(Tm::INSERT_VERTICES); }
Scope_guard COMPUTE_DISTANCES_TASK_guard() { return make_task_scope_guard(Tm::COMPUTE_DISTANCES); }
Scope_guard CONFORMING_TASK_guard() { return make_task_scope_guard(Tm::CONFORMING); }
Scope_guard CDT_TASK_guard() { return make_task_scope_guard(Tm::CDT); }
Scope_guard MOVE_STEINER_VERTICES_TASK_guard() { return make_task_scope_guard(Tm::MOVE_STEINER_VERTICES); }
Scope_guard OUTPUT_TASK_guard() { return make_task_scope_guard(Tm::OUTPUT); }
Scope_guard VALIDATION_TASK_guard() { return make_task_scope_guard(Tm::VALIDATION); }

}; // end struct Intel_OneAPI_ITT_API

Expand Down Expand Up @@ -273,6 +285,10 @@ inline auto CDT_3_OUTPUT_TASK_guard() {
return CDT_3::internal::tasks_manager().OUTPUT_TASK_guard();
}

inline auto CDT_3_MOVE_STEINER_VERTICES_TASK_guard() {
return CDT_3::internal::tasks_manager().MOVE_STEINER_VERTICES_TASK_guard();
}

inline auto CDT_3_VALIDATION_TASK_guard() {
return CDT_3::internal::tasks_manager().VALIDATION_TASK_guard();
}
Expand Down Expand Up @@ -318,10 +334,9 @@ class Conforming_Delaunay_triangulation_3 : public T_3 {
using Subconstraint = typename Constraint_hierarchy::Subconstraint;

auto display_vert(Vertex_handle v) const{
std::stringstream os;
os.precision(17);
os << IO::oformat(v, with_point);
return os.str();
return IO::oformat([&](std::ostream& os) -> auto& {
return os << IO::oformat(v, with_point);
}, IO_manip_tag{});
}

auto display_subcstr(Subconstraint subconstraint) const {
Expand Down Expand Up @@ -863,6 +878,7 @@ class Conforming_Delaunay_triangulation_3 : public T_3 {
return false;
}

public:
Constrained_polyline_id constraint_from_extremities(Vertex_handle va, Vertex_handle vb) const {
if(va->ccdt_3_data().number_of_incident_constraints() == 0 || vb->ccdt_3_data().number_of_incident_constraints() == 0)
{
Expand All @@ -882,15 +898,16 @@ class Conforming_Delaunay_triangulation_3 : public T_3 {
return c_id;
}

protected:
auto constraint_extremities(Constrained_polyline_id c_id) const {
CGAL_assertion(this->constraint_hierarchy.vertices_in_constraint_begin(c_id) !=
this->constraint_hierarchy.vertices_in_constraint_end(c_id));
CGAL_assertion(this->constraint_hierarchy.is_valid_constraint(c_id));
if(debug().constraint_hierarchy()) {
std::cerr << "constraint " << static_cast<void*>(c_id.vl_ptr()) << " has "
<< c_id.vl_ptr()->skip_size() << " vertices\n";
}
const auto begin = this->constraint_hierarchy.vertices_in_constraint_begin(c_id);
const auto end = this->constraint_hierarchy.vertices_in_constraint_end(c_id);
CGAL_assertion(begin != end);
const auto c_va = *begin;
const auto c_vb = *std::prev(end);
return std::make_pair(c_va, c_vb);
Expand Down
Loading
Loading