Concept

SurfaceMeshComplex_2InTriangulation_3

Definition

The concept SurfaceMeshComplex_2InTriangulation_3 describes a data structure designed to represent a two dimensional pure complex embedded in a three dimensional triangulation.

A complex is a set C of faces such that:
- any subface of a face in C is a face of C
- two faces of C are disjoint or share a common subface
The complex is two dimensional, if its faces have dimension at most two. It is pure if any face in the complex is a subface of some face of maximal dimension. Thus, a two dimensional pure complex is a set of facets together with their edges and vertices. A two dimensional pure complex embedded in a three dimensional triangulation is a subset of the facets of this triangulation, together with their edges and vertices.

The concept SurfaceMeshComplex_2InTriangulation_3 is particularly suited to handle surface meshes obtained as the restriction to a surface of a three dimensional Delaunay triangulation. A model of this concept is a type to be plugged as first template parameter in the function template make_surface_mesh.

Types

SurfaceMeshComplex_2InTriangulation_3 provides the following types.

SurfaceMeshComplex_2InTriangulation_3::Triangulation
The type of the embedding 3D triangulation. Must be a model of SurfaceMeshTriangulation_3.

typedef Triangulation::Vertex_handle
Vertex_handle; The type of the embedding triangulation vertex handles.
typedef Triangulation::Cell_handle
Cell_handle; The type of the embedding triangulation cell handles.
typedef Triangulation::Facet Facet; The type of the embedding triangulation facets.
typedef Triangulation::Edge Edge; The type of the embedding triangulation edges.
typedef Triangulation::size_type size_type; Size type (an unsigned integral type)

enum Face_status { NOT_IN_COMPLEX, BOUNDARY, REGULAR, SINGULAR};
A type to describe the status of a face (facet, edge, or vertex) with respect to the 2D pure complex. A NOT_IN_COMPLEX face does not belong to the 2D complex. Facets can only be NOT_IN_COMPLEX or REGULAR depending on whether they belong to the 2D complex on not. Edges and vertices can be NOT_IN_COMPLEX, BOUNDARY, REGULAR or SINGULAR. An edge in the complex is BOUNDARY, REGULAR, or SINGULAR, if it is incident to respectively 1, 2, or 3 or more facets in the complex. The status of a vertex is determined by the adjacency graph of the facets of the 2D complex incident to that vertex. The vertex of the 2D complex is BOUNDARY, if this adjacency graph is a simple path, it is REGULAR, if the adjacency graph is cyclic, and SINGULAR in any other case.


SurfaceMeshComplex_2InTriangulation_3::Facet_iterator
An iterator type to visit the facets of the 2D complex.

SurfaceMeshComplex_2InTriangulation_3::Edge_iterator
An iterator type to visit the edges of the 2D complex.

SurfaceMeshComplex_2InTriangulation_3::Vertex_iterator
An iterator type to visit vertices of the 2D complex.


SurfaceMeshComplex_2InTriangulation_3::Boundary_edges_iterator
An iterator type to visit the boundary edges of the 2D complex.

Creation

SurfaceMeshComplex_2InTriangulation_3 c2t3 ( Triangulation& t3);
Builds an empty 2D complex embedded in the triangulation t3

template < class FacetSelector>
SurfaceMeshComplex_2InTriangulation_3 c2t3 ( Triangulation& t3, FacetSelector select);
Builds a 2D complex embedded in the triangulation t3, including in the 2D complex the facets of t3 for which the predicate select returns true.
The type FacetSelector must be a function object with an operator to select facets: bool operator()(Facet f);.

Member access

Triangulation& c2t3.triangulation () Returns the reference to the triangulation.

Modifications

void c2t3.add_to_complex ( Facet f) Adds facet f to the 2D complex.
void c2t3.add_to_complex ( Cell_handle c, int i)
Adds facet (c,i) to the 2D complex.
void c2t3.remove_from_complex ( Facet f)
Removes facet f from the 2D complex.
void c2t3.remove_from_complex ( Cell_handle c, int i)
Removes facet (c,i) from the 2D complex.

