cgal/TDS_2/doc/TDS_2/Concepts/TriangulationDSFaceBase_2.h

192 lines
4.6 KiB
C++

/*!
\ingroup PkgTDS2Concepts
\cgalConcept
\cgalRefines `TriangulationDataStructure_2::Face`
The concept `TriangulationDSFaceBase_2` describes the requirements for
the face base class of a `CGAL::Triangulation_data_structure_2<Vb,Fb>`.
Note that if the `CGAL::Triangulation_data_structure_2`
is plugged into a triangulation class,
the face base class may have additional geometric
requirements depending on the triangulation class.
At the base level,
(see Sections \ref Section_2D_Triangulations_Software_Design
and \ref TDS_2D_default ),
a face stores handles
on its three vertices and on the three neighboring faces.
The vertices and neighbors are indexed 0,1 and 2.
Neighbor `i` lies opposite to vertex `i`.
Since the `CGAL::Triangulation_data_structure_2` is the class
which defines the handle
types, the face base class has to be somehow
parameterized by the triangulation
data structure. But since the `CGAL::Triangulation_data_structure_2`
itself is parameterized by the face and vertex
base classes, there is a cycle in the definition of these classes.
In order
to break the cycle, the base classes for faces and vertices
which are plugged in to instantiate a
`CGAL::Triangulation_data_structure_2`
use `void` as triangulation
data structure parameter. Then,
the `CGAL::Triangulation_data_structure_2`
uses a <I>rebind</I> mechanism (similar to the one specified in
`std::allocator`) in order to plug itself
as parameter in the face and vertex base classes.
This mechanism requires that the base class provides
a templated nested class `Rebind_TDS` that
itself provides
the subtype `Rebind_TDS::Other`
which is the <I>rebound</I> version of the base class.
This <I>rebound</I> base class is the class
that the `CGAL::Triangulation_data_structure_2`
actually uses as a base class for the class
`CGAL::Triangulation_data_structure_2::Face`.
\cgalHasModel `CGAL::Triangulation_ds_face_base_2<TDS>`
\sa `TriangulationDSVertexBase_2`
\sa `CGAL::Triangulation_data_structure_2<Vb,Fb>`
*/
class TriangulationDSFaceBase_2
{
public:
/// \name Types
/// The concept `TriangulationDSFaceBase_2` has to provide the
/// following types.
/// @{
/*!
This template class has to define a type `Rebind_TDS<TDS_2>::%Other` which is the
<I>rebound</I> face base, where the
`CGAL::Triangulation_data_structure_2` is actually plugged in.
This type `Other` will be the actual base
of the class `CGAL::Triangulation_data_structure_2::Face`.
\note It can be implemented using a nested template class.
\sa Section \ref TDS_2TheRebindMechanism
*/
template <typename TDS2>
using Rebind_TDS = unspecified_type;
/*!
*/
typedef TriangulationDataStructure_2 Triangulation_data_structure;
/*!
*/
typedef TriangulationDataStructure_2::Vertex_handle Vertex_handle;
/*!
*/
typedef TriangulationDataStructure_2::Face_handle Face_handle;
/// @}
/// \name Creation
/// @{
/*!
default constructor.
*/
TriangulationDSFaceBase_2();
/*!
Initializes the vertices with `v0, v1, v2` and the neighbors
with `Face_handle()`.
*/
TriangulationDSFaceBase_2(Vertex_handle v0,
Vertex_handle v1,
Vertex_handle v2);
/*!
initializes the vertices with `v0,v1, v2` and the neighbors with
`n0, n1, n2`.
*/
TriangulationDSFaceBase_2(Vertex_handle v0,
Vertex_handle v1,
Vertex_handle v2,
Face_handle n0,
Face_handle n1,
Face_handle n2);
/// @}
/// \name Access Functions
/// @{
/*!
returns the dimension.
*/
int dimension();
/// @}
/// \name Orientation
/// @{
/*!
Changes the orientation of the face by exchanging `vertex(0)`
with `vertex(1)` and `neighbor(0)` with `neighbor(1)`.
*/
void reorient();
/*!
performs a counterclockwise permutation of the
vertices and neighbors of the face.
*/
void ccw_permute();
/*!
performs a clockwise permutation of the
vertices and neighbors of the face.
*/
void cw_permute();
/// @}
/// \name Checking
/// @{
/*!
performs any required test on a face.
If `verbose` is set to `true`, messages are printed to give
a precise indication of the kind of invalidity encountered.
*/
bool is_valid(bool verbose = false) const;
/// @}
/// \name Various
/// These member functions are required by
/// `CGAL::Triangulation_data_structure_2` because it uses
/// `CGAL::Compact_container` to store its faces. See the documentation of
/// `CGAL::Compact_container` for the exact requirements.
/// @{
/*!
*/
void * for_compact_container() const;
/*!
*/
void for_compact_container(void *p);
/// @}
}; /* end TriangulationDSFaceBase_2 */