CGAL 6.2 - Boolean Operations on Meshes
Loading...
Searching...
No Matches
Boolean Operations

Functions to compute triangulated the union, difference, and intersection of meshes.

Enumerations

enum  CGAL::Polygon_mesh_processing::Corefinement::Boolean_operation_type {
  UNION = 0 , INTERSECTION =1 , TM1_MINUS_TM2 =2 , TM2_MINUS_TM1 =3 ,
  NONE
}
 Integer identifiers to refer to a particular Boolean operation in the function corefine_and_compute_boolean_operations().
 

Functions

template<class TriangleMesh , class NPIn1 = parameters::Default_named_parameters, class NPIn2 = parameters::Default_named_parameters, class NPOut0 = parameters::Default_named_parameters, class NPOut1 = parameters::Default_named_parameters, class NPOut2 = parameters::Default_named_parameters, class NPOut3 = parameters::Default_named_parameters>
std::array< bool, 4 > CGAL::Polygon_mesh_processing::corefine_and_compute_boolean_operations (TriangleMesh &tm1, TriangleMesh &tm2, const std::array< std::optional< TriangleMesh * >, 4 > &output, const NPIn1 &np1=parameters::default_values(), const NPIn2 &np2=parameters::default_values(), const std::tuple< NPOut0, NPOut1, NPOut2, NPOut3 > &nps_out=std::tuple< NPOut0, NPOut1, NPOut2, NPOut3 >())
 corefines tm1 and tm2 and for each triangle mesh tm_out passed as an optional in output different from std::nullopt, the triangulated surface mesh bounding the result of a particular Boolean operation between the volumes bounded by tm1 and tm2 will be put in the corresponding triangle mesh.
 
template<class TriangleMesh , class NamedParameters1 = parameters::Default_named_parameters, class NamedParameters2 = parameters::Default_named_parameters, class NamedParametersOut = parameters::Default_named_parameters>
bool CGAL::Polygon_mesh_processing::corefine_and_compute_union (TriangleMesh &tm1, TriangleMesh &tm2, TriangleMesh &tm_out, const NamedParameters1 &np1=parameters::default_values(), const NamedParameters2 &np2=parameters::default_values(), const NamedParametersOut &np_out=parameters::default_values())
 corefines tm1 and tm2 and puts in tm_out a triangulated surface mesh bounding the union of the volumes bounded by tm1 and tm2.
 
template<class TriangleMesh , class NamedParameters1 = parameters::Default_named_parameters, class NamedParameters2 = parameters::Default_named_parameters, class NamedParametersOut = parameters::Default_named_parameters>
bool CGAL::Polygon_mesh_processing::corefine_and_compute_intersection (TriangleMesh &tm1, TriangleMesh &tm2, TriangleMesh &tm_out, const NamedParameters1 &np1=parameters::default_values(), const NamedParameters2 &np2=parameters::default_values(), const NamedParametersOut &np_out=parameters::default_values())
 corefines tm1 and tm2 and puts in tm_out a triangulated surface mesh bounding the intersection of the volumes bounded by tm1 and tm2.
 
template<class TriangleMesh , class NamedParameters1 = parameters::Default_named_parameters, class NamedParameters2 = parameters::Default_named_parameters, class NamedParametersOut = parameters::Default_named_parameters>
bool CGAL::Polygon_mesh_processing::corefine_and_compute_difference (TriangleMesh &tm1, TriangleMesh &tm2, TriangleMesh &tm_out, const NamedParameters1 &np1=parameters::default_values(), const NamedParameters2 &np2=parameters::default_values(), const NamedParametersOut &np_out=parameters::default_values())
 corefines tm1 and tm2 and puts in tm_out a triangulated surface mesh bounding the volume bounded by tm1 minus the volume bounded by tm2.
 
template<class TriangleMesh , class NamedParameters1 = parameters::Default_named_parameters, class NamedParameters2 = parameters::Default_named_parameters>
void CGAL::Polygon_mesh_processing::corefine (TriangleMesh &tm1, TriangleMesh &tm2, const NamedParameters1 &np1=parameters::default_values(), const NamedParameters2 &np2=parameters::default_values())
 corefines tm1 and tm2.
 

Function Documentation

◆ corefine()