Queries

Queries on the status of individual face with respect to the 2D complex.

size_type c2t3.number_of_facets () const Returns the number of facets that belong to the 2D complex.

Face_status c2t3.face_status ( Facet f) Returns the status of the facet f with respect to the 2D complex.
Face_status c2t3.face_status ( Cell_handle c, int i)
Returns the status of the facet (c,i) with respect to the 2D complex.
Face_status c2t3.face_status ( Edge e) Returns the status of edge e in the 2D complex.
Face_status c2t3.face_status ( Cell_handle c, int i, int j)
Returns the status of edge (c,i,j) in the 2D complex.
Face_status c2t3.face_status ( Vertex_handle v)
Returns the status of vertex v in the 2D complex.

bool c2t3.is_in_complex ( Facet f) Returns true, if the facet f belongs to the 2D complex.
bool c2t3.is_in_complex ( Cell_handle c, int i)
Returns true, if the facet (c,i) belongs to the 2D complex.
bool c2t3.is_in_complex ( Edge e) Returns true, if the edge e belongs to the 2D complex.
bool c2t3.is_in_complex ( Cell_handle c, int i, int j)
Returns true, if the edge (c,i,j) belongs to the 2D complex.
bool c2t3.is_in_complex ( Vertex_handle v)
Returns true, if the vertex v belongs to the 2D complex.

bool c2t3.is_regular_or_boundary_for_vertices ( Vertex_handle v)
Returns true if the status of vertex v is REGULAR or BOUNDARY.
Precondition: All the edges of the complex incident to v are REGULAR or BOUNDARY.

Traversal of the complex

The data structure provides iterators to visit the facets, edges and vertices of the complex. All those iterators are bidirectional and non mutable.

Facet_iterator c2t3.facets_begin () Returns an iterator with value type Facet to visit the facets of the 2D complex.
Facet_iterator c2t3.facets_end () Returns the past the end iterator for the above iterator.

Edge_iterator c2t3.edges_begin () Returns an iterator with value type Edge to visit the edges of the 2D complex which are not isolated.
Edge_iterator c2t3.edges_end () Returns the past the end iterator for the above iterator.
Boundary_edges_iterator c2t3.boundary_edges_begin () Returns an iterator with value type Edge to visit the boundary edges of the complex.
Boundary_edges_iterator c2t3.boundary_edges_end () Returns the past the end iterator for the above iterator.
Vertex_iterator c2t3.vertices_begin () Returns an iterator with value type Vertex_handle to visit the vertices of the 2D complex.
Vertex_iterator c2t3.vertices_end () Returns the past the end iterator for the above iterator.

template <class OutputIterator>
OutputIterator c2t3.incident_facets ( Vertex_handle v, OutputIterator facets)
Copies the Facets of the complex incident to v to the output iterator facets. Returns the resulting output iterator.
Precondition: c2t3.triangulation().dimension() =3, v Vertex_handle(), c2t3.triangulation().is_vertex(v).

The following function is the basic function to walk on the 2D complex

Facet c2t3.neighbor ( Facet f, int j) Returns the facet of the complex which is the neighbor of the facet f opposite to the vertex with index j of f. The vertices of the facet f = (cell c, i) are numbered (0,1,2) (according to the vertex_triple_index(i,j) member function of Triangulation_3) in such a way that facet f is oriented by the outward normal of tetraedra c. If there is no such neighbor, or if the edge is singular the functions returns Facet().
Facet c2t3.neighbor ( Cell_handle c, int i, int j)
Returns the facet of the complex which is the neighbor of the facet f opposite to the vertex with index j of f. See above.

Has Models

Surface_mesh_complex_2_in_triangulation_3<Tr>

See Also

make_surface_mesh.