CGAL 5.6.3 - Polygon Mesh Processing

Loading...
Searching...
No Matches
Classes | Enumerations | Functions
Corefinement and Boolean Operations
Polygon Mesh Processing Reference

##

Functions to corefine triangulated surface meshes and compute triangulated surface meshes of the union, difference and intersection of the bounded volumes.

## Classes
struct | CGAL::Polygon_mesh_processing::Corefinement::Default_visitor< TriangleMesh >
| Default new-face visitor model of `PMPCorefinementVisitor`. More...

## 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 NamedParameters1 = parameters::Default_named_parameters, class NamedParameters2 = parameters::Default_named_parameters>
bool | CGAL::Polygon_mesh_processing::clip (TriangleMesh &tm, TriangleMesh &clipper, const NamedParameters1 &np_tm=parameters::default_values(), const NamedParameters2 &np_c=parameters::default_values())
| clips `tm` by keeping the part that is inside the volume bounded by `clipper`.
template<class TriangleMesh , class NamedParameters = parameters::Default_named_parameters>
bool | CGAL::Polygon_mesh_processing::clip (TriangleMesh &tm, const Plane_3 &plane, const NamedParameters &np=parameters::default_values())
| clips `tm` by keeping the part that is on the negative side of `plane` (side opposite to its normal vector).
template<class TriangleMesh , class NamedParameters = parameters::Default_named_parameters>
bool | CGAL::Polygon_mesh_processing::clip (TriangleMesh &tm, const Iso_cuboid_3 &iso_cuboid, const NamedParameters &np=parameters::default_values())
| clips `tm` by keeping the part that is inside `iso_cuboid`.
template<class TriangleMesh , class NamedParameters1 = parameters::Default_named_parameters, class NamedParameters2 = parameters::Default_named_parameters>
void | CGAL::Polygon_mesh_processing::split (TriangleMesh &tm, TriangleMesh &splitter, const NamedParameters1 &np_tm=parameters::default_values(), const NamedParameters2 &np_s=parameters::default_values())
| corefines `tm` and `splitter` and duplicates edges in `tm` that are on the intersection with `splitter`.
template<class TriangleMesh , class NamedParameters = parameters::Default_named_parameters>
void | CGAL::Polygon_mesh_processing::split (TriangleMesh &tm, const Plane_3 &plane, const NamedParameters &np=parameters::default_values())
| adds intersection edges of `plane` and `tm` in `tm` and duplicates those edges.
template<class TriangleMesh , class NamedParameters = parameters::Default_named_parameters>
void | CGAL::Polygon_mesh_processing::split (TriangleMesh &tm, const Iso_cuboid_3 &iso_cuboid, const NamedParameters &np=parameters::default_values())
| adds intersection edges of `iso_cuboid` and `tm` in `tm` and duplicates those edges.
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< boost::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 `boost::none`, 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`.
template<class OutputIterator , class TriangleMesh , class NamedParameters1 = parameters::Default_named_parameters, class NamedParameters2 = parameters::Default_named_parameters>
OutputIterator | CGAL::Polygon_mesh_processing::surface_intersection (const TriangleMesh &tm1, const TriangleMesh &tm2, OutputIterator polyline_output, const NamedParameters1 &np1=parameters::default_values(), const NamedParameters2 &np2=parameters::default_values())
| computes the intersection of triangles of `tm1` and `tm2`.

## Function Documentation

## ◆ clip() [1/3]

template<class TriangleMesh , class NamedParameters = parameters::Default_named_parameters>

bool CGAL::Polygon_mesh_processing::clip | ( | TriangleMesh & | tm,
|  | const Iso_cuboid_3 & | iso_cuboid,
|  | const NamedParameters & | np = `parameters::default_values()`
| ) |  |

`#include <CGAL/Polygon_mesh_processing/clip.h>`

clips `tm` by keeping the part that is inside `iso_cuboid`.

If `tm` is closed, the clipped part can be closed too if the named parameter `clip_volume` is set to `true`. See Subsection Clipping for more details.