template<class TriangleMesh , class NamedParameters1 = parameters::Default_named_parameters, class NamedParameters2 = parameters::Default_named_parameters>
void CGAL::Polygon_mesh_processing::corefine ( TriangleMesh &  tm1,
TriangleMesh &  tm2,
const NamedParameters1 &  np1 = parameters::default_values(),
const NamedParameters2 &  np2 = parameters::default_values() 
)

#include </home/runner/work/cgal/cgal/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/corefinement.h>

corefines tm1 and tm2.

For each input triangulated surface mesh, if a constrained edge is provided, intersection edges will be marked as constrained. If an edge that was marked as constrained is split, its sub-edges will be marked as constrained as well.

Precondition
!CGAL::Polygon_mesh_processing::does_self_intersect(tm1)
!CGAL::Polygon_mesh_processing::does_self_intersect(tm2)
Template Parameters
TriangleMesha model of HalfedgeListGraph, FaceListGraph, and MutableFaceGraph
NamedParameters1a sequence of Named Parameters
NamedParameters2a sequence of Named Parameters
Parameters
tm1first input triangulated surface mesh
tm2second input triangulated surface mesh
np1an optional sequence of Named Parameters among the ones listed below
np2an optional sequence of Named Parameters among the ones listed below
Optional Named Parameters
  • a property map associating points to the vertices of tm1 (tm2)
  • Type: a class model of ReadablePropertyMap with boost::graph_traits<TriangleMesh>::vertex_descriptor as key type and Point_3 as value type
  • Default: boost::get(CGAL::vertex_point, tm1 (tm2))
  • Extra: If this parameter is omitted, an internal property map for CGAL::vertex_point_t must be available in TriangleMesh.

  • a property map containing the constrained-or-not status of each edge of tm1 (tm2)
  • Type: a class model of ReadablePropertyMap with boost::graph_traits<TriangleMesh>::edge_descriptor as key type and bool as value type
  • Default: a constant property map returning false for any edge

  • If true the set of triangles close to the intersection of tm1 and tm2 will be checked for self-intersections and Corefinement::Self_intersection_exception will be thrown if at least one self-intersection is found.
  • Type: Boolean
  • Default: false
  • Extra: np1 only
  • if true, the corresponding mesh will not be updated.
  • Type: Boolean
  • Default: false
  • Extra: If this parameter is set to true for both meshes nothing will be done. If this option is set to true for one mesh, the other mesh is no longer required to be without self-intersection.
Examples
Polygon_mesh_processing/corefinement_SM.cpp.

◆ corefine_and_compute_boolean_operations()

template<class TriangleMesh , class NPIn1 = parameters::Default_named_parameters, class NPIn2 = parameters::Default_named_parameters, class NPOut0 = parameters::Default_named_parameters, class NPOut1 = parameters::Default_named_parameters, class NPOut2 = parameters::Default_named_parameters, class NPOut3 = parameters::Default_named_parameters>
std::array< bool, 4 > CGAL::Polygon_mesh_processing::corefine_and_compute_boolean_operations ( TriangleMesh &  tm1,
TriangleMesh &  tm2,
const std::array< std::optional< TriangleMesh * >, 4 > &  output,
const NPIn1 &  np1 = parameters::default_values(),
const NPIn2 &  np2 = parameters::default_values(),
const std::tuple< NPOut0, NPOut1, NPOut2, NPOut3 > &  nps_out = std::tuple<NPOut0,NPOut1,NPOut2,NPOut3>() 
)

#include </home/runner/work/cgal/cgal/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/corefinement.h>

corefines tm1 and tm2 and for each triangle mesh tm_out passed as an optional in output different from std::nullopt, the triangulated surface mesh bounding the result of a particular Boolean operation between the volumes bounded by tm1 and tm2 will be put in the corresponding triangle mesh.

The positions of the meshes in the array output are specific to the Boolean operation to compute and Corefinement::Boolean_operation_type encodes and describes the ordering. Constructing the default array means that no Boolean operation will be done. Overwriting a default value will trigger the corresponding operation. In such a case, the address to a valid surface mesh must be provided. The optional named parameters for all output meshes are provided as a tuple and follow the same order as the array output. A call to corefine_and_compute_boolean_operations() with optional named parameters passed for output meshes should be done using make_tuple() as the types of named parameters are unspecified.

