\( \newcommand{\E}{\mathrm{E}} \) \( \newcommand{\A}{\mathrm{A}} \) \( \newcommand{\R}{\mathrm{R}} \) \( \newcommand{\N}{\mathrm{N}} \) \( \newcommand{\Q}{\mathrm{Q}} \) \( \newcommand{\Z}{\mathrm{Z}} \) \( \def\ccSum #1#2#3{ \sum_{#1}^{#2}{#3} } \def\ccProd #1#2#3{ \sum_{#1}^{#2}{#3} }\)

CGAL 4.8 - Triangulated Surface Mesh Simplification

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Groups Pages
List of all members | Related Functions
EdgeCollapsableSurfaceMeshWithConstraints Concept Reference
Concepts

## Definition

The concept `EdgeCollapsableSurfaceMeshWithConstraints` describes additional requirements for the type of triangulated surface meshes that can be passed to the simplification algorithm.

Refines:
  `EdgeCollapsableSurfaceMesh`

Valid Expressions

Let `v0v1` be an edge of the triangulated surface mesh `ecm` and `v0` and `v1` being the source and target vertices of that edge. The surface mesh simplification algorithm requires the call to the function `halfedge_collapse(v0v1,ecm)` to be valid and to return the vertex not removed after collapsing the undirected edge `(v0v1,v1v0)`.

For `e` \( \in \{\) `v0v1,v1v0` \( \}\), let `en` and `ep` be the next and previous edges, that is `en = next_edge(e, surface_mesh)`, `ep = prev_edge(e,surface_mesh)`, and let `eno` and `epo` be their opposite edges, that is `eno = opposite_edge(en, surface_mesh)` and `epo = opposite_edge(ep,surface_mesh)`.

Then, after the collapse of `(v0v1,v1v0)` the invariants described in the concept `EdgeCollapsableSurfaceMesh` hold if `ep` is not constrained. Otherwise, it is `en` that is removed from `ecm`.

Has Models:
  `CGAL::Polyhedron_3<Traits>` (If it has only triangular faces), using the specialization `boost::graph_traits< CGAL::Polyhedron_3<Traits> >` .

See Also
  `boost::graph_traits< CGAL::Polyhedron_3<Traits> >`

## Related Functions
(Note that these are not member functions.)
template<class EdgeCollapsableSurfaceMeshWithConstraints , class EdgeIsConstrainedMap >
boost::graph_traits < EdgeCollapsableSurfaceMeshWithConstraints > ::vertex_descriptor | halfedge_collapse (typename boost::graph_traits< EdgeCollapsableSurfaceMeshWithConstraints >::edge_descriptor const &ue, EdgeCollapsableSurfaceMeshWithConstraints &surface_mesh, EdgeIsConstrainedMap edge_is_constrained_map)
| Collapses the undirected edge `(v0v1,v1v0)` replacing it with `v0` or `v1`, as described in the paragraph above and guarantees that a halfedge `he`, for which `get(edge_is_constrained_map, he)==true`, is not removed after the collapse. More...

## Friends And Related Function Documentation

template<class EdgeCollapsableSurfaceMeshWithConstraints , class EdgeIsConstrainedMap >

boost::graph_traits< EdgeCollapsableSurfaceMeshWithConstraints >::vertex_descriptor halfedge_collapse | ( | typename boost::graph_traits< EdgeCollapsableSurfaceMeshWithConstraints >::edge_descriptor const & | ue,
|  | EdgeCollapsableSurfaceMeshWithConstraints & | surface_mesh,
|  | EdgeIsConstrainedMap | edge_is_constrained_map
| ) |  |
| related

Collapses the undirected edge `(v0v1,v1v0)` replacing it with `v0` or `v1`, as described in the paragraph above and guarantees that a halfedge `he`, for which `get(edge_is_constrained_map, he)==true`, is not removed after the collapse.

Template Parameters

  EdgeCollapsableSurfaceMeshWithConstraints | a model of `HalfedgeGraph`
  EdgeIsConstrainedMap | a model of `ReadablePropertyMap` with the edge descriptor of `EdgeCollapsableSurfaceMeshWithConstraints` as key type and a boolean as value type. It indicates if an edge is constrained or not.

Precondition
  This function requires `surface_mesh` to be an oriented 2-manifold with or without boundaries. Furthermore, the undirected edge `(v0v1,v1v0)` must satisfy the link condition [1], which guarantees that the surface mesh is also 2-manifold after the edge collapse.
  `get(edge_is_constrained_map, v0v1)==get(edge_is_constrained_map, v1v0)==false`.
  `v0` and `v1` are not both incident to a constrained edge.