Note
  `Iso_cuboid_3` must be from the same Kernel as the point of the internal vertex point map of `TriangleMesh`.
  `Iso_cuboid_3` must be from the same Kernel as the point of the vertex point map of `tm`.

Precondition
  `!CGAL::Polygon_mesh_processing::does_self_intersect(tm)`

Template Parameters

  TriangleMesh | a model of `MutableFaceGraph`, `HalfedgeListGraph` and `FaceListGraph`. An internal property map for `CGAL::vertex_point_t` must be available.
  NamedParameters | a sequence of Named Parameters

Parameters

  tm | input triangulated surface mesh
  iso_cuboid | iso-cuboid used to clip `tm`.
  np | an optional sequence of Named Parameters among the ones listed below

Optional Named Parameters

  a visitor used to track the creation of new faces Type: a class model of `PMPCorefinementVisitor` Default: `Corefinement::Default_visitor<TriangleMesh>` |
  If `true`, the set of triangles closed to the intersection of `tm` and `iso_cuboid` will be checked for self-intersections and `CGAL::Polygon_mesh_processing::Corefinement::Self_intersection_exception` will be thrown if at least one self-intersection is found. Type: Boolean Default: `false` |
  If `true`, and `tm` is closed, the clipping will be done on the volume bounded by `tm` rather than on its surface (i.e., `tm` will be kept closed). Type: Boolean Default: `false` |
  if `false` the parts of `tm` coplanar with `iso_cuboid` will not be part of the output Type: Boolean Default: `true` |
  If `true`, self-intersections are accepted for `tm`. Type: Boolean Default: `false` Extra: If this option is set to `true`, `tm` is no longer required to be without self-intersection. Setting this option to `true` will automatically set `throw_on_self_intersection` to `false` and `clip_volume` to `false`. |

Returns
  `true` if the output surface mesh is manifold. If `false` is returned `tm` is only refined by the intersection with `iso_cuboid`.

See also
  `split()`

## ◆ clip() [2/3]

template<class TriangleMesh , class NamedParameters = parameters::Default_named_parameters>

bool CGAL::Polygon_mesh_processing::clip | ( | TriangleMesh & | tm,
|  | const Plane_3 & | plane,
|  | const NamedParameters & | np = `parameters::default_values()`
| ) |  |

`#include <CGAL/Polygon_mesh_processing/clip.h>`

clips `tm` by keeping the part that is on the negative side of `plane` (side opposite to its normal vector).

If `tm` is closed, the clipped part can be closed too if the named parameter `clip_volume` is set to `true`. See Subsection Clipping for more details.

Note
  `Plane_3` must be from the same Kernel as the point of the internal vertex point map of `TriangleMesh`.
  `Plane_3` must be from the same Kernel as the point of the vertex point map of `tm`.

Precondition
  `!CGAL::Polygon_mesh_processing::does_self_intersect(tm)`

Template Parameters

  TriangleMesh | a model of `MutableFaceGraph`, `HalfedgeListGraph` and `FaceListGraph`. An internal property map for `CGAL::vertex_point_t` must be available.
  NamedParameters | a sequence of Named Parameters

Parameters

  tm | input triangulated surface mesh
  plane | plane whose negative side defines the half-space to intersect `tm` with. `Plane_3` is the plane type for the same CGAL kernel as the point of the vertex point map of `tm`.
  np | an optional sequence of Named Parameters among the ones listed below