If tm1 and/or tm2 are part of the output surface meshes, they will be updated to contain the output (in-place operation), in any other case, the corresponding result will be inserted into the mesh without clearing it first.

Precondition
!CGAL::Polygon_mesh_processing::does_self_intersect(tm1)
!CGAL::Polygon_mesh_processing::does_self_intersect(tm2)
CGAL::Polygon_mesh_processing::does_bound_a_volume(tm1)
CGAL::Polygon_mesh_processing::does_bound_a_volume(tm2)
Template Parameters
TriangleMesha model of HalfedgeListGraph, FaceListGraph, and MutableFaceGraph
NPIn1a sequence of Named Parameters
NPIn2a sequence of Named Parameters
NPOut0a sequence of Named Parameters for computing the union of the volumes bounded by tm1 and tm2
NPOut1a sequence of Named Parameters for computing the intersection of the volumes bounded by tm1 and tm2
NPOut2a sequence of Named Parameters for computing the difference of the volumes bounded by tm1 and tm2
NPOut3a sequence of Named Parameters for computing the difference of the volumes bounded by tm2 and tm1
Parameters
tm1first input triangulated surface mesh
tm2second input triangulated surface mesh
outputan array of output surface meshes
np1an optional sequence of Named Parameters among the ones listed below
np2an optional sequence of Named Parameters among the ones listed below
Optional Named Parameters
  • a property map associating points to the vertices of tm1 (tm2)
  • Type: a class model of ReadablePropertyMap with boost::graph_traits<TriangleMesh>::vertex_descriptor as key type and Point_3 as value type
  • Default: boost::get(CGAL::vertex_point, tm1 (tm2))
  • Extra: If this parameter is omitted, an internal property map for CGAL::vertex_point_t must be available in TriangleMesh.

  • a property map containing the constrained-or-not status of each edge of tm1 (tm2)
  • Type: a class model of ReadablePropertyMap with boost::graph_traits<TriangleMesh>::edge_descriptor as key type and bool as value type
  • Default: a constant property map returning false for any edge

  • a property map associating to each face of tm1 (tm2) a unique index between 0 and num_faces(tm1) - 1 (num_faces(tm2) - 1)
  • Type: a class model of ReadablePropertyMap with boost::graph_traits<TriangleMesh>::face_descriptor as key type and std::size_t as value type
  • Default: an automatically indexed internal map
  • Extra: If the property map is writable, the indices of the faces of tm1 and tm2 will be set after the corefinement is done.

  • If true, the set of triangles close to the intersection of tm1 and tm2 will be checked for self-intersections and Corefinement::Self_intersection_exception will be thrown if at least one self-intersection is found.
  • Type: Boolean
  • Default: false
  • Extra: np1 only
Parameters
nps_outan optional tuple of sequences of Named Parameters each among the ones listed below (tm_out being used to refer to the output surface mesh in output corresponding to a given named parameter sequence)
Optional Named Parameters
  • a property map associating points to the vertices of tm_out
  • Type: a class model of ReadWritePropertyMap with boost::graph_traits<TriangleMesh>::vertex_descriptor as key type and Point_3 as value type
  • Default: boost::get(CGAL::vertex_point, tm_out)
  • Extra: If this parameter is omitted, an internal property map for CGAL::vertex_point_t must be available in TriangleMesh.

  • a property map containing the constrained-or-not status of each edge of tm_out. An edge of tm_out is constrained if it is on the intersection of tm1 and tm2, or if the edge corresponds to a constrained edge in tm1 or tm2.
  • Type: a class model of WritablePropertyMap with boost::graph_traits<TriangleMesh>::edge_descriptor as key type and bool as value type
Returns
an array filled as follows: for each operation computed, the position in the array will contain true iff the output surface mesh is manifold, and it is put in the surface mesh at the same position as in output. Note that if an output surface mesh also was an input mesh but the output operation was generating a non-manifold mesh, the surface mesh will only be corefined.
Examples
Polygon_mesh_processing/corefinement_mesh_union_and_intersection.cpp.

◆ corefine_and_compute_difference()

