diff --git a/Combinatorial_map/doc/Combinatorial_map/Combinatorial_map.txt b/Combinatorial_map/doc/Combinatorial_map/Combinatorial_map.txt
index 7fd1e8d496d..cd43cc5efa4 100644
--- a/Combinatorial_map/doc/Combinatorial_map/Combinatorial_map.txt
+++ b/Combinatorial_map/doc/Combinatorial_map/Combinatorial_map.txt
@@ -474,7 +474,7 @@ Lastly we remove the dynamic onmerge functor (step 8). This is done by initializ
\section sec_definition Mathematical Definitions
-The initial definition of combinatorial map in any dimension is given in \cgalCite{cgal:l-tmbrc-91}, \cgalCite{l-ndgcm-94}. But it allows only to represent objects without boundaries. This definition was extended \cgalCite{cgal:pabl-cco-07}, \cgalCite{cgal:d-ccccg-10} in order to allow to represent objects with boundaries, based on the notions of partial permutations and partial involutions.
+The initial definition of combinatorial map in any dimension is given in \cgalCite{cgal:l-tmbrc-91}, \cgalCite{l-ndgcm-94}. But it allows only to represent objects without boundaries. This definition was extended \cgalCite{cgal:pabl-cco-07}, \cgalCite{cgal:d-ccccg-10} in order to allow to represent objects with boundaries, based on the notions of partial permutations and partial involutions. See also the book \cgalCite{dl-14} which regroups many definitions, operations and algorithms about combinatorial and generalized maps.
Intuitively, a partial permutation on a finite set E is a mapping from E\f$ \cup\{\varnothing\}\f$ to E\f$ \cup\{\varnothing\}\f$ which is injective on the subset of the domain that does not map to \f$\varnothing\f$. More precisely, a mapping p: E\f$ \cup\{\varnothing\} \rightarrow\f$ E\f$ \cup\{\varnothing\}\f$ is a partial permutation defined on E if:
diff --git a/Generalized_map/doc/Generalized_map/Doxyfile.in b/Generalized_map/doc/Generalized_map/Doxyfile.in
index f04fcda678b..28420a22a98 100644
--- a/Generalized_map/doc/Generalized_map/Doxyfile.in
+++ b/Generalized_map/doc/Generalized_map/Doxyfile.in
@@ -1,3 +1,5 @@
@INCLUDE = ${CGAL_DOC_PACKAGE_DEFAULTS}
PROJECT_NAME = "CGAL ${CGAL_FULL_VERSION} - Generalized Maps"
+ALIASES += tred{1}="\htmlonly \1 \endhtmlonly"
+
diff --git a/Generalized_map/doc/Generalized_map/Generalized_map.txt b/Generalized_map/doc/Generalized_map/Generalized_map.txt
index 9bb7a33db31..b355636bdf2 100644
--- a/Generalized_map/doc/Generalized_map/Generalized_map.txt
+++ b/Generalized_map/doc/Generalized_map/Generalized_map.txt
@@ -10,7 +10,9 @@ namespace CGAL {
\section Generalized_mapIntroduction Introduction
-A d-dimensional generalized map is a data structure representing an orientable or non orientable subdivided d-dimensional object obtained by taking dD cells, and allowing to glue dD cells along (d-1)D cells. It provides a description of all the cells of the subdivision (for example vertices and edges), together with incidence and adjacency relationships. This package is a generalization of the \ref ChapterCombinatorialMap combinatorial maps data structure which allows to describe only orientable objects.
+A d-dimensional generalized map is a data structure representing an \tred{orientable or non orientable} subdivided d-dimensional object obtained by taking dD cells, and allowing to glue dD cells along (d-1)D cells. It provides a description of all the cells of the subdivision (for example vertices and edges), together with incidence and adjacency relationships.
+
+\tred{This package is an extension of the \ref ChapterCombinatorialMap combinatorial maps data structure which allows to describe only orientable objects.}
We denote i-cell for an i-dimensional cell (for example in 3D, 0-cells are vertices, 1-cells are edges, 2-cells are facets, and 3-cells are volumes). A boundary relation is defined on these cells, giving for each i-cell c the set of (i-1)-cells contained in the boundary of c. Two cells c1 and c2 are incident if there is a path of cells, starting from the cell of biggest dimension to the other cell, such that each cell of the path (except the first one) belongs to the boundary of the previous cell in the path. Two i-cells c3 and c4 are adjacent if there is an (i-1)-cell incident to both c3 and c4. You can see an example of a 2D object and a 3D object in \cgalFigureRef{figexemple3Dmanifold} showing some cells of the subdivision and some adjacency and incidence relations.
@@ -18,38 +20,43 @@ We denote i-cell for an i-dimensional cell (for example in 3D, 0-c
Example of subdivided objects that can be described by generalized maps. Left: A 2D object composed of three facets (2-cells), named f1, f2 and f3, nine edges (1-cells) and seven vertices (0-cells). f1 and f2 are adjacent along edge e1, thus e1 is incident both to f1 and f2. Vertex v1 is incident to edge e1, thus v1 is incident to f1 and f2 by transitivity. Right: A 3D object (only partially represented for vertices and edges) composed of three volumes (3-cells), named vol1, vol2 and vol3, twelve facets (2-cells) (there is one facet f4 between vol1 and vol2, and similarly between vol1 and vol3 and vol2 and vol3), sixteen edges (1-cells), and eight vertices (0-cells). vol1 and vol2 are adjacent along facet f4, thus f4 is incident both to vol1 and vol2. Edge e4 is incident to the three facets between vol1 and vol2, vol1 and vol3, and vol2 and vol3. e4 is also incident to the three volumes by transitivity.
\cgalFigureEnd
-A generalized map is an edge-centered data structure describing the cells and the incidence and adjacency relations, using only one basic element called dart, and a set of pointers between these darts. A dart can be thought as a part of an edge (1-cell), together with a part of incident cells of dimensions 0, 2, 3, ..., d. When a dart d0 describes a part of an
-i-cell c, we say that d0 belongs to c, and that c contains d0. Let us look at the example in \cgalFigureRef{figexemplegenmaps} showing the 2D and 3D generalized maps describing the two objects given in \cgalFigureRef{figexemple3Dmanifold}.
+A generalized map is an edge-centered data structure describing the cells and the incidence and adjacency relations, using only one basic element called dart, and a set of pointers between these darts. A dart can be thought as a part of an edge (1-cell), together with a part of incident cells of dimensions 0, 2, 3, ..., d. When a dart d0 describes a part of an i-cell c, we say that d0 belongs to c, and that c contains d0. Let us look at the example in \cgalFigureRef{figexemplegenmaps} showing the 2D and 3D generalized maps describing the two objects given in \cgalFigureRef{figexemple3Dmanifold}.
\cgalFigureBegin{figexemplegenmaps,gmaps2d-3d.svg}
-Generalized maps representing the objects given in \cgalFigureRef{figexemple3Dmanifold}. Left: The 2D generalized map which contains 24 darts. Right: The 3D generalized map which contains 108 darts (36 for each volume).
+Generalized maps representing the objects given in \cgalFigureRef{figexemple3Dmanifold}. Left: The 2D generalized map which contains \tred{24} darts. Right: The 3D generalized map which contains \tred{108} darts (\tred{36} for each volume).
\cgalFigureEnd
-First let us start in 2D (\cgalFigureRef{figexemplegenmaps} (Left)). Edge f1 is described by two darts. These darts are linked together with pointers called \f$ \alpha_0\f$. Starting from a dart and following a \f$ \alpha_0\f$ pointer, we get to a dart which belongs to the same edge, to the same facet but to the other vertex (0-cell, which explains the index 0 of \f$ \alpha_0\f$). Facet f1 is described by four edges, and thus by eight darts. The edges are linked together with pointers called \f$ \alpha_1\f$. Starting from a dart and following a \f$ \alpha_1\f$ pointer, we get to a dart which belongs to the same vertex, the same facet but to the next edge (1-cell, which explains the index 1 of \f$ \alpha_1\f$). Lastly the faces are linked together with pointers called \f$ \alpha_2\f$. Starting from a dart and following a \f$ \alpha_2\f$ pointer, we get to a dart which belongs to the same vertex, the same edge but to the next face (2-cell, which explains the index 2 of \f$ \alpha_2\f$).
+\cgalModifBegin
+
+First let us start in 2D (\cgalFigureRef{figexemplegenmaps} (Left)). Edge e1 is described by four darts. These darts are linked together with pointers called \f$ \alpha_0\f$ and \f$ \alpha_2\f$. Starting from a dart and following an \f$ \alpha_0\f$ pointers, we get to a dart which belongs to the same edge, to the same facet but to the other vertex (0-cell, which explains the index 0 of \f$ \alpha_0\f$). Starting from a dart and following an \f$ \alpha_2\f$ pointers, we get to a dart which belongs to the same vertex, to the same edge but to the other facet (2-cell, which explains the index 2).
+
+Facet f1 is described by four edges, and thus by eight darts. The edges are linked together with pointers called \f$ \alpha_0\f$ and \f$ \alpha_1\f$. Starting from a dart and following a \f$ \alpha_1\f$ pointer, we get to a dart which belongs to the same vertex, the same facet but to the other edge (1-cell, which explains the index 1 of \f$ \alpha_1\f$).
+
+Similarly, vertex v1 is described by six darts, linked together with pointers \f$ \alpha_1\f$ and \f$ \alpha_2\f$.
+
+\cgalModifEnd
The main interest of generalized map definition based on darts and \f$ \alpha_i\f$ pointers is to be able to increase the dimension "only" by adding new pointers. We can verify this fact by studying the 3D example (\cgalFigureRef{figexemplegenmaps} (Right)). In addition to \f$ \alpha_0\f$, \f$ \alpha_1\f$ and \f$ \alpha_2\f$ of the 2D case, there is a new pointer \f$ \alpha_3\f$.
-If we take a closer look at the central edge e4 shown in \cgalFigureRef{figintuitiveexemple} (Left), we can see that it is described by twelve darts linked together. Starting from a dart and following a \f$ \alpha_3\f$ pointer, we get to a dart which belongs to the same vertex, to the same edge, to the same facet, but to the neighboring volume (a 3-cell, which explains the index 3 in \f$ \alpha_3\f$). Similarly, starting from a dart and following a \f$ \alpha_2\f$ pointer, we get to a dart which belongs to the same vertex, to the same edge, to the same volume, but to the neighboring facet (2-cell). And starting from a dart and following a \f$ \alpha_0\f$ pointer, we get to a dart which belongs to the same edge, to the same facet, to the same volume, but to the neighboring vertex (0-cell). Starting from any of these twelve darts and following \f$ \alpha_0\f$, \f$ \alpha_2\f$ and \f$ \alpha_3\f$ pointers, we can reach exactly the twelve darts describing edge e4.
+If we take a closer look at the central edge e4 shown in \cgalFigureRef{figintuitiveexemple} (Left), we can see that it is described by \tred{twelve darts} linked together. Starting from a dart and following a \f$ \alpha_3\f$ pointer, we get to a dart which belongs to the \tred{same vertex, to the same edge, to the same facet, but to the neighboring volume} (a 3-cell, which explains the index 3 in \f$ \alpha_3\f$). Similarly, starting from a dart and following a \f$ \alpha_2\f$ pointer, we get to a dart which belongs to the same vertex, to the same edge, to the same volume, but to the neighboring facet (2-cell). And starting from a dart and following a \f$ \alpha_0\f$ pointer, we get to a dart which belongs to the same edge, to the same facet, to the same volume, but to the neighboring vertex (0-cell). Starting from any of these twelve darts and following \f$ \alpha_0\f$, \f$ \alpha_2\f$ and \f$ \alpha_3\f$ pointers, we can reach exactly the twelve darts describing edge e4.
\cgalFigureBegin{figintuitiveexemple,gmaps2d-3d-zoom.svg}
-Two zooms on the 3D generalized map given in \cgalFigureRef{figexemplegenmaps} (Right). Left: Zoom around the central edge e4 which details the twelve darts belonging to the edge. Right: Zoom around the facet between volumes vol2 and vol3 which details the sixteen darts belonging to the facet.
+Two zooms on the 3D generalized map given in \cgalFigureRef{figexemplegenmaps} (Right). Left: Zoom around the central edge e4 which details the \tred{twelve} darts belonging to the edge. Right: Zoom around the facet between volumes vol2 and vol3 which details the \tred{sixteen} darts belonging to the facet.
\cgalFigureEnd
-For facets, by following a \f$ \alpha_1\f$ pointer, we get to a dart which belongs to the same vertex, to the same facet, to the same volume, but to the next edge (1-cell, which explains the index 1 of \f$ \alpha_1\f$). Starting from any dart and following \f$ \alpha_0\f$, \f$ \alpha_1\f$ and \f$ \alpha_3\f$ pointers, we can reach exactly all the darts describing the facet (see \cgalFigureRef{figintuitiveexemple} (Right)). For volumes, starting from any dart and following \f$ \alpha_0\f$, \f$ \alpha_1\f$ and \f$ \alpha_2\f$ pointers, we can reach exactly all the darts describing the volume.
+For facets, by following a \f$ \alpha_1\f$ pointer, we get to a dart which belongs \tred{to the same vertex}, to the same facet, to the same volume, but to the next edge (1-cell, which explains the index 1 of \f$ \alpha_1\f$). Starting from any dart and following \f$ \alpha_0\f$, \f$ \alpha_1\f$ and \f$ \alpha_3\f$ pointers, we can reach exactly all the darts describing the facet (see \cgalFigureRef{figintuitiveexemple} (Right)). For volumes, starting from any dart and following \f$ \alpha_0\f$, \f$ \alpha_1\f$ and \f$ \alpha_2\f$ pointers, we can reach exactly all the darts describing the volume. \cgalModifBegin For vertices, we have to follow \f$ \alpha_1\f$, \f$ \alpha_2\f$ and \f$ \alpha_3\f$ pointers to reach exactly the darts describing the vertex v. \cgalModifEnd
-For vertices, we have to follow \f$ \alpha_1\f$, \f$ \alpha_2\f$ and \f$ \alpha_3\f$ pointers to reach exactly the darts describing the vertex v.
+In some cases, the general rule that by following a \f$ \alpha_i\f$ we get a dart which belongs to the neighboring i-cell is not true, as for example for darts belonging to the boundary of the represented object. For example, in \cgalFigureRef{figexemple3Dmanifold} (Left), any dart d0 that does not belong to edge e1, e2 and e3 belongs to a 2-cell, and there is no neighboring facet along the edge containing d0. Another example is in \cgalFigureRef{figexemple3Dmanifold} (Right), for any dart d0 that belongs to facet f5. d0 belongs to volume vol2, but there is no neighboring volume along this facet. The general rule is also not true for unbounded cells. For example if we remove a dart in \cgalFigureRef{figexemplegenmaps} (Left), we obtain an unbounded facet having \tred{one dart without next dart for} \f$ \alpha_0\f$, \tred{and one dart without next dart for} \f$ \alpha_1\f$, and if we remove a facet in \cgalFigureRef{figexemplegenmaps} (Right), we obtain an unbounded volume having some darts without neighboring facet for \f$ \alpha_2\f$. In such a case, \tred{the darts are linked with themselves for} \f$ \alpha_i\f$ to describe that a dart d0 is not linked to another dart in dimension i.
-In some cases, the general rule that by following a \f$ \alpha_i\f$ we get a dart which belongs to the neighboring i-cell is not true, as for example for darts belonging to the boundary of the represented object. For example, in \cgalFigureRef{figexemple3Dmanifold} (Left), any dart d0 that does not belong to edge e1, e2 and e3 belongs to a 2-cell, and there is no neighboring facet along the edge containing d0. Another example is in \cgalFigureRef{figexemple3Dmanifold} (Right), for any dart d0 that belongs to facet f5. d0 belongs to volume vol2, but there is no neighboring volume along this facet. The general rule is also not true for unbounded cells. For example if we remove a dart in \cgalFigureRef{figexemplegenmaps} (Left), we obtain an unbounded facet having two darts without next dart for \f$ \alpha_1\f$, and if we remove a facet in \cgalFigureRef{figexemplegenmaps} (Right), we obtain an unbounded volume having some darts without neighboring facet for \f$ \alpha_2\f$. In such a case, the darts are linked with themselves for \f$ \alpha_i\f$ to describe that a dart d0 is not linked to another dart in dimension i.
-
-Generalized maps are defined in any dimension. A -1D generalized map is a set of isolated darts describing isolated vertices. A 0D generalized map is a set of darts paired by \f$ \alpha_0\f$ describing isolated edges. A 1D generalized map describes paths or cycles of darts corresponding to paths or cycles of edges. The most useful cases are 2D and 3D generalized maps. In 2D, a generalized map is a set of surfaces (orientable or not), and in 3D a generalized map is a set of connected volumes. In the following, notions are mainly illustrated in 3D. But it is important to keep in mind that one main interest of generalized maps is their generic definition in any dimension, and that everything presented in this manual is valid in any dimension.
+Generalized maps are defined in any dimension. \cgalModifBegin -1D generalized map is a set of isolated darts describing isolated vertices. A 0D generalized map is a set of darts paired by \f$ \alpha_0\f$ describing isolated edges. \cgalModifEnd A 1D generalized map describes paths or cycles of darts corresponding to paths or cycles of edges. The most useful cases are 2D and 3D generalized maps. In 2D, a generalized map is a set of surfaces \tred{(orientable or not),} and in 3D a generalized map is a set of connected volumes. In the following, notions are mainly illustrated in 3D. But it is important to keep in mind that one main interest of generalized maps is their generic definition in any dimension, and that everything presented in this manual is valid in any dimension.
A dD generalized map is useful when you want to describe dD objects and the adjacency relations between these objects, and you want to be able to efficiency traverse these objects by using the different relations. For example, we can use a 3D generalized map to describe a 3D segmented image: each 3-cell corresponds to a region in the image and each 2-cell corresponds to a contact area between two regions.
-A generalized map does not contain any geometrical information. However, this package allows to associate any information to the cells of the generalized map. A specific information, which is often used in practice, consists in adding linear geometry to a generalized map by associating a point to each vertex of the map: this is the object of the \ref ChapterLinearCellComplex "Linear cell complex" package (when an object has a point associated to each vertex, each edge is thus a straight line segment, which explains the name "linear geometry"). The \ref ChapterLinearCellComplex "Linear cell complex" package can for example be useful to describe 3D buildings as set of walls, rooms, doors and windows (both generalized and geometrical descriptions) and all the adjacency relations between these elements allowing for example to move a camera in a given building from rooms to rooms by traversing doors.
+A generalized map does not contain any geometrical information. However, this package allows to associate any information to the cells of the generalized map. A specific information, which is often used in practice, consists in adding linear geometry to a generalized map by associating a point to each vertex of the map: this is the object of the \ref ChapterLinearCellComplex "Linear cell complex" package (when an object has a point associated to each vertex, each edge is thus a straight line segment, which explains the name "linear geometry"). The \ref ChapterLinearCellComplex "Linear cell complex" package can for example be useful to describe 3D buildings as set of walls, rooms, doors and windows (both combinatorial and geometrical descriptions) and all the adjacency relations between these elements allowing for example to move a camera in a given building from rooms to rooms by traversing doors.
-\section sec_presentation Data Structure Presentation
+\section sec_presentation_gmap Data Structure Presentation
-In this section, we describe dD generalized maps in terms of data structure and operations. Mathematical definitions are provided in Section \ref sec_definition "Mathematical Definitions", and a package description is given in Section \ref secsoftwaredesign "Software Design".
+In this section, we describe dD generalized maps in terms of data structure and operations. Mathematical definitions are provided in Section \ref sec_definition_gmap "Mathematical Definitions", and a package description is given in Section \ref secsoftwaredesign_gmap "Software Design".
\subsection ssecgenmapanddarts Generalized Map and Darts
@@ -58,13 +65,13 @@ A dD generalized map is a set of darts D. A dart d0 is an e
A generalized map is without i-boundary if there is no i-free dart, and it is without boundary if it is without i-boundary for all dimensions 1\f$ \leq\f$i\f$ \leq\f$d.
-We show in \cgalFigureRef{figexemplecarte3d} a 3D object and the corresponding 3D generalized map. This map has 80 darts, some darts being numbered. In this generalized map, we have for example \f$ \alpha_0\f$(1)=2, \f$ \alpha_1\f$(1)=8, \f$ \alpha_2\f$(1)=24, and \f$ \alpha_3\f$(1)=9. This generalized map is without 0-boundary, without 1-boundary and 2-boundary, but has some 3-boundary, because some darts are 3-free, for example \f$ \alpha_3\f$(17)=17.
+We show in \cgalFigureRef{figexemplecarte3d} a 3D object and the corresponding 3D generalized map. This map has \tred{80} darts, some darts being numbered. In this generalized map, we have for example \f$ \alpha_0\f$(1)=2, \f$ \alpha_1\f$(1)=8, \f$ \alpha_2\f$(1)=24, and \f$ \alpha_3\f$(1)=9. This generalized map is without \tred{0-boundary}, without 1-boundary and 2-boundary, but has some 3-boundary, because some darts are 3-free, for example \f$ \alpha_3\f$(17)=17.
\cgalFigureBegin{figexemplecarte3d,gmap3d-example2.svg}
-Example of a 3D generalized map. Left: A 3D object made of two volumes adjacent along facet f2. Right: The corresponding 3D generalized map. Darts are drawn with black segments, sometimes numbered. Two darts linked by \f$ \alpha_0\f$ are drawn aligned and separated by a small gray orthogonal segment (for example \f$ \alpha_0\f$(1)=2), two darts linked by \f$ \alpha_1\f$ are drawn consecutively and separated by a small gray disk (for example \f$ \alpha_1\f$(1)=8), and two darts linked by \f$ \alpha_2\f$ are drawn parallel, in reverse orientations, with the little gray segment joining them (for example \f$ \alpha_2\f$(1)=24). \f$ \alpha_3\f$ pointers are represented by blue segments in this figure (for example \f$ \alpha_3\f$(1)=9).
+Example of a 3D generalized map. Left: A 3D object made of two volumes adjacent along facet f2. Right: The corresponding 3D generalized map. Darts are drawn with \tred{black segments}, sometimes numbered. Two darts linked by \f$ \alpha_0\f$ \tred{are drawn aligned and separated by a small gray orthogonal segment} (for example \f$ \alpha_0\f$(1)=2), \tred{two darts linked by} \f$ \alpha_1\f$ are drawn consecutively \tred{and separated by a small gray disk} (for example \f$ \alpha_1\f$(1)=8), and two darts linked by \f$ \alpha_2\f$ are drawn parallel, in reverse orientations, with the little gray segment joining them (for example \f$ \alpha_2\f$(1)=24). \f$ \alpha_3\f$ pointers are represented by blue segments in this figure (for example \f$ \alpha_3\f$(1)=9).
\cgalFigureEnd
-\subsection sseccellsinmap Cells as Sets of Darts
+\subsection sseccellsingmap Cells as Sets of Darts
A cell in a dD generalized map is implicitly represented by a subset of darts. In this section, we will see how to retrieve all cells containing a given dart, how to retrieve all darts belonging to a cell containing a given dart, and how incidence and adjacency relations are defined in terms of darts.
@@ -86,21 +93,21 @@ A last important property of cells is that for all dimensions i the set o
Let us give some examples of cells in 3D, for the 3D generalized map of \cgalFigureRef{figexemplecarte3d} :
-- All the darts belonging to the same vertex can be obtained by any combination of \f$ \alpha_1\f$, \f$ \alpha_2\f$ and \f$ \alpha_3\f$: for example vertex v of the object corresponds in the generalized map to the set of darts {1,8,9,16,17,24,25,27,28,29,30,31}. Given any dart belonging to this vertex, we retrieve all the other darts by, for example, a breadth-first traversal. In terms of orbits, this 0-cell corresponds to \f$ \langle{}\f$\f$ \alpha_1\f$,\f$ \alpha_2\f$,\f$ \alpha_3\f$\f$ \rangle{}\f$(1).
-
- All the darts belonging to the same edge can be obtained by any combination of \f$ \alpha_0\f$, \f$ \alpha_2\f$ and \f$ \alpha_3\f$: for example edge e of the object corresponds in the generalized map to the set of darts {1,2,9,10,23,24,25,26}. In terms of orbits, this 1-cell corresponds to \f$ \langle{}\f$\f$ \alpha_0\f$,\f$ \alpha_2\f$,\f$ \alpha_3\f$\f$ \rangle{}\f$(1).
-
- All the darts belonging to the same facet can be obtained by any combination of \f$ \alpha_0\f$, \f$ \alpha_1\f$ and \f$ \alpha_3\f$: for example facet f2 corresponds in the generalized map to the set of darts {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}. Facet f1 corresponds to the set of darts {17,18,19,20,21,22,23,24}. Note that these last darts are 3-free since there is no other volume sharing this facet. In terms of orbits, f2 corresponds to \f$ \langle{}\f$\f$ \alpha_0\f$,\f$ \alpha_1\f$,\f$ \alpha_3\f$\f$ \rangle{}\f$(1) and f1 corresponds to \f$ \langle{}\f$\f$ \alpha_0\f$,\f$ \alpha_1\f$,\f$ \alpha_3\f$\f$ \rangle{}\f$(17).
-
- All the darts belonging to the same volume can be obtained by any combination of \f$ \alpha_0\f$, \f$ \alpha_1\f$ and \f$ \alpha_2\f$: for example volume vol1 corresponds in the generalized map to the set of the 48 darts representing the cube. In terms of orbits, vol1 corresponds to \f$ \langle{}\f$\f$ \alpha_0\f$,\f$ \alpha_1\f$,\f$ \alpha_2\f$\f$ \rangle{}\f$(1).
+
- All the darts belonging to the same \tred{vertex} can be obtained by any combination of \f$ \alpha_1\f$, \f$ \alpha_2\f$ and \f$ \alpha_3\f$: for example \tred{vertex} v of the object corresponds in the generalized map to the set of darts {\tred{1,8,9,16,17,24,25,27,28,29,30,31}}. Given any dart belonging to this \tred{vertex}, we retrieve all the other darts by, for example, a breadth-first traversal. In terms of orbits, this \tred{0-cell} corresponds to \f$ \langle{}\f$\f$ \alpha_1\f$,\f$ \alpha_2\f$,\f$ \alpha_3\f$\f$ \rangle{}\f$(1).
+
- All the darts belonging to the same \tred{edge} can be obtained by any combination of \f$ \alpha_0\f$, \f$ \alpha_2\f$ and \f$ \alpha_3\f$: for example \tred{edge} e of the object corresponds in the generalized map to the set of darts {\tred{1,2,9,10,23,24,25,26}}. In terms of orbits, \tred{this 1-cell} corresponds to \f$ \langle{}\f$\f$ \alpha_0\f$,\f$ \alpha_2\f$,\f$ \alpha_3\f$\f$ \rangle{}\f$(1).
+
- All the darts belonging to the same \tred{facet} can be obtained by any combination of \f$ \alpha_0\f$, \f$ \alpha_1\f$ and \f$ \alpha_3\f$: for example \tred{facet} f2 corresponds in the \tred{generalized map to the set of darts {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}}. \tred{Facet} f1 \tred{corresponds to the set of darts {17,18,19,20,21,22,23,24}. Note that these last darts are 3-free since there is no other volume sharing this facet}. In terms of orbits, f2 corresponds to \f$ \langle{}\f$\f$ \alpha_0\f$,\f$ \alpha_1\f$,\f$ \alpha_3\f$\f$ \rangle{}\f$(1) and f1 corresponds to \f$ \langle{}\f$\f$ \alpha_0\f$,\f$ \alpha_1\f$,\f$ \alpha_3\f$\f$ \rangle{}\f$(17).
+
- All the darts belonging to the same volume can be obtained by any combination of \f$ \alpha_0\f$, \f$ \alpha_1\f$ and \f$ \alpha_2\f$: for example volume vol1 corresponds in the generalized map to the set of the \tred{48} darts representing the cube. In terms of orbits, vol1 corresponds to \f$ \langle{}\f$\f$ \alpha_0\f$,\f$ \alpha_1\f$,\f$ \alpha_2\f$\f$ \rangle{}\f$(1).
Using this definition of cells as sets of darts, we can retrieve all the incidence and adjacency relations between the cells of the subdivision in a generalized map. Two cells are incident if the intersection of their two sets of darts is non empty (whatever the dimension of the two cells). Two i-cells c1 and c2, 1\f$ \leq\f$i\f$ \leq\f$d, are adjacent if there is d1\f$ \in\f$c1 and d2\f$ \in\f$c2 such that d1 and d2 belong to the same (i-1)-cell.
-In the example of \cgalFigureRef{figexemplecarte3d}, vertex v and edge e are incident since the intersection of the two corresponding sets of darts is {1,9,24,25}\f$ \neq\f$\f$ \emptyset\f$. Vertex v is incident to facet f2 since the intersection of the two corresponding sets of darts is {1,8,9,16}\f$ \neq\f$\f$ \emptyset\f$. Edge e and facet f1 are incident since the intersection of the two corresponding sets of darts is {23,24}\f$ \neq\f$\f$ \emptyset\f$. Finally, facets f1 and f2 are adjacent because 1\f$ \in\f$f1, 24\f$ \in\f$f2 and 1 and 24 belong to the same edge.
+In the example of \cgalFigureRef{figexemplecarte3d}, vertex v and edge e are incident since the intersection of the two corresponding sets of darts is {\tred{1,9,24,25}}\f$ \neq\f$\f$ \emptyset\f$. Vertex v is incident to facet f2 since the intersection of the two corresponding sets of darts is {\tred{1,8,9,16]}\f$ \neq\f$\f$ \emptyset\f$. Edge e and facet f1 are incident since the intersection of the two corresponding sets of darts is {\tred{23,24}}\f$ \neq\f$\f$ \emptyset\f$. Finally, facets f1 and f2 are adjacent because 1\f$ \in\f$f1, \tred{24}\f$ \in\f$f2 and 1 and \tred{24} belong to the same edge.
We can consider i-cells in a dimension d' with i\f$ \leq\f$d'\f$ \leq\f$ d. The idea is to consider the i-cells as if the generalized map was in d' dimension. For that, we only take into account the \f$ \alpha_j \f$s for j\f$ \leq\f$d'. The i-cell containing d0 in dimension d' is the orbit \f$ \langle{}\f$\f$ \alpha_0\f$,...,\f$ \alpha_{i-1}\f$,\f$ \alpha_{i+1}\f$,...,\f$ \alpha_{d'}\f$\f$ \rangle{}\f$(d0). By default, i-cells are considered in dimension d, the dimension of the generalized map.
-In the example of \cgalFigureRef{figexemplecarte3d}, the 2-cell containing dart 1 is facet f2 which is the set of darts {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}. If we consider the same 2-cell in dimension 2, we obtain the set of darts {1,2,3,4,5,6,7,8}. Intuitively we "forget" \f$ \alpha_3\f$ and we obtain the set of darts of the facet containing dart 1 restricted to the volume containing this dart.
+In the example of \cgalFigureRef{figexemplecarte3d}, the 2-cell containing dart 1 is facet f2 which is the set of darts {\tred{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}}. If we consider the same 2-cell in dimension 2, we obtain the set of darts {\tred{1,2,3,4,5,6,7,8}}. Intuitively we "forget" \f$ \alpha_3\f$ and we obtain the set of darts of the facet containing dart 1 restricted to the volume containing this dart.
-\subsection ssecassociateattributes How to Associate Information to Cells
+\subsection ssecassociateattributesgmap How to Associate Information to Cells
Generalized maps only describe the cells of the subdvision, and all the incidence and adjacency relations between these cells. This is not enough for many applications which need to associate information to cells. This can be geometric or non-geometric information, such as 3D points associated to vertices, the edge length associated to edges, or a color or normal to a facet.
@@ -115,11 +122,12 @@ Since i-cells are not explicitely represented in generalized maps, the as
We can see two examples of generalized maps having some attributes in \cgalFigureRef{figexempleattribs}. In the first example (Left), a 2D generalized map has 1-attributes containing a float, for example corresponding to the length of the associated 1-cell, and 2-attributes containing a color in RGB format. In the second example (Right), a 3D generalized map has 2-attributes containing a color in RGB format.
\cgalFigureBegin{figexempleattribs,gmap2d-3d-attribs.svg}
-Example of generalized maps with attributes. Attributes are represented by black rectangles containing an information, and association between darts and attributes are represented by small red lines. Left: A 2D generalized map with 1-attributes containing a double, for example corresponding to the length of the 1-cell, and 2-attributes containing a color in RGB format. Only three edges of the generalized map, among the nine, are associated to a 1-attribute. All the 2-cells are associated to a 2-attribute. Right: A 3D generalized map with 2-attributes containing a color in RGB format. Only three 2-cells of the generalized map, among the ten, are associated to a 2-attribute. \cgalFigureEnd
+Example of generalized maps with attributes. Attributes are represented by black rectangles containing an information, and association between darts and attributes are represented by small red lines. Left: A 2D generalized map with 1-attributes containing a double, for example corresponding to the length of the 1-cell, and 2-attributes containing a color in RGB format. Only three edges of the generalized map, among the nine, are associated to a 1-attribute. All the 2-cells are associated to a 2-attribute. Right: A 3D generalized map with 2-attributes containing a color in RGB format. Only three 2-cells of the generalized map, among the ten, are associated to a 2-attribute.
+\cgalFigureEnd
\subsection ssecgenmapvalidity Generalized Map Properties
-There are some conditions that a generalized map must satisfy to be valid. Some of them have already been given about the \f$ \alpha\f$ pointers (see Section \ref ssecgenmapanddarts "Generalized Map and Darts") and about the association between darts and attributes (see Section \ref ssecassociateattributes "How to Associate Information to Cells").
+There are some conditions that a generalized map must satisfy to be valid. Some of them have already been given about the \f$ \alpha\f$ pointers (see Section \ref ssecgenmapanddarts "Generalized Map and Darts") and about the association between darts and attributes (see Section \ref ssecassociateattributesgmap "How to Associate Information to Cells").
There is an additional condition related to the type of represented objects, which are quasi-manifold dD objects. A dD quasi-manifold is an object obtained by taking some isolated d-cells, and allowing to glue d-cells along (d-1)-cells. In 2D, quasi-manifolds are manifolds, but this is no longer true in higher dimension as we can see in the example presented in \cgalFigureRef{figquasivariete}. In this example, the object to the right is not a manifold since the neighborhood of the point p in the object is not homeomorphic to a 3D ball (intuitively, two objects are homeomorphic if each object can be continuously deformed into the second one; in such a case, the two objects have exactly the same topological properties).
@@ -127,7 +135,7 @@ There is an additional condition related to the type of represented objects, whi
Example of a 3D quasi-manifold which is not a manifold. The object to the right is made of the four pyramids (shown to the left) glued together along facets, thus it is a quasi-manifold.
\cgalFigureEnd
-Generalized maps can only represent quasi-manifolds due to the definition of \f$ \alpha\f$ pointers. As we have seen in Section \ref sseccellsinmap "Cells as Sets of Darts", \f$ \alpha_i\f$(d0) (with 0\f$ \leq\f$i\f$ \leq\f$d) belongs to the same cells as d0, only the i-cell is different. In other words, \f$ \alpha_i\f$ links two i-cells that share a common (i-1)-cell: it is not possible to link more than two i-cells along a same (i-1)-cell. For this reason, it is not possible to describe non quasi-manifold objects as those shown in \cgalFigureRef{fignonquasimanifold} by generalized maps.
+Generalized maps can only represent quasi-manifolds due to the definition of \f$ \alpha\f$ pointers. As we have seen in Section \ref sseccellsingmap "Cells as Sets of Darts", \f$ \alpha_i\f$(d0) (with 0\f$ \leq\f$i\f$ \leq\f$d) belongs to the same cells as d0, only the i-cell is different. In other words, \f$ \alpha_i\f$ links two i-cells that share a common (i-1)-cell: it is not possible to link more than two i-cells along a same (i-1)-cell. For this reason, it is not possible to describe non quasi-manifold objects as those shown in \cgalFigureRef{fignonquasimanifold} by generalized maps.
\cgalFigureBegin{fignonquasimanifold,nonmanifolds.svg}
Three examples of non quasi-manifold objects. Left: A 2D object which is not a quasi-manifold since the two 2-cells share a common vertex but no common 1-cell. Middle: A 3D object which is not a quasi-manifold since is it not only composed by 3D cells glued together (there is an isolated 2-cell in dark gray). Right: A 3D object which is not a quasi-manifold since the two 3-cells share a common edge but no common 2-cell.
@@ -136,48 +144,48 @@ Three examples of non quasi-manifold objects. Left: A 2D object which is not a q
Due to this additional condition, any objects can not be represented by a generalized map but only quasi-manifolds. We need to study now the inverse relation. Does any set of darts linked together by \f$ \alpha_i\f$'s, with 0\f$ \leq\f$i\f$ \leq\f$d correspond to a quasi-manifold? As we can see in \cgalFigureRef{figpbcarte}, the answer is no.
\cgalFigureBegin{figpbcarte,problems-gmaps.svg}
-Two examples of darts linked together by some \f$ \alpha_0\f$, \f$ \alpha_1\f$, \f$ \alpha_2\f$ and \f$ \alpha_3\f$ which does not represent a 3D quasi-manifold, and thus which are not 3D generalized map. Left: In this example, all the darts are 3-free except \f$ \alpha_3\f$(1)=a (resp. 2-b, 7-g and 8-h, and vice-versa). Right: In this example, darts 1 to 8 and a to h linked by \f$ \alpha_3\f$ are not in the same order in both 3-cells.
+Two examples of darts linked together by some \f$ \alpha_0\f$, \f$ \alpha_1\f$, \f$ \alpha_2\f$ and \f$ \alpha_3\f$ which does not represent a 3D quasi-manifold, and thus which are not 3D generalized map. Left: In this example, all the darts are 3-free except \f$ \alpha_3\f$(1)=a (resp. 2-b, 7-g and 8-h, and vice-versa). Right: In this example, darts \tred{1 to 8 and a to h} linked by \f$ \alpha_3\f$ are not in the same order in both 3-cells.
\cgalFigureEnd
In the first example (Left), there are two 3-cells (one to the left for the cube, a second to the right for the pyramid) which are "partially adjacent" along one 2-cell. Indeed, only four darts of the 2-cell are linked by \f$ \alpha_3\f$. We have \f$ \alpha_3\f$(1)=a (resp. 2-b, 7-g and 8-h, and vice-versa). This configuration is not possible in a quasi-manifold: two d-cells are always glue along an "entire" (d-1)-cells.
But as we can see in the second example (Right), the condition that all the darts of the cell are linked in not sufficient. Indeed, in this example, all the darts of the 2-cell between the cube and the pyramid are linked together by \f$ \alpha_3\f$. However, this configuration does not correspond to a 3D quasi-manifold. Indeed, the operation of gluing two d-cells along one (d-1)-cell must preserve the structure of the initial (d-1)-cell.
-To avoid these two kinds of configurations, conditions are added on \f$ \alpha\f$ pointers compositions (see Section \ref sec_definition "Mathematical Definitions", condition (4) of the definition of generalized maps). Intuitively these conditions say that if two darts are linked by \f$ \alpha_i\f$, then all the required darts are linked by \f$ \alpha_i\f$ two by two in such a way that neighborhood relations are preserved.
+To avoid these two kinds of configurations, conditions are added on \f$ \alpha\f$ pointers compositions (see Section \ref sec_definition_gmap "Mathematical Definitions", condition (4) of the definition of generalized maps). Intuitively these conditions say that if two darts are linked by \f$ \alpha_i\f$, then all the required darts are linked by \f$ \alpha_i\f$ two by two in such a way that neighborhood relations are preserved.
We say that a generalized map is valid if it satisfies all the conditions on \f$ \alpha\f$ pointers and on association between darts and attributes. High level operations provided on generalized maps ensure that these conditions are always satisfied. Sometimes, it can be useful to use low level operations in a specific algorithm, for example to modify locally a generalized map in a really fast way. In such a case, additional operations may be needed to restore these validity conditions.
-\section secsoftwaredesign Software Design
+\section secsoftwaredesign_gmap Software Design
-The diagram in \cgalFigureRef{figdiagram_class} shows the different classes of the package. `Generalized_map` is the main class (see Section \ref ssecgeneralizedmap "Generalized Maps"). It allows to manage darts (see Section \ref ssecdarts "Darts") and attributes (see Section \ref ssecattributes "Cell Attributes"). Users can customize a generalized map thanks to an items class (see Section \ref ssecitem "Generalized Map Items"), which defines the dart type and the attribute types. These types may be different for different dimensions, and they may also be void.
+The diagram in \cgalFigureRef{figdiagram_class_gmap} shows the different classes of the package. `Generalized_map` is the main class (see Section \ref ssecgeneralizedmap "Generalized Maps"). It allows to manage darts (see Section \ref ssecdartsgmap "Darts") and attributes (see Section \ref ssecattributesgmap "Cell Attributes"). Users can customize a generalized map thanks to an items class (see Section \ref ssecitemgmap "Generalized Map Items"), which defines the dart type and the attribute types. These types may be different for different dimensions, and they may also be void.
The darts and attributes are accessed through handles. A handle is a model of the `Handle` concept, thus supporting the two dereference operators `operator*` and `operator->`. All handles are model of `LessThanComparable` and `Hashable`, that is they can be used as keys in containers such as `std::map` and `boost::unordered_map`.
\cgalFigureBegin{figdiagram_class,Diagramme_class.svg}
-UML diagram of the main classes of the package. k is the number of non void attributes. Gray elements come from the \ref ChapterCombinatorialMap "Combinatorial maps package".
+UML diagram of the main classes of the package. k is the number of non void attributes. \tred{Gray element comes from the \ref ChapterCombinatorialMap "Combinatorial maps package".}
\cgalFigureEnd
\subsection ssecgeneralizedmap Generalized Maps
The class `Generalized_map` is a model of the `GeneralizedMap` concept. It has three template parameters standing for the dimension of the generalized map (an `unsigned int`), an items class (a model of the `GeneralizedMapItems` concept), and an allocator which must be a model of the allocator concept of the \stl. %Default classes are provided for the items and the allocator classes.
-The main role of the class `Generalized_map` is the storage and the management of darts. It allows to create or remove an isolated dart from the generalized map. The \link GeneralizedMap::Dart_handle `Dart_handle`\endlink type defines a handle to the type of used darts (given in the items class). `Generalized_map` provides several ranges which allow to iterate over specific subsets of darts of the generalized map (see Section \ref ssecrange "Iterating over Orbits, Cells, and Attributes"). It also defines several methods to link and to unlink darts by \f$ \alpha_i\f$s (see Section \ref sseclinkdarts "Sewing Orbits and Linking Darts"). We said that a dart d0 is i-free if \f$ \alpha_i\f$(d0)=d0. Finally, some high level operations are defined to update the generalized map (see Section \ref ssecoperations "Removal and Insertion Operations")
+The main role of the class `Generalized_map` is the storage and the management of darts. It allows to create or remove an isolated dart from the generalized map. The \link GeneralizedMap::Dart_handle `Dart_handle`\endlink type defines a handle to the type of used darts (given in the items class). `Generalized_map` provides several ranges which allow to iterate over specific subsets of darts of the generalized map (see Section \ref ssecrange "Iterating over Orbits, Cells, and Attributes"). It also defines several methods to link and to unlink darts by \f$ \alpha_i\f$s (see Section \ref sseclinkdarts_gmap "Sewing Orbits and Linking Darts"). We said that a dart d0 is i-free if \f$ \alpha_i\f$(d0)=d0. Finally, some high level operations are defined to update the generalized map (see Section \ref ssecoperationsgmap "Removal and Insertion Operations")
The second role of the class `Generalized_map` is the storage and the management of attributes. It allows to create or remove an attribute, and provides methods to associate attributes and cells. A range is defined for each i-attribute allowing to iterate over all the i-attributes of the generalized map. Finally, `Generalized_map` defines several types allowing to manage the attributes. We can use \link GeneralizedMap::Attribute_handle `Generalized_map::Attribute_handle::type`\endlink for a handle to the i-attributes (and the const version \link GeneralizedMap::Attribute_const_handle `Generalized_map::Attribute_const_handle::type` \endlink) and \link GeneralizedMap::Attribute_type `Generalized_map::Attribute_type::type` \endlink for the type of the i-attributes.
All information associated to darts (\f$ \alpha\f$ links and attributes) can be accessed through member functions in `GeneralizedMap`.
-\subsection ssecitem Generalized Map Items
+\subsection ssecitemgmap Generalized Map Items
-The `GeneralizedMapItems` concept defines dart and attribute types of a generalized map. It contains one inner class named \link GeneralizedMapItems::Dart_wrapper `Dart_wrapper`\endlink, having one template parameter, `GMap`, a model of `GeneralizedMap` concept. The \link GeneralizedMapItems::Dart_wrapper `Dart_wrapper`\endlink class provides two local types: `%Dart` which must be a model of the `::GDart` concept, and `%Attributes` which defines the attributes and their types.
+The \tred{`GeneralizedMapItems`} concept defines dart and attribute types of a generalized map. It contains one inner class named \link GeneralizedMapItems::Dart_wrapper `Dart_wrapper`\endlink, having one template parameter, `GMap`, a model of \tred{`GeneralizedMap`} concept. The \link GeneralizedMapItems::Dart_wrapper `Dart_wrapper`\endlink class provides two local types: `%Dart` which must be a model of the \tred{`::GDart`} concept, and `%Attributes` which defines the attributes and their types.
The `%Attributes` tuple must contain at most d+1 types (one for each possible cell dimension of the generalized map). Each type of the tuple must be either a model of the `CellAttribute` concept or `void`. The first type corresponds to 0-attributes, the second to 1-attributes and so on. If the i th type in the tuple is `void`, (i-1)-attributes are disabled: we say that (i-1)-attributes are void. Otherwise, (i-1)-attributes are enabled and have the given type: we say (i-1)-attributes are non void. If the size of the tuple is k, with k\f$ <\f$dimension+1, \f$ \forall\f$i: k\f$ \leq\f$i\f$ \leq\f$dimension, i-attributes are void.
-The class `Generalized_map_min_items` is a model of the `GeneralizedMapItems` concept which can be used for default behaviors. It defines `GDart` as type of dart, and `Attributes` as empty tuple.
+The class `Generalized_map_min_items` is a model of the `GeneralizedMapItems` concept which can be used for default behaviors. It defines \tred{`GDart`} as type of dart, and `Attributes` as empty tuple.
-\subsection ssecdarts Darts
+\subsection ssecdartsgmap Darts
-The class `GDart`, a model of the `::GDart` concept, defines a dD dart for generalized maps. It has two template parameters standing for the dimension of the generalized map, and a model of the `GeneralizedMap` concept, which provides the two types \link GeneralizedMap::Dart_handle `Dart_handle`\endlink and \link GeneralizedMap::Dart_const_handle `Dart_const_handle`\endlink.
+The class \tred{`GDart`}, a model of the \tred{`::GDart`} concept, defines a dD dart for generalized maps. It has two template parameters standing for the dimension of the generalized map, and a model of the `GeneralizedMap` concept, which provides the two types \link GeneralizedMap::Dart_handle `Dart_handle`\endlink and \link GeneralizedMap::Dart_const_handle `Dart_const_handle`\endlink.
Each instance `d0` of `GDart` stores the \f$ \alpha_i\f$ pointers in an array of d+1 `Dart_handle`. It also stores the attributes associated to this dart in a tuple of \link GeneralizedMap::Attribute_handle `GMap::Attribute_handle::type` \endlink, one for each non void i-attribute.
@@ -185,7 +193,7 @@ Methods are defined allowing to retrieve each \f$ \alpha_i\f$ and each associate
Note that the use of the `GDart` class is not hard wired in the generalized map class. Users can provide their own model of the `::GDart` concept, and pass it to the generalized map with the help of a custom item class.
-\subsection ssecattributes Cell Attributes
+\subsection ssecattributesgmap Cell Attributes
The class `Cell_attribute