Optional Named Parameters

  a property map associating points to the vertices of `tm` 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)` |
  a visitor used to track the creation of new faces Type: a class model of `PMPCorefinementVisitor` Default: `Corefinement::Default_visitor<TriangleMesh>` |
  If `true`, the set of triangles closed to the intersection of `tm` and `plane` will be checked for self-intersections and `CGAL::Polygon_mesh_processing::Corefinement::Self_intersection_exception` will be thrown if at least one self-intersection is found. Type: Boolean Default: `false` |
  If `true`, and `tm` is closed, the clipping will be done on the volume bounded by `tm` rather than on its surface (i.e., `tm` will be kept closed). Type: Boolean Default: `false` |
  if `false` the parts of `tm` coplanar with `plane` will not be part of the output Type: Boolean Default: `true` |
  If `true`, self-intersections are accepted for `tm`. Type: Boolean Default: `false` Extra: If this option is set to `true`, `tm` is no longer required to be without self-intersection. Setting this option to `true` will automatically set `throw_on_self_intersection` to `false` and `clip_volume` to `false`. |

Returns
  `true` if the output surface mesh is manifold. If `false` is returned `tm` is only refined by the intersection with `plane`.

See also
  `split()`

## ◆ clip() [3/3]

template<class TriangleMesh , class NamedParameters1 = parameters::Default_named_parameters, class NamedParameters2 = parameters::Default_named_parameters>

bool CGAL::Polygon_mesh_processing::clip | ( | TriangleMesh & | tm,
|  | TriangleMesh & | clipper,
|  | const NamedParameters1 & | np_tm = `parameters::default_values()`,
|  | const NamedParameters2 & | np_c = `parameters::default_values()`
| ) |  |

`#include <CGAL/Polygon_mesh_processing/clip.h>`

clips `tm` by keeping the part that is inside the volume bounded by `clipper`.

If `tm` is closed, the clipped part can be closed too if the named parameter `clip_volume` is set to `true`. See Subsection Clipping for more details.

Attention
  With the current implementation, `clipper` will be modified (refined with the intersection with `tm`).

Precondition
  `!CGAL::Polygon_mesh_processing::does_self_intersect(tm)`
  `!CGAL::Polygon_mesh_processing::does_self_intersect(clipper)`
  `CGAL::Polygon_mesh_processing::does_bound_a_volume(clipper)`

Template Parameters

  TriangleMesh | a model of `MutableFaceGraph`, `HalfedgeListGraph` and `FaceListGraph`.
  NamedParameters1 | a sequence of Named Parameters
  NamedParameters2 | a sequence of Named Parameters

Parameters

  tm | input triangulated surface mesh
  clipper | triangulated surface mesh used to clip `tm`
  np_tm | an optional sequence of Named Parameters among the ones listed below
  np_c | an optional sequence of Named Parameters among the ones listed below

Optional Named Parameters

  a property map associating points to the vertices of `tm` (resp. `clipper`) 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 (resp. clipper))` Extra: If this parameter is omitted, an internal property map for `CGAL::vertex_point_t` must be available in `TriangleMesh`. |
  a property map associating to each face of `tm` (`clipper`) a unique index between `0` and `num_faces(tm (resp. clipper)) - 1` Type: a class model of `ReadWritePropertyMap` 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 `tm` and `clipper` will be set after refining `tm` with the intersection with `clipper` |
  a visitor used to track the creation of new faces Type: a class model of `PMPCorefinementVisitor` Default: `Corefinement::Default_visitor<TriangleMesh>` |
  If `true`, the set of triangles closed to the intersection of `tm` and `clipper` 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` |
  If `true`, and `tm` is closed, the clipping will be done on the volume bounded by `tm` rather than on its surface (i.e., `tm` will be kept closed). Type: Boolean Default: `false` |
  if `false`, the parts of `tm` coplanar with `clipper` will not be part of the output. Type: Boolean Default: `false` Extra: This option has an effect only if a surface and not a volume is clipped, (i.e., if `clip_volume` is `false` or if `tm` is open). |
  (`np_c` only) if `true`, `clipper` will not be modified. Type: Boolean Default: `false` Extra: If this option is set to `true`, `tm` is no longer required to be without self-intersection. Setting this option to `true` will automatically set `throw_on_self_intersection` to `false` and `clip_volume` to `false`. |

Returns
  `true` if the output surface mesh is manifold. If `false` is returned `tm` and `clipper` are only corefined.

See also
  `split()`

## ◆ 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 <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

  TriangleMesh | a model of `HalfedgeListGraph`, `FaceListGraph`, and `MutableFaceGraph`
  NamedParameters1 | a sequence of Named Parameters
  NamedParameters2 | a sequence of Named Parameters

Parameters

  tm1 | first input triangulated surface mesh
  tm2 | second input triangulated surface mesh
  np1 | an optional sequence of Named Parameters among the ones listed below
  np2 | an 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 visitor used to track the creation of new faces Type: a class model of `PMPCorefinementVisitor` Default: `Corefinement::Default_visitor<TriangleMesh>` Extra: `np1` only |
  If `true` the set of triangles closed 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. |