template<class TriangleMesh , class NamedParameters1 = parameters::Default_named_parameters, class NamedParameters2 = parameters::Default_named_parameters, class NamedParametersOut = parameters::Default_named_parameters>
bool CGAL::Polygon_mesh_processing::corefine_and_compute_difference ( TriangleMesh &  tm1,
TriangleMesh &  tm2,
TriangleMesh &  tm_out,
const NamedParameters1 &  np1 = parameters::default_values(),
const NamedParameters2 &  np2 = parameters::default_values(),
const NamedParametersOut &  np_out = parameters::default_values() 
)

#include </home/runner/work/cgal/cgal/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/corefinement.h>

corefines tm1 and tm2 and puts in tm_out a triangulated surface mesh bounding the volume bounded by tm1 minus the volume bounded by tm2.

If tm_out is one of the input surface meshes, it will be updated to contain the output (in-place operation), otherwise the result will be inserted into tm_out without clearing it first.

Precondition
!CGAL::Polygon_mesh_processing::does_self_intersect(tm1)
!CGAL::Polygon_mesh_processing::does_self_intersect(tm2)
CGAL::Polygon_mesh_processing::does_bound_a_volume(tm1)
CGAL::Polygon_mesh_processing::does_bound_a_volume(tm2)
Template Parameters
TriangleMesha model of HalfedgeListGraph, FaceListGraph, and MutableFaceGraph
NamedParameters1a sequence of Named Parameters
NamedParameters2a sequence of Named Parameters
NamedParametersOuta sequence of Named Parameters
Parameters
tm1first input triangulated surface mesh
tm2second input triangulated surface mesh
tm_outoutput surface mesh
np1an optional sequence of Named Parameters among the ones listed below
np2an optional sequence of Named Parameters among the ones listed below
Optional Named Parameters
  • a property map associating points to the vertices of tm1 (tm2)
  • Type: a class model of ReadablePropertyMap with boost::graph_traits<TriangleMesh>::vertex_descriptor as key type and Point_3 as value type
  • Default: boost::get(CGAL::vertex_point, tm1 (tm2))
  • Extra: If this parameter is omitted, an internal property map for CGAL::vertex_point_t must be available in TriangleMesh.

  • a property map containing the constrained-or-not status of each edge of tm1 (tm2)
  • Type: a class model of ReadablePropertyMap with boost::graph_traits<TriangleMesh>::edge_descriptor as key type and bool as value type
  • Default: a constant property map returning false for any edge

  • a property map associating to each face of tm1 (tm2) a unique index between 0 and num_faces(tm1) - 1 (num_faces(tm2) - 1)
  • Type: a class model of ReadablePropertyMap with boost::graph_traits<TriangleMesh>::face_descriptor as key type and std::size_t as value type
  • Default: an automatically indexed internal map
  • Extra: If the property map is writable, the indices of the faces of tm1 and tm2 will be set after the corefinement is done.

  • If true the set of triangles close to the intersection of tm1 and tm2 will be checked for self-intersections and Corefinement::Self_intersection_exception will be thrown if at least one self-intersection is found.
  • Type: Boolean
  • Default: false
  • Extra: np1 only
Parameters
np_outan optional sequence of Named Parameters among the ones listed below
Optional Named Parameters
  • a property map associating points to the vertices of tm_out
  • Type: a class model of ReadWritePropertyMap with boost::graph_traits<TriangleMesh>::vertex_descriptor as key type and Point_3 as value type
  • Default: boost::get(CGAL::vertex_point, tm_out)
  • Extra: If this parameter is omitted, an internal property map for CGAL::vertex_point_t must be available in TriangleMesh.

  • a property map containing the constrained-or-not status of each edge of tm_out. An edge of tm_out is constrained if it is on the intersection of tm1 and tm2, or if the edge corresponds to a constrained edge in tm1 or tm2.
  • Type: a class model of WritablePropertyMap with boost::graph_traits<TriangleMesh>::edge_descriptor as key type and bool as value type
Returns
true if the output surface mesh is manifold and is put into tm_out. If false is returned and if tm_out is one of the input surface meshes, then tm_out is only corefined.
Examples
Polygon_mesh_processing/corefinement_difference_remeshed.cpp.

◆ corefine_and_compute_intersection()

template<class TriangleMesh , class NamedParameters1 = parameters::Default_named_parameters, class NamedParameters2 = parameters::Default_named_parameters, class NamedParametersOut = parameters::Default_named_parameters>
bool CGAL::Polygon_mesh_processing::corefine_and_compute_intersection ( TriangleMesh &  tm1,
TriangleMesh &  tm2,
TriangleMesh &  tm_out,
const NamedParameters1 &  np1 = parameters::default_values(),
const NamedParameters2 &  np2 = parameters::default_values(),
const NamedParametersOut &  np_out = parameters::default_values() 
)

#include </home/runner/work/cgal/cgal/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/corefinement.h>

corefines tm1 and tm2 and puts in tm_out a triangulated surface mesh bounding the intersection of the volumes bounded by tm1 and tm2.

If tm_out is one of the input surface meshes, it will be updated to contain the output (in-place operation), otherwise the result will be inserted into tm_out without clearing it first.

Precondition
!CGAL::Polygon_mesh_processing::does_self_intersect(tm1)
!CGAL::Polygon_mesh_processing::does_self_intersect(tm2)
CGAL::Polygon_mesh_processing::does_bound_a_volume(tm1)
CGAL::Polygon_mesh_processing::does_bound_a_volume(tm2)
Template Parameters
TriangleMesha model of HalfedgeListGraph, FaceListGraph, and MutableFaceGraph
NamedParameters1a sequence of Named Parameters
NamedParameters2a sequence of Named Parameters
NamedParametersOuta sequence of Named Parameters
Parameters
tm1first input triangulated surface mesh
tm2second input triangulated surface mesh
tm_outoutput surface mesh
np1an optional sequence of Named Parameters among the ones listed below
np2an optional sequence of Named Parameters among the ones listed below
Optional Named Parameters
  • a property map associating points to the vertices of tm1 (tm2)
  • Type: a class model of ReadablePropertyMap with boost::graph_traits<TriangleMesh>::vertex_descriptor as key type and Point_3 as value type
  • Default: boost::get(CGAL::vertex_point, tm1 (tm2))
  • Extra: If this parameter is omitted, an internal property map for CGAL::vertex_point_t must be available in TriangleMesh.

  • a property map containing the constrained-or-not status of each edge of tm1 (tm2)
  • Type: a class model of ReadablePropertyMap with boost::graph_traits<TriangleMesh>::edge_descriptor as key type and bool as value type
  • Default: a constant property map returning false for any edge

  • a property map associating to each face of tm1 (tm2) a unique index between 0 and num_faces(tm1) - 1 (num_faces(tm2) - 1)
  • Type: a class model of ReadablePropertyMap with boost::graph_traits<TriangleMesh>::face_descriptor as key type and std::size_t as value type
  • Default: an automatically indexed internal map
  • Extra: If the property map is writable, the indices of the faces of tm1 and tm2 will be set after the corefinement is done.

  • If true the set of triangles close to the intersection of tm1 and tm2 will be checked for self-intersections and Corefinement::Self_intersection_exception will be thrown if at least one self-intersection is found.
  • Type: Boolean
  • Default: false
  • Extra: np1 only
Parameters
np_outan optional sequence of Named Parameters among the ones listed below
Optional Named Parameters
  • a property map associating points to the vertices of tm_out
  • Type: a class model of ReadWritePropertyMap with boost::graph_traits<TriangleMesh>::vertex_descriptor as key type and Point_3 as value type
  • Default: boost::get(CGAL::vertex_point, tm_out)
  • Extra: If this parameter is omitted, an internal property map for CGAL::vertex_point_t must be available in TriangleMesh.

  • a property map containing the constrained-or-not status of each edge of tm_out. An edge of tm_out is constrained if it is on the intersection of tm1 and tm2, or if the edge corresponds to a constrained edge in tm1 or tm2.
  • Type: a class model of WritablePropertyMap with boost::graph_traits<TriangleMesh>::edge_descriptor as key type and bool as value type
Returns
true if the output surface mesh is manifold and is put into tm_out. If false is returned and if tm_out is one of the input surface meshes, then tm_out is only corefined.
Examples
Polygon_mesh_processing/corefinement_consecutive_bool_op.cpp.

◆ corefine_and_compute_union()