## ◆ 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< boost::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 <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 `boost::none`, 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

  TriangleMesh | a model of `HalfedgeListGraph`, `FaceListGraph`, and `MutableFaceGraph`
  NPIn1 | a sequence of Named Parameters
  NPIn2 | a sequence of Named Parameters
  NPOut0 | a sequence of Named Parameters for computing the union of the volumes bounded by `tm1` and `tm2`
  NPOut1 | a sequence of Named Parameters for computing the intersection of the volumes bounded by `tm1` and `tm2`
  NPOut2 | a sequence of Named Parameters for computing the difference of the volumes bounded by `tm1` and `tm2`
  NPOut3 | a sequence of Named Parameters for computing the difference of the volumes bounded by `tm2` and `tm1`

Parameters

  tm1 | first input triangulated surface mesh
  tm2 | second input triangulated surface mesh
  output | an array of output surface meshes
  np1 | an optional sequence of Named Parameters among the ones listed below
  np2 | an 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. |
  a visitor used to track the creation of new faces Type: a class model of `PMPCorefinementVisitor` Default: `Corefinement::Default_visitor<TriangleMesh>` Extra: `np1` only |
  If `true`, the set of triangles closed 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_out | an 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.

## ◆ 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 <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

  TriangleMesh | a model of `HalfedgeListGraph`, `FaceListGraph`, and `MutableFaceGraph`
  NamedParameters1 | a sequence of Named Parameters
  NamedParameters2 | a sequence of Named Parameters
  NamedParametersOut | a sequence of Named Parameters

Parameters

  tm1 | first input triangulated surface mesh
  tm2 | second input triangulated surface mesh
  tm_out | output surface mesh
  np1 | an optional sequence of Named Parameters among the ones listed below
  np2 | an 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. |
  a visitor used to track the creation of new faces Type: a class model of `PMPCorefinementVisitor` Default: `Corefinement::Default_visitor<TriangleMesh>` Extra: `np1` only |
  If `true` the set of triangles closed 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_out | an 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.

## ◆ 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 <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

  TriangleMesh | a model of `HalfedgeListGraph`, `FaceListGraph`, and `MutableFaceGraph`
  NamedParameters1 | a sequence of Named Parameters
  NamedParameters2 | a sequence of Named Parameters
  NamedParametersOut | a sequence of Named Parameters

Parameters

  tm1 | first input triangulated surface mesh
  tm2 | second input triangulated surface mesh
  tm_out | output surface mesh
  np1 | an optional sequence of Named Parameters among the ones listed below
  np2 | an 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. |
  a visitor used to track the creation of new faces Type: a class model of `PMPCorefinementVisitor` Default: `Corefinement::Default_visitor<TriangleMesh>` Extra: `np1` only |
  If `true` the set of triangles closed 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_out | an 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.

## ◆ 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 <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

  TriangleMesh | a model of `HalfedgeListGraph`, `FaceListGraph`, and `MutableFaceGraph`
  NamedParameters1 | a sequence of Named Parameters
  NamedParameters2 | a sequence of Named Parameters
  NamedParametersOut | a sequence of Named Parameters

Parameters

  tm1 | first input triangulated surface mesh
  tm2 | second input triangulated surface mesh
  tm_out | output surface mesh
  np1 | an optional sequence of Named Parameters among the ones listed below
  np2 | an 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. |
  a visitor used to track the creation of new faces Type: a class model of `PMPCorefinementVisitor` Default: `Corefinement::Default_visitor<TriangleMesh>` Extra: `np1` only |
  If `true` the set of triangles closed 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_out | an 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.

## ◆ split() [1/3]

template<class TriangleMesh , class NamedParameters = parameters::Default_named_parameters>

void CGAL::Polygon_mesh_processing::split | ( | TriangleMesh & | tm,
|  | const Iso_cuboid_3 & | iso_cuboid,
|  | const NamedParameters & | np = `parameters::default_values()`
| ) |  |