template<class TriangleMesh , class NamedParameters1 = parameters::Default_named_parameters, class NamedParameters2 = parameters::Default_named_parameters, class NamedParametersOut = parameters::Default_named_parameters>
bool CGAL::Polygon_mesh_processing::corefine_and_compute_union ( TriangleMesh &  tm1,
TriangleMesh &  tm2,
TriangleMesh &  tm_out,
const NamedParameters1 &  np1 = parameters::default_values(),
const NamedParameters2 &  np2 = parameters::default_values(),
const NamedParametersOut &  np_out = parameters::default_values() 
)

#include </home/runner/work/cgal/cgal/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/corefinement.h>

corefines tm1 and tm2 and puts in tm_out a triangulated surface mesh bounding the union of the volumes bounded by tm1 and tm2.

If tm_out is one of the input surface meshes, it will be updated to contain the output (in-place operation), otherwise the result will be inserted into tm_out without clearing it first.

Precondition
!CGAL::Polygon_mesh_processing::does_self_intersect(tm1)
!CGAL::Polygon_mesh_processing::does_self_intersect(tm2)
CGAL::Polygon_mesh_processing::does_bound_a_volume(tm1)
CGAL::Polygon_mesh_processing::does_bound_a_volume(tm2)
Template Parameters
TriangleMesha model of HalfedgeListGraph, FaceListGraph, and MutableFaceGraph
NamedParameters1a sequence of Named Parameters
NamedParameters2a sequence of Named Parameters
NamedParametersOuta sequence of Named Parameters
Parameters
tm1first input triangulated surface mesh
tm2second input triangulated surface mesh
tm_outoutput surface mesh
np1an optional sequence of Named Parameters among the ones listed below
np2an optional sequence of Named Parameters among the ones listed below
Optional Named Parameters
  • a property map associating points to the vertices of tm1 (tm2)
  • Type: a class model of ReadablePropertyMap with boost::graph_traits<TriangleMesh>::vertex_descriptor as key type and Point_3 as value type
  • Default: boost::get(CGAL::vertex_point, tm1 (tm2))
  • Extra: If this parameter is omitted, an internal property map for CGAL::vertex_point_t must be available in TriangleMesh.

  • a property map containing the constrained-or-not status of each edge of tm1 (tm2)
  • Type: a class model of ReadablePropertyMap with boost::graph_traits<TriangleMesh>::edge_descriptor as key type and bool as value type
  • Default: a constant property map returning false for any edge

  • a property map associating to each face of tm1 (tm2) a unique index between 0 and num_faces(tm1) - 1 (num_faces(tm2) - 1)
  • Type: a class model of ReadablePropertyMap with boost::graph_traits<TriangleMesh>::face_descriptor as key type and std::size_t as value type
  • Default: an automatically indexed internal map
  • Extra: If the property map is writable, the indices of the faces of tm1 and tm2 will be set after the corefinement is done.

  • If true the set of triangles close to the intersection of tm1 and tm2 will be checked for self-intersections and Corefinement::Self_intersection_exception will be thrown if at least one self-intersection is found.
  • Type: Boolean
  • Default: false
  • Extra: np1 only
Parameters
np_outan optional sequence of Named Parameters among the ones listed below
Optional Named Parameters
  • a property map associating points to the vertices of tm_out
  • Type: a class model of ReadWritePropertyMap with boost::graph_traits<TriangleMesh>::vertex_descriptor as key type and Point_3 as value type
  • Default: boost::get(CGAL::vertex_point, tm_out)
  • Extra: If this parameter is omitted, an internal property map for CGAL::vertex_point_t must be available in TriangleMesh.

  • a property map containing the constrained-or-not status of each edge of tm_out. An edge of tm_out is constrained if it is on the intersection of tm1 and tm2, or if the edge corresponds to a constrained edge in tm1 or tm2.
  • Type: a class model of WritablePropertyMap with boost::graph_traits<TriangleMesh>::edge_descriptor as key type and bool as value type
Returns
true if the output surface mesh is manifold and is put into tm_out. If false is returned and if tm_out is one of the input surface meshes, then tm_out is only corefined.
Examples
Polygon_mesh_processing/corefinement_OM_union.cpp, Polygon_mesh_processing/corefinement_consecutive_bool_op.cpp, Polygon_mesh_processing/corefinement_mesh_union.cpp, and Polygon_mesh_processing/corefinement_mesh_union_progress.cpp.