`#include <CGAL/Polygon_mesh_processing/clip.h>`

adds intersection edges of `iso_cuboid` and `tm` in `tm` and duplicates those edges.

Note
  `Iso_cuboid_3` must be from the same Kernel as the point of the internal vertex point map of `TriangleMesh`.
  `Iso_cuboid_3` must be from the same Kernel as the point of the vertex point map of `tm`.

Precondition
  `!CGAL::Polygon_mesh_processing::does_self_intersect(tm)`

Template Parameters

  TriangleMesh | a model of `MutableFaceGraph`, `HalfedgeListGraph`, and `FaceListGraph`. An internal property map for `CGAL::vertex_point_t` must be available.
  NamedParameters | a sequence of Named Parameters

Parameters

  tm | input triangulated surface mesh
  iso_cuboid | iso-cuboid used to split `tm`.
  np | an optional sequence of Named Parameters among the ones listed below

Optional Named Parameters

  a property map associating points to the vertices of `tm` 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)` |
  a visitor used to track the creation of new faces Type: a class model of `PMPCorefinementVisitor` Default: `Corefinement::Default_visitor<TriangleMesh>` |
  If `true`, the set of triangles closed to the intersection of `tm` and `iso_cuboid` will be checked for self-intersections and `CGAL::Polygon_mesh_processing::Corefinement::Self_intersection_exception` will be thrown if at least one self-intersection is found. Type: Boolean Default: `false` |
  If `true`, and `tm` is closed, the clipping will be done on the volume bounded by `tm` rather than on its surface (i.e., `tm` will be kept closed). Type: Boolean Default: `false` |
  if `false`, the parts of `tm` coplanar with `iso_cuboid` will not be part of the output. Type: Boolean Default: `true` |
  If `true`, self-intersections are accepted for `tm`. Type: Boolean Default: `false` Extra: If this option is set to `true`, `tm` is no longer required to be without self-intersection. Setting this option to `true` will automatically set `throw_on_self_intersection` to `false` and `clip_volume` to `false`. |

See also
  `clip()`

## ◆ split() [2/3]

template<class TriangleMesh , class NamedParameters = parameters::Default_named_parameters>

void CGAL::Polygon_mesh_processing::split | ( | TriangleMesh & | tm,
|  | const Plane_3 & | plane,
|  | const NamedParameters & | np = `parameters::default_values()`
| ) |  |

`#include <CGAL/Polygon_mesh_processing/clip.h>`

adds intersection edges of `plane` and `tm` in `tm` and duplicates those edges.

Note
  `Plane_3` must be from the same Kernel as the point of the internal vertex point map of `TriangleMesh`.
  `Plane_3` must be from the same Kernel as the point of the vertex point map of `tm`.

Precondition
  `!CGAL::Polygon_mesh_processing::does_self_intersect(tm)`

Template Parameters

  TriangleMesh | a model of `MutableFaceGraph`, `HalfedgeListGraph`, and `FaceListGraph`. An internal property map for `CGAL::vertex_point_t` must be available.
  NamedParameters | a sequence of Named Parameters

Parameters

  tm | input triangulated surface mesh
  plane | the plane that will be used to split `tm`. `Plane_3` is the plane type for the same CGAL kernel as the point of the vertex point map of `tm`.
  np | an optional sequence of Named Parameters among the ones listed below

Optional Named Parameters

  a property map associating points to the vertices of `tm` 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)` |
  a visitor used to track the creation of new faces Type: a class model of `PMPCorefinementVisitor` Default: `Corefinement::Default_visitor<TriangleMesh>` |
  If `true`, the set of triangles closed to the intersection of `tm` and `plane` will be checked for self-intersections and `CGAL::Polygon_mesh_processing::Corefinement::Self_intersection_exception` will be thrown if at least one self-intersection is found. Type: Boolean Default: `false` |
  If `true`, self-intersections are accepted for `tm`. Type: Boolean Default: `false` Extra: If this option is set to `true`, `tm` is no longer required to be without self-intersection. Setting this option to `true` will automatically set `throw_on_self_intersection` to `false`. |

See also
  `clip()`

## ◆ split() [3/3]

template<class TriangleMesh , class NamedParameters1 = parameters::Default_named_parameters, class NamedParameters2 = parameters::Default_named_parameters>

void CGAL::Polygon_mesh_processing::split | ( | TriangleMesh & | tm,
|  | TriangleMesh & | splitter,
|  | const NamedParameters1 & | np_tm = `parameters::default_values()`,
|  | const NamedParameters2 & | np_s = `parameters::default_values()`
| ) |  |

`#include <CGAL/Polygon_mesh_processing/clip.h>`

corefines `tm` and `splitter` and duplicates edges in `tm` that are on the intersection with `splitter`.

Precondition
  `!CGAL::Polygon_mesh_processing::does_self_intersect(tm)`
  `!CGAL::Polygon_mesh_processing::does_self_intersect(splitter)`

Template Parameters

  TriangleMesh | a model of `MutableFaceGraph`, `HalfedgeListGraph`, and `FaceListGraph`.
  NamedParameters1 | a sequence of Named Parameters
  NamedParameters2 | a sequence of Named Parameters

Parameters

  tm | input triangulated surface mesh
  splitter | triangulated surface mesh used to split `tm`
  np_tm | an optional sequence of Named Parameters among the ones listed below
  np_s | an optional sequence of Named Parameters among the ones listed below

Optional Named Parameters

  a property map associating points to the vertices of `tm` (`splitter`) 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)` Default: If this parameter is omitted, an internal property map for `CGAL::vertex_point_t` must be available in `TriangleMesh`. |
  (`np_tm` only) a visitor used to track a series of events such as the creation of new faces, edges... in both `tm` and `splitter`. Type: a class model of `PMPCorefinementVisitor` Default: `Corefinement::Default_visitor<TriangleMesh>` |
  If `true`, the set of triangles closed to the intersection of `tm` and `splitter` will be checked for self-intersections and `CGAL::Polygon_mesh_processing::Corefinement::Self_intersection_exception` will be thrown if at least one self-intersection is found. Type: Boolean Default: `false` |
  (`np_s` only) if `true`, `splitter` will not be modified. Type: Boolean Default: `false` Extra: If this option is set to `true`, `tm` is no longer required to be without self-intersection. Setting this option to `true` will automatically set `throw_on_self_intersection` to `false` and `clip_volume` to `false`. |

See also
  `clip()`

## ◆ surface_intersection()

template<class OutputIterator , class TriangleMesh , class NamedParameters1 = parameters::Default_named_parameters, class NamedParameters2 = parameters::Default_named_parameters>

OutputIterator CGAL::Polygon_mesh_processing::surface_intersection | ( | const TriangleMesh & | tm1,
|  | const TriangleMesh & | tm2,
|  | OutputIterator | polyline_output,
|  | const NamedParameters1 & | np1 = `parameters::default_values()`,
|  | const NamedParameters2 & | np2 = `parameters::default_values()`
| ) |  |

`#include <CGAL/Polygon_mesh_processing/intersection.h>`

computes the intersection of triangles of `tm1` and `tm2`.

The output is a set of polylines with all vertices but endpoints being of degree 2.

Precondition
  `!CGAL::Polygon_mesh_processing::does_self_intersect(tm1)`
  `!CGAL::Polygon_mesh_processing::does_self_intersect(tm2)`

Template Parameters

  TriangleMesh | a model of `MutableFaceGraph`, `HalfedgeListGraph` and `FaceListGraph`
  NamedParameters1 | a sequence of Named Parameters
  NamedParameters2 | a sequence of Named Parameters
  OutputIterator | an output iterator in which `std::vector` of points can be put. The point type is the one from the vertex property map

Parameters

  tm1 | first input triangulated surface mesh
  tm2 | second input triangulated surface mesh
  polyline_output | output iterator of polylines. Each polyline will be given as a vector of points
  np1 | an optional sequence of Named Parameters among the ones listed below
  np2 | an 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` should be available for the vertices of `tm1` (`tm2`) Extra: Both vertex point maps must have the same value type |
  If `true`, the set of triangles closed 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 |

See also
  `do_intersect()`