replace some $$ by emph in doc for html manual.

This commit is contained in:
Guillaume Damiand 2011-06-26 12:57:30 +00:00
parent 38428ec768
commit a549bd3fb8
1 changed files with 156 additions and 152 deletions

View File

@ -4,28 +4,31 @@
\newcommand{\orb}[1]{\langle{}#1\rangle{}} \newcommand{\orb}[1]{\langle{}#1\rangle{}}
\newcommand{\nulldart}{\texttt{null\_dart\_handle}} \newcommand{\nulldart}{\texttt{null\_dart\_handle}}
\section{Introduction} \newcommand{\cell}[1]{\emph{#1}-cell}
A $d$-dimensional combinatorial map is a data structure representing \newcommand{\cells}[1]{\emph{#1}-cells}
an orientable subdivided $d$-dimensional object obtained by taking
$d$D cells, and allowing to glue $d$D 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 halfedge data
structure to higher dimension.\footnote{A 2D combinatorial map is
equivalent to a halfedge data structure: there is a one-to-one
mapping between elements of both data structures, halfedges
corresponding to darts.}
We denote $i$-cell for an $i$-dimensional cell (for example in 3D, \section{Introduction}
A \emph{d}-dimensional combinatorial map is a data structure
representing an orientable subdivided \emph{d}-dimensional object
obtained by taking \emph{d}D cells, and allowing to glue \emph{d}D
cells along \emph{(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 halfedge data structure to higher
dimension.\footnote{A 2D combinatorial map is equivalent to a halfedge
data structure: there is a one-to-one mapping between elements of
both data structures, halfedges corresponding to darts.}
We denote \cell{i} for an \emph{i}-dimensional cell (for example in 3D,
0-cells are \emph{vertices}, 1-cells are \emph{edges}, 2-cells are 0-cells are \emph{vertices}, 1-cells are \emph{edges}, 2-cells are
\emph{facets}, and 3-cells are \emph{volumes}). A \emph{boundary \emph{facets}, and 3-cells are \emph{volumes}). A \emph{boundary
relation} is defined on these cells, giving for each $i$-cell $c$ relation} is defined on these cells, giving for each \cell{i} $c$
the set of $(i-1)$-cells contained in the boundary of $c$. Two cells the set of \cells{(i-1)} contained in the boundary of $c$. Two cells
$c_1$ and $c_2$ are \emph{incident} if there is a path of cells, $c_1$ and $c_2$ are \emph{incident} if there is a path of cells,
starting from the cell of biggest dimension to the other cell, such 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 that each cell of the path (except the first one) belongs to the
boundary of the previous cell in the path. Two $i$-cells $c$ and $c'$ boundary of the previous cell in the path. Two \cells{i} $c$ and $c'$
are \emph{adjacent} if there is an $(i-1)$-cell incident to both $c$ are \emph{adjacent} if there is an \cell{(i-1)} incident to both $c$
and $c'$. You can see an example of a 2D object and a 3D object in and $c'$. You can see an example of a 2D object and a 3D object in
Figure~\ref{fig-exemple-3Dmanifold} showing some cells of the Figure~\ref{fig-exemple-3Dmanifold} showing some cells of the
subdivision and some adjacency and incidence relations. subdivision and some adjacency and incidence relations.
@ -47,17 +50,17 @@ subdivision and some adjacency and incidence relations.
\end{ccHtmlOnly} \end{ccHtmlOnly}
\caption{Example of subdivided objects that can be described by \caption{Example of subdivided objects that can be described by
combinatorial maps. \textbf{Left}: A 2D object composed of combinatorial maps. \textbf{Left}: A 2D object composed of
three facets ($2$-cells), named $f_1$, $f_2$ and $f_3$, nine three facets (2-cells), named $f_1$, $f_2$ and $f_3$, nine
edges ($1$-cells) and seven vertices ($0$-cells). $f_1$ and edges (1-cells) and seven vertices (0-cells). $f_1$ and
$f_2$ are adjacent along edge $e_1$, thus $e_1$ is incident both $f_2$ are adjacent along edge $e_1$, thus $e_1$ is incident both
to $f_1$ and $f_2$. Vertex $v_1$ is incident to edge $e_1$, thus to $f_1$ and $f_2$. Vertex $v_1$ is incident to edge $e_1$, thus
$v_1$ is incident to $f_1$ and $f_2$ by transitivity. $v_1$ is incident to $f_1$ and $f_2$ by transitivity.
\textbf{Right}: A 3D object (only partially represented for vertices and edges) \textbf{Right}: A 3D object (only partially represented for vertices and edges)
composed of three volumes ($3$-cells), named $vol_1$, $vol_2$ composed of three volumes (3-cells), named $vol_1$, $vol_2$
and $vol_3$, twelve facets ($2$-cells) (there is one facet and $vol_3$, twelve facets (2-cells) (there is one facet
$f_4$ between $vol_1$ and $vol_2$, and similarly between $vol_1$ $f_4$ between $vol_1$ and $vol_2$, and similarly between $vol_1$
and $vol_3$ and $vol_2$ and $vol_3$), sixteen edges ($1$-cells), and $vol_3$ and $vol_2$ and $vol_3$), sixteen edges (1-cells),
and eight vertices ($0$-cells). $vol_1$ and $vol_2$ are adjacent and eight vertices (0-cells). $vol_1$ and $vol_2$ are adjacent
along facet $f_4$, thus $f_4$ is incident both to $vol_1$ and along facet $f_4$, thus $f_4$ is incident both to $vol_1$ and
$vol_2$. Edge $e_4$ is incident to the three facets between $vol_2$. Edge $e_4$ is incident to the three facets between
$vol_1$ and $vol_2$, $vol_1$ and $vol_3$, and $vol_2$ and $vol_1$ and $vol_2$, $vol_1$ and $vol_3$, and $vol_2$ and
@ -71,7 +74,7 @@ cells and the incidence and adjacency relations, using only one basic
element called \emph{dart}, and a set of \emph{pointers} between these element called \emph{dart}, and a set of \emph{pointers} between these
darts. A dart can be thought as a part of an oriented edge (1-cell), darts. A dart can be thought as a part of an oriented edge (1-cell),
together with a part of incident cells of dimensions 0, 2, 3,\ldots, together with a part of incident cells of dimensions 0, 2, 3,\ldots,
$d$. When a dart $d_0$ describe a part of an $i$-cell $c$, we say that \emph{d}. When a dart $d_0$ describe a part of an \cell{i} $c$, we say that
$d_0$ \emph{belongs} to $c$, and that $c$ \emph{contains} $d_0$. Let $d_0$ \emph{belongs} to $c$, and that $c$ \emph{contains} $d_0$. Let
us look at the example in Figure~\ref{fig-exemple-combi-maps} showing us look at the example in Figure~\ref{fig-exemple-combi-maps} showing
the 2D and 3D combinatorial maps describing the two objects given in the 2D and 3D combinatorial maps describing the two objects given in
@ -105,7 +108,7 @@ First let us start in 2D (Figure~\ref{fig-exemple-combi-maps} (Left)).
Facet $f_1$ is described by four darts. These darts are linked Facet $f_1$ is described by four darts. These darts are linked
together with pointers. Starting from a dart and following a $\beta_1$ together with pointers. Starting from a dart and following a $\beta_1$
pointer, we get to a dart which belongs to the same facet but to the pointer, we get to a dart which belongs to the same facet but to the
next edge (1-cell, which explains the index~$1$ of~$\beta_1$). next edge (1-cell, which explains the index~1 of~$\beta_1$).
Starting from any dart and following $\beta_1$ pointers, we can reach Starting from any dart and following $\beta_1$ pointers, we can reach
exactly all the darts describing the facet. Starting from a dart and exactly all the darts describing the facet. Starting from a dart and
following a $\beta_2$ pointer, we get to a dart which belongs to the following a $\beta_2$ pointer, we get to a dart which belongs to the
@ -115,8 +118,8 @@ $\beta_2$ pointers, we can reach exactly all the darts describing the
edge (in 2D one or two darts). edge (in 2D one or two darts).
Things are slightly different for vertices. Indeed, each $\beta_i$ Things are slightly different for vertices. Indeed, each $\beta_i$
points to a dart belonging to a different $i$-cell, but also to a points to a dart belonging to a different \cell{i}, but also to a
different $0$-cell (vertex). This is so because two linked darts have different 0-cell (vertex). This is so because two linked darts have
opposite orientations. For this reason, starting from any dart opposite orientations. For this reason, starting from any dart
belonging to a vertex $v$, we have to follow $\beta_2$ then $\beta_1$ belonging to a vertex $v$, we have to follow $\beta_2$ then $\beta_1$
to reach exactly the darts describing the vertex $v$. In fact, by to reach exactly the darts describing the vertex $v$. In fact, by
@ -135,7 +138,7 @@ Figure~\ref{fig-intuitive-exemple} (Left), we can see that it is
described by six darts linked together. Starting from a dart and described by six darts linked together. Starting from a dart and
following a $\beta_3$ pointer, we get to a dart which belongs to the following a $\beta_3$ pointer, we get to a dart which belongs to the
same edge, to the same facet, but to the neighboring volume (a 3-cell, same edge, to the same facet, but to the neighboring volume (a 3-cell,
which explains the index $3$ in $\beta_3$). Similarly, starting from which explains the index 3 in $\beta_3$). Similarly, starting from
a dart and following a $\beta_2$ pointer, we get to a dart which a dart and following a $\beta_2$ pointer, we get to a dart which
belongs to the same edge, to the same volume, but to the neighboring belongs to the same edge, to the same volume, but to the neighboring
facet (2-cell). Starting from any of these six darts and following facet (2-cell). Starting from any of these six darts and following
@ -178,7 +181,7 @@ describing edge $e_4$.
% rather than an edge (see Figure~\ref{fig-intuitive-exemple} (Right)). % rather than an edge (see Figure~\ref{fig-intuitive-exemple} (Right)).
For facets, by following a $\beta_1$ pointer, we get to a dart which For facets, by following a $\beta_1$ pointer, we get to a dart which
belongs to the same facet, to the same volume, but to the next edge belongs to the same facet, to the same volume, but to the next edge
(1-cell, which explains the index~$1$ of~$\beta_1$). Starting from any (1-cell, which explains the index~1 of~$\beta_1$). Starting from any
dart and following $\beta_1$ and $\beta_3$ pointers, we can reach dart and following $\beta_1$ and $\beta_3$ pointers, we can reach
exactly all the darts describing the facet (see exactly all the darts describing the facet (see
Figure~\ref{fig-intuitive-exemple} (Right)). Figure~\ref{fig-intuitive-exemple} (Right)).
@ -188,11 +191,11 @@ $\beta_2$ pointers, we can reach exactly all the darts describing the
volume. volume.
% Things are slightly different for vertices. Indeed, each $\beta_i$ % Things are slightly different for vertices. Indeed, each $\beta_i$
% points to a dart belonging to a different $i$-cell, but also to a % points to a dart belonging to a different \cell{i}, but also to a
% different $0$-cell (vertex). % different 0-cell (vertex).
% In the above paragraphs, % In the above paragraphs,
% we explained that when following a $\beta_i$ pointer we change the % we explained that when following a $\beta_i$ pointer we change the
% $i$-cell. We have not mentioned that this also changes the 0-cell % \cell{i}. We have not mentioned that this also changes the 0-cell
% (vertex). % (vertex).
% This is so because two linked darts have opposite orientations. For % This is so because two linked darts have opposite orientations. For
% this reason, starting from any dart belonging to a vertex $v$, we have % this reason, starting from any dart belonging to a vertex $v$, we have
@ -202,7 +205,7 @@ vertex $v$. Indeed, as in 2D, we have to compose two $\beta_i$s to
obtain a dart belonging to the same vertex. obtain a dart belonging to the same vertex.
In some cases, the general rule that by following a $\beta_i$ we get a In some cases, the general rule that by following a $\beta_i$ we get a
dart which belongs to the neighboring $i$-cell is not true, as for example dart which belongs to the neighboring \cell{i} is not true, as for example
for darts belonging to the boundary of the represented for darts belonging to the boundary of the represented
object. For example, in Figure~\ref{fig-exemple-3Dmanifold} (Left), any dart object. For example, in Figure~\ref{fig-exemple-3Dmanifold} (Left), any dart
$d_0$ that does not belong to edge $e_1$, $e_2$ and $e_3$ $d_0$ that does not belong to edge $e_1$, $e_2$ and $e_3$
@ -226,16 +229,16 @@ a facet in Figure~\ref{fig-exemple-combi-maps} (Right), we obtain an
unbounded volume having some darts without neighboring facet for unbounded volume having some darts without neighboring facet for
$\beta_2$. In such a case, there is a particular value called $\beta_2$. In such a case, there is a particular value called
$\varnothing$ used to describe that a dart $d_0$ is not linked to $\varnothing$ used to describe that a dart $d_0$ is not linked to
another dart in dimension~$i$. another dart in dimension~\emph{i}.
% No it is false (case when c_i=c'_i) and we exchange also c_0... % No it is false (case when c_i=c'_i) and we exchange also c_0...
% A dart $a$ corresponds to a tuple of cells: % A dart $a$ corresponds to a tuple of cells:
% $(c_0,\ldots,c_d)$, all incident, each $c_i$ being an % $(c_0,\ldots,c_d)$, all incident, each $c_i$ being an
% $i$-cell. Given a dart $a$ corresponding to % \cell{i}. Given a dart $a$ corresponding to
% $(c_0\ldots,c_{i-1},c_i,c_{i+1},\ldots,c_d)$, $\beta_i(a)$ gives the % $(c_0\ldots,c_{i-1},c_i,c_{i+1},\ldots,c_d)$, $\beta_i(a)$ gives the
% dart $a'$ corresponding to % dart $a'$ corresponding to
% $(c_0\ldots,c_{i-1},c'_i,c_{i+1},\ldots,c_d)$ with $c'_i$ the only % $(c_0\ldots,c_{i-1},c'_i,c_{i+1},\ldots,c_d)$ with $c'_i$ the only
% $i$-cell different from $c_i$ incident both to $c_{i-1}$ and % \cell{i} different from $c_i$ incident both to $c_{i-1}$ and
% $c_{i+1}$, or NULL if such a cell does not exist. % $c_{i+1}$, or NULL if such a cell does not exist.
Combinatorial maps are defined in any dimension. A 0D combinatorial Combinatorial maps are defined in any dimension. A 0D combinatorial
@ -250,7 +253,7 @@ that one main interest of combinatorial maps is their generic
definition in any dimension, and that everything presented in this definition in any dimension, and that everything presented in this
manual is valid in any dimension. manual is valid in any dimension.
A $d$D combinatorial map is useful when you want to describe $d$D A \emph{d}D combinatorial map is useful when you want to describe \emph{d}D
objects and the adjacency relations between these objects, and you objects and the adjacency relations between these objects, and you
want to be able to efficiency traverse these objects by using the want to be able to efficiency traverse these objects by using the
different relations. For example, we can use a 3D combinatorial map different relations. For example, we can use a 3D combinatorial map
@ -285,20 +288,20 @@ doors.
% attributes, and it provides a mechanism to merge or split attributes % attributes, and it provides a mechanism to merge or split attributes
% when cells are merged or split. Attributes may exist for only some of % when cells are merged or split. Attributes may exist for only some of
% the dimensions, and if they exist for dimension $i$, they do not % the dimensions, and if they exist for dimension $i$, they do not
% necessarily exist for each of the $i$-cells. % necessarily exist for each of the \cells{i}.
\section{Data Structure Presentation}\label{sec_presentation} \section{Data Structure Presentation}\label{sec_presentation}
In this section, we describe $d$D combinatorial maps in terms of data In this section, we describe \emph{d}D combinatorial maps in terms of data
structure and operations. Mathematical definitions are provided in structure and operations. Mathematical definitions are provided in
Section~\ref{sec_definition}, and a package description is given in Section~\ref{sec_definition}, and a package description is given in
Section~\ref{sec-software-design}. Section~\ref{sec-software-design}.
\subsection{Combinatorial Map and Darts}\label{ssec-combi-map-and-darts} \subsection{Combinatorial Map and Darts}\label{ssec-combi-map-and-darts}
A $d$D combinatorial map is a set of darts $D$. A dart $d_0$ is an A \emph{d}D combinatorial map is a set of darts $D$. A dart $d_0$ is an
element that can be \emph{linked} with $d+1$ darts by pointers called element that can be \emph{linked} with $d+1$ darts by pointers called
$\mb{i}$, with $0 \leq i \leq d$. Dart $d_0$ is said \emph{$i$-free} $\mb{i}$, with $0 \leq i \leq d$. Dart $d_0$ is said \emph{i-free}
when $\mb{i}(d_0)=\varnothing$. Each $\mb{i}$, for $2 \leq i \leq d$, when $\mb{i}(d_0)=\varnothing$. Each $\mb{i}$, for $2 \leq i \leq d$,
is its own inverse, i.e., if dart $d_0$ is not $i$-free, then is its own inverse, i.e., if dart $d_0$ is not \emph{i}-free, then
$\mb{i}(\mb{i}(d_0))=d_0$. This is different for $\mb{0}$ and $\mb{i}(\mb{i}(d_0))=d_0$. This is different for $\mb{0}$ and
$\mb{1}$: $\mb{0}$ is the inverse of $\mb{1}$, i.e., if darts $d_1$ $\mb{1}$: $\mb{0}$ is the inverse of $\mb{1}$, i.e., if darts $d_1$
and $d_2$ are such that $\mb{1}(d_1)=d_2$, then and $d_2$ are such that $\mb{1}(d_1)=d_2$, then
@ -323,9 +326,9 @@ $\mb{i}(\varnothing)=\varnothing$.
% (even if in practice this % (even if in practice this
% one-to-one mapping is often explicitly encoded for complexity reasons). % one-to-one mapping is often explicitly encoded for complexity reasons).
A combinatorial map is \emph{without $i$-boundary} if there is no A combinatorial map is \emph{without i-boundary} if there is no
$i$-free dart, and it is \emph{without boundary} if it is without \emph{i}-free dart, and it is \emph{without boundary} if it is without
$i$-boundary for all dimensions $1 \leq i \leq d$. \emph{i}-boundary for all dimensions $1 \leq i \leq d$.
We show in Figure~\ref{fig-exemple-carte3d} a 3D object and the We show in Figure~\ref{fig-exemple-carte3d} a 3D object and the
@ -365,10 +368,10 @@ for example $\beta_3(10)=\varnothing$ and $\beta_3(12)=\varnothing$.
\end{figure} \end{figure}
\subsection{Cells as Sets of Darts}\label{ssec-cells-in-map} \subsection{Cells as Sets of Darts}\label{ssec-cells-in-map}
A cell in a $d$D combinatorial map is implicitly represented by a A cell in a \emph{d}D combinatorial map is implicitly represented by a
subset of darts. subset of darts.
% When a dart $d_0$ is an element of the set of darts of % When a dart $d_0$ is an element of the set of darts of
% an $i$-cell $c$, we say that $d_0$ \emph{belongs} to $c$, and that $c$ % an \cell{i} $c$, we say that $d_0$ \emph{belongs} to $c$, and that $c$
% \emph{contains} $d_0$. % \emph{contains} $d_0$.
In this section, we will see how to retrieve all cells containing a 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, how to retrieve all darts belonging to a cell containing a
@ -376,7 +379,7 @@ given dart, and how incidence and adjacency relations are defined in
terms of darts. terms of darts.
The first important property of a combinatorial map is that The first important property of a combinatorial map is that
each dart belongs to an $i$-cell, $\forall i$, $0 \leq i \leq d$. each dart belongs to an \cell{i}, $\forall i$, $0 \leq i \leq d$.
For example in 3D, a dart belongs to a vertex, an edge, a facet, and a For example in 3D, a dart belongs to a vertex, an edge, a facet, and a
volume. This means that a 3D combinatorial map containing an isolated volume. This means that a 3D combinatorial map containing an isolated
dart contains exactly one vertex, one edge, one facet and one volume. dart contains exactly one vertex, one edge, one facet and one volume.
@ -395,19 +398,19 @@ $\orb{\beta_1,\beta_4}(d_0)$ to denote $\orb{S}(d_0)$ with
$S=\{\beta_1,\beta_4\}$). $S=\{\beta_1,\beta_4\}$).
Given a dart $d_0$, in general, $\mb{i}(d_0)$ (with $1\leq i \leq d$) Given a dart $d_0$, in general, $\mb{i}(d_0)$ (with $1\leq i \leq d$)
belongs to the same cells as $d_0$, only the $i$-cell and $0$-cell are belongs to the same cells as $d_0$, only the \cell{i} and 0-cell are
different. There are two exceptions: (1)~if $d_0$ is $i$-free, then different. There are two exceptions: (1)~if $d_0$ is \emph{i}-free, then
$\mb{i}(d_0)=\varnothing$; (2)~if $\mb{i}(d_0)$ belongs to the same $i$-cell $\mb{i}(d_0)=\varnothing$; (2)~if $\mb{i}(d_0)$ belongs to the same \cell{i}
as $d_0$ (case of multi-incidence). For example if an edge is an isolated as $d_0$ (case of multi-incidence). For example if an edge is an isolated
loop, it is incident twice to the same vertex, then given a dart $d_0$ loop, it is incident twice to the same vertex, then given a dart $d_0$
belonging to this edge, $\mb{1}(d_0)$ goes to the next edge, which is in belonging to this edge, $\mb{1}(d_0)$ goes to the next edge, which is in
fact the same edge. fact the same edge.
Since $\mb{i}(d_0)$ (with $1\leq i \leq d$) allows to change the Since $\mb{i}(d_0)$ (with $1\leq i \leq d$) allows to change the
current $i$-cell, all the darts that can be reached from $d_0$ by current \cell{i}, all the darts that can be reached from $d_0$ by
using any combination of $\mb{j}$'s, $\forall j$, $1 \leq j \leq d$ and using any combination of $\mb{j}$'s, $\forall j$, $1 \leq j \leq d$ and
$j\neq i$ and their inverse are contained in the same $i$-cell as $j\neq i$ and their inverse are contained in the same \cell{i} as
$d_0$. The $i$-cell containing $d_0$ is defined in terms of orbit by $d_0$. The \cell{i} containing $d_0$ is defined in terms of orbit by
$\orb{\beta_1,\ldots,\beta_{i-1},\beta_{i+1},\ldots,\beta_d}(d_0)$. $\orb{\beta_1,\ldots,\beta_{i-1},\beta_{i+1},\ldots,\beta_d}(d_0)$.
% since $\mb{0}$ is not a relation % since $\mb{0}$ is not a relation
@ -416,7 +419,7 @@ $\orb{\beta_1,\ldots,\beta_{i-1},\beta_{i+1},\ldots,\beta_d}(d_0)$.
There is a special case for vertices. Given a dart $d_0$, the set of There is a special case for vertices. Given a dart $d_0$, the set of
darts contained in the same vertex as $d_0$ are the darts that can be darts contained in the same vertex as $d_0$ are the darts that can be
reached from $d_0$ by using any combination of $\mb{i}\circ\mb{j}$, reached from $d_0$ by using any combination of $\mb{i}\circ\mb{j}$,
$\forall i,j$, $1 \leq i< j \leq d$, and their inverse. The $0$-cell $\forall i,j$, $1 \leq i< j \leq d$, and their inverse. The 0-cell
containing $d_0$ is defined in terms of orbit by containing $d_0$ is defined in terms of orbit by
$\orb{\{\mb{i}\circ\mb{j}|\forall i,j: 1\leq i<j \leq d\}}(d_0)$. $\orb{\{\mb{i}\circ\mb{j}|\forall i,j: 1\leq i<j \leq d\}}(d_0)$.
@ -433,15 +436,15 @@ of the combinatorial map.
%AF: Je ne trouve pas ques les \forall s'integrent bien dans une phrase %AF: Je ne trouve pas ques les \forall s'integrent bien dans une phrase
% et je preferais ceci: % et je preferais ceci:
% A last important property of cells, is that for all dimensions $i$ % A last important property of cells, is that for all dimensions $i$
% the set of $i$-cells form a partition of the set of darts $D$, i.e. % the set of \cells{i} form a partition of the set of darts $D$, i.e.
% %
% Je le dis ici a titre d'exemple, c'est a dire je recommende % Je le dis ici a titre d'exemple, c'est a dire je recommende
% que tu fasse un passe pour obtenir plus de ``phrases sans $..$'' % que tu fasse un passe pour obtenir plus de ``phrases sans $..$''
A last important property of cells is that for all dimensions $i$ the A last important property of cells is that for all dimensions \emph{i} the
set of $i$-cells forms a partition of the set of darts $D$, i.e. for set of \cells{i} forms a partition of the set of darts $D$, i.e. for
any $i$, the union of the sets of darts of all the $i$-cells is equal any \emph{i}, the union of the sets of darts of all the \cells{i} is equal
to $D$, and the sets of darts of two different $i$-cells are disjoint. to \emph{D}, and the sets of darts of two different \cells{i} are disjoint.
Let us give some examples of cells in 3D, for the 3D combinatorial map Let us give some examples of cells in 3D, for the 3D combinatorial map
of Figure~\ref{fig-exemple-carte3d}: of Figure~\ref{fig-exemple-carte3d}:
@ -473,7 +476,7 @@ of Figure~\ref{fig-exemple-carte3d}:
$\mb{1}\circ\mb{3}$ and $\mb{2}\circ\mb{3}$ and their inverse $\mb{1}\circ\mb{3}$ and $\mb{2}\circ\mb{3}$ and their inverse
functions. In our example, vertex $v$ of the object corresponds functions. In our example, vertex $v$ of the object corresponds
in the combinatorial map to the set of darts $\{1,6,9,11,14,15\}$. in the combinatorial map to the set of darts $\{1,6,9,11,14,15\}$.
Starting from dart $1$, we obtain for example dart Starting from dart 1, we obtain for example dart
$14=(\mb{1}\circ\mb{2})^{-1}(1)=\mb{2}\circ\mb{0}(1)$, dart $14=(\mb{1}\circ\mb{2})^{-1}(1)=\mb{2}\circ\mb{0}(1)$, dart
$11=\mb{1}\circ\mb{2}(1)$, and dart $9=\mb{2}\circ\mb{3}(1)$. $11=\mb{1}\circ\mb{2}(1)$, and dart $9=\mb{2}\circ\mb{3}(1)$.
Intuitively, the set of darts corresponding to a vertex contains all Intuitively, the set of darts corresponding to a vertex contains all
@ -486,8 +489,8 @@ Using this definition of cells as sets of darts, we can retrieve all the
incidence and adjacency relations between the cells of the subdivision incidence and adjacency relations between the cells of the subdivision
in a combinatorial map. Two cells are \emph{incident} if the in a combinatorial map. Two cells are \emph{incident} if the
intersection of their two sets of darts is non empty (whatever the intersection of their two sets of darts is non empty (whatever the
dimension of the two cells). Two $i$-cells, $1\leq i \leq d$, are dimension of the two cells). Two \cells{i}, $1\leq i \leq d$, are
\emph{adjacent} if there is an $(i-1)$-cell incident to both cells. \emph{adjacent} if there is an \cell{(i-1)} incident to both cells.
In the example of Figure~\ref{fig-exemple-carte3d}, vertex $v$ and In the example of Figure~\ref{fig-exemple-carte3d}, vertex $v$ and
edge $e$ are incident since the intersection of the two corresponding edge $e$ are incident since the intersection of the two corresponding
@ -498,22 +501,22 @@ since the intersection of the two corresponding sets of darts is
$\{10\}\neq \emptyset$. Finally, facets $f_1$ and $f_2$ are adjacent $\{10\}\neq \emptyset$. Finally, facets $f_1$ and $f_2$ are adjacent
since edge $e$ is incident to both facets. since edge $e$ is incident to both facets.
We can consider $i$-cells in a dimension $d'$ with $i \leq d' \leq We can consider \cells{i} in a dimension $d'$ with $i \leq d' \leq
d$. The idea is to consider the $i$-cells as if the combinatorial map d$. The idea is to consider the \cells{i} as if the combinatorial map
was in $d'$ dimension. For that, we only take into account the was in $d'$ dimension. For that, we only take into account the
$\beta_j$s for $j \leq d'$. The $i$-cell containing $d_0$ in dimension $\beta_j$s for $j \leq d'$. The \cell{i} containing $d_0$ in dimension
$d'$ is the orbit $d'$ is the orbit
$\orb{\beta_1,\ldots,\beta_{i-1},\beta_{i+1},\ldots,\beta_{d'}}(d_0)$, and $\orb{\beta_1,\ldots,\beta_{i-1},\beta_{i+1},\ldots,\beta_{d'}}(d_0)$, and
the 0-cell is the orbit $\orb{\{\mb{i}\circ\mb{j}|\forall i,j: 2\leq the 0-cell is the orbit $\orb{\{\mb{i}\circ\mb{j}|\forall i,j: 2\leq
i<j \leq d'\}}(d_0)$. By default, $i$-cells are considered in i<j \leq d'\}}(d_0)$. By default, \cells{i} are considered in
dimension $d$, the dimension of the combinatorial map. dimension $d$, the dimension of the combinatorial map.
In the example of Figure~\ref{fig-exemple-carte3d}, the 2-cell In the example of Figure~\ref{fig-exemple-carte3d}, the 2-cell
containing dart $1$ is facet $f_2$ which is the set of darts containing dart 1 is facet $f_2$ which is the set of darts
$\{1,2,3,4,5,6,7,8\}$. If we consider the same 2-cell in dimension~2, $\{1,2,3,4,5,6,7,8\}$. If we consider the same 2-cell in dimension~2,
we obtain the set of darts $\{1,2,3,4\}$. Intuitively we ``forget'' we obtain the set of darts $\{1,2,3,4\}$. Intuitively we ``forget''
$\beta_3$ and we obtain the set of darts of the facet containing dart $\beta_3$ and we obtain the set of darts of the facet containing dart
$1$ restricted to the volume containing this dart. 1 restricted to the volume containing this dart.
\subsection{How to Associate Information to Cells} \subsection{How to Associate Information to Cells}
\label{ssec-associate-attributes} \label{ssec-associate-attributes}
@ -527,22 +530,22 @@ associated to edges, or a color or normal to a facet.
To answer this need, a combinatorial map allows to create To answer this need, a combinatorial map allows to create
\emph{attributes} which are able to store any information, and to \emph{attributes} which are able to store any information, and to
associate attributes to cells of the combinatorial map. We denote associate attributes to cells of the combinatorial map. We denote
$i$-attributes for the attributes associated with \emph{i}-attributes for the attributes associated with
$i$-cells. Attributes may exist for only some of the dimensions, and \cells{i}. Attributes may exist for only some of the dimensions, and
if they exist for dimension $i$, they do not necessarily exist for if they exist for dimension \emph{i}, they do not necessarily exist for
each of the $i$-cells. More precisely, $i$-attributes are associated each of the \cells{i}. More precisely, \emph{i}-attributes are associated
to $i$-cells by an injection: to \cells{i} by an injection:
\begin{itemize} \begin{itemize}
\item two different $i$-cells are associated to two different \item two different \cells{i} are associated to two different
$i$-attributes; \emph{i}-attributes;
\item an $i$-cell may have no associated $i$-attribute. \item an \cell{i} may have no associated \emph{i}-attribute.
\end{itemize} \end{itemize}
Since $i$-cells are not explicitely represented in combinatorial maps, Since \cells{i} are not explicitely represented in combinatorial maps,
the association between $i$-cells and $i$-attributes is transferred to the association between \cells{i} and \emph{i}-attributes is transferred to
darts: if attribute $a$ is associated to $i$-cell $c$, all the darts darts: if attribute $a$ is associated to \cell{i} $c$, all the darts
belonging to $c$ are associated to $a$. belonging to $c$ are associated to $a$.
% dart $d_0$ is associated to attribute $a$ when the $i$-cell % dart $d_0$ is associated to attribute $a$ when the \cell{i}
% containing $d_0$ is associated to $a$. % containing $d_0$ is associated to $a$.
% The combinatorial map provides methods to enumerate the attributes, % The combinatorial map provides methods to enumerate the attributes,
@ -593,9 +596,9 @@ between darts and attributes (see
Section~\ref{ssec-associate-attributes}). Section~\ref{ssec-associate-attributes}).
There is an additional condition related to the type of represented There is an additional condition related to the type of represented
objects, which are \emph{quasi-manifold} orientable $d$D objects. A objects, which are \emph{quasi-manifold} orientable \emph{d}D objects. A
$d$D quasi-manifold is an object obtained by taking some isolated \emph{d}D quasi-manifold is an object obtained by taking some isolated
$d$-cells, and allowing to glue $d$-cells along $(d-1)$-cells. It is \cells{d}, and allowing to glue \cells{d} along \cells{(d-1)}. It is
orientable if it is possible to embed it in the Euclidean space and to orientable if it is possible to embed it in the Euclidean space and to
define a global ``left'' and ``right'' direction in each point of the define a global ``left'' and ``right'' direction in each point of the
embedded object. In 2D, quasi-manifolds are manifolds, but this is no embedded object. In 2D, quasi-manifolds are manifolds, but this is no
@ -631,12 +634,12 @@ object is not homeomorphic\footnote{Intuitively, two objects are
Combinatorial maps can only represent quasi-manifolds due to the Combinatorial maps can only represent quasi-manifolds due to the
definition of $\beta$ pointers. As we have seen in definition of $\beta$ pointers. As we have seen in
Section~\ref{ssec-cells-in-map}, $\mb{i}(d_0)$ (with $1\leq i \leq d$) Section~\ref{ssec-cells-in-map}, $\mb{i}(d_0)$ (with $1\leq i \leq d$)
belongs to the same cells as $d_0$, only the $i$-cell and $0$-cell are belongs to the same cells as $d_0$, only the \cell{i} and 0-cell are
different. In other words, $\mb{i}$ links two $i$-cells that different. In other words, $\mb{i}$ links two \cells{i} that
share a common $(i-1)$-cell: it is not possible to link more than two share a common \cell{(i-1)}: it is not possible to link more than two
$i$-cells along a same $(i-1)$-cell. \cells{i} along a same \cell{(i-1)}.
% %
% If we want to put in relation two $i$-cells that share % If we want to put in relation two \cells{i} that share
% a common $(i-2)$-cell (for example in 3D two 3-cells shazing an edge % a common $(i-2)$-cell (for example in 3D two 3-cells shazing an edge
% as in Figure~\ref{fig-nonquasi-manifold} (Right)), we need to add % as in Figure~\ref{fig-nonquasi-manifold} (Right)), we need to add
% another pointer because this relation must be distinguished from the % another pointer because this relation must be distinguished from the
@ -720,16 +723,16 @@ for the cube, a second to the right for the pyramid) which are
``partially adjacent'' along one 2-cell. Indeed, only two darts ``partially adjacent'' along one 2-cell. Indeed, only two darts
of the 2-cell are linked by $\beta_3$. We have $\beta_3(1)=5$ and of the 2-cell are linked by $\beta_3$. We have $\beta_3(1)=5$ and
$\beta_3(4)=6$ (and reciprocally). This configuration is not possible $\beta_3(4)=6$ (and reciprocally). This configuration is not possible
in a quasi-manifold: two $d$-cells are always glue along an ``entire'' in a quasi-manifold: two \cells{d} are always glue along an ``entire''
$(d-1)$-cells. \cells{(d-1)}.
But as we can see in the second example (Right), the condition that 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 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 this example, all the darts of the 2-cell between the cube and the
pyramid are linked together by $\beta_3$. However, this configuration pyramid are linked together by $\beta_3$. However, this configuration
does not correspond to an orientable 3D quasi-manifold. Indeed, the does not correspond to an orientable 3D quasi-manifold. Indeed, the
operation of gluing two $d$-cells along one $(d-1)$-cell must operation of gluing two \cells{d} along one \cell{(d-1)} must
preserve the initial $(d-1)$-cell. preserve the initial \cell{(d-1)}.
To avoid these two kinds of configurations, conditions are added on To avoid these two kinds of configurations, conditions are added on
$\beta$ pointers compositions (see Section~\ref{sec_definition}, $\beta$ pointers compositions (see Section~\ref{sec_definition},
@ -778,8 +781,8 @@ validity conditions.
% disjoint. These cycles and paths describe the 2D facets. % disjoint. These cycles and paths describe the 2D facets.
% The second condition ensures that given $i$, $2\leq i\leq d$, and a non % The second condition ensures that given $i$, $2\leq i\leq d$, and a non
% $i$-free dart $d_0$, there is at most one $i$-cell adjacent to the % $i$-free dart $d_0$, there is at most one \cell{i} adjacent to the
% $i$-cell containing $d_0$. (For example in 3D, given a facet incident to % \cell{i} containing $d_0$. (For example in 3D, given a facet incident to
% an edge and a volume, there is at most one other facet incident to the % an edge and a volume, there is at most one other facet incident to the
% same edge and the same volume. In Figure~\ref{fig-exemple-carte3d}, we % same edge and the same volume. In Figure~\ref{fig-exemple-carte3d}, we
% have for example $\beta_2(1)=10$ and thus $\beta_2(10)=1$). % have for example $\beta_2(1)=10$ and thus $\beta_2(10)=1$).
@ -801,11 +804,11 @@ validity conditions.
% attributes. % attributes.
% When an $i$-attribute is not void, the following two % When an $i$-attribute is not void, the following two
% additional conditions have to be satisfied in order to have a correct % additional conditions have to be satisfied in order to have a correct
% association between $i$-cells and $i$-attributes: % association between \cells{i} and $i$-attributes:
% \begin{description} % \begin{description}
% \item[V4] all the darts belonging to the same $i$-cell are associated to % \item[V4] all the darts belonging to the same \cell{i} are associated to
% the same $i$-attribute; % the same $i$-attribute;
% \item[V5] two darts belonging to two different $i$-cells are associated % \item[V5] two darts belonging to two different \cells{i} are associated
% to two distinct $i$-attributes. % to two distinct $i$-attributes.
% \end{description} % \end{description}
% Thus, a combinatorial map with attribute is valid if it satisfies % Thus, a combinatorial map with attribute is valid if it satisfies
@ -820,7 +823,7 @@ validity conditions.
% attributes (two different cells are always associated to two different % attributes (two different cells are always associated to two different
% attributes but possibly with the same information, and moreover this % attributes but possibly with the same information, and moreover this
% information can be shared by several attributes by adding an % information can be shared by several attributes by adding an
% indirection). Note also that it is not required that each $i$-cell is % indirection). Note also that it is not required that each \cell{i} is
% associated with an $i$-attribute. % associated with an $i$-attribute.
\section{Software Design}\label{sec-software-design} \section{Software Design}\label{sec-software-design}
@ -885,7 +888,7 @@ handle to the type of used darts (given in the items class).
iterate over specific subsets of darts of the combinatorial map (see iterate over specific subsets of darts of the combinatorial map (see
Section~\ref{ssec-range}). It also defines several methods to link Section~\ref{ssec-range}). It also defines several methods to link
and to unlink darts by $\beta_i$s (see and to unlink darts by $\beta_i$s (see
Section~\ref{ssec-link-darts}). We said that a dart $d_0$ is $i$-free Section~\ref{ssec-link-darts}). We said that a dart $d_0$ is \emph{i}-free
if $\mb{i}(d_0)=\varnothing$. The $\varnothing$ constant is if $\mb{i}(d_0)=\varnothing$. The $\varnothing$ constant is
represented in the class \ccc{Combinatorial_map} through a represented in the class \ccc{Combinatorial_map} through a
\ccc{static const Dart_handle} \ccc{static const Dart_handle}
@ -905,15 +908,15 @@ Section~\ref{ssec-operations})
The second role of the class \ccc{Combinatorial_map} is the storage The second role of the class \ccc{Combinatorial_map} is the storage
and the management of attributes. It allows to create or remove an and the management of attributes. It allows to create or remove an
attribute, and provides methods to associate attributes and cells. attribute, and provides methods to associate attributes and cells.
A range is defined for each $i$-attribute allowing to iterate A range is defined for each \emph{i}-attribute allowing to iterate
over all the $i$-attributes of the combinatorial map. Finally, over all the \emph{i}-attributes of the combinatorial map. Finally,
\ccc{Combinatorial_map} defines several types allowing to manage the \ccc{Combinatorial_map} defines several types allowing to manage the
attributes. We can use attributes. We can use
\ccc{Combinatorial_map::Attribute_handle<i>::type} for a handle to the \ccc{Combinatorial_map::Attribute_handle<i>::type} for a handle to the
$i$-attributes (and the const version \emph{i}-attributes (and the const version
\ccc{Combinatorial_map::Attribute_const_handle<i>::type}) and \ccc{Combinatorial_map::Attribute_const_handle<i>::type}) and
\ccc{Combinatorial_map::Attribute_type<i>::type} for the type of the \ccc{Combinatorial_map::Attribute_type<i>::type} for the type of the
$i$-attributes. \emph{i}-attributes.
\subsection{Combinatorial Map Items}\label{ssec-item} \subsection{Combinatorial Map Items}\label{ssec-item}
@ -925,16 +928,16 @@ provides two local types: \ccc{Dart} which must be a model of the
\ccc{Dart} concept, and \ccc{Attributes} which defines the attributes \ccc{Dart} concept, and \ccc{Attributes} which defines the attributes
and their types. and their types.
The \ccc{Attributes} tuple must contain at most $d+1$ types (one for The \ccc{Attributes} tuple must contain at most \emph{d+1} types (one for
each possible cell dimension of the combinatorial map). Each type of each possible cell dimension of the combinatorial map). Each type of
the tuple must be either a model of the \ccc{CellAttribute} concept or the tuple must be either a model of the \ccc{CellAttribute} concept or
\ccc{void}. The first type corresponds to 0-attributes, the second to \ccc{void}. The first type corresponds to 0-attributes, the second to
1-attributes and so on. If the $i^{\mbox{th}}$ type in the tuple is 1-attributes and so on. If the $i^{\mbox{th}}$ type in the tuple is
\ccc{void}, $(i-1)$-attributes are disabled: we say that \ccc{void}, \emph{(i-1)}-attributes are disabled: we say that
$(i-1)$-attributes are \emph{void}. Otherwise, $(i-1)$-attributes are \emph{(i-1)}-attributes are \emph{void}. Otherwise, \emph{(i-1)}-attributes are
enabled and have the given type: we say $(i-1)$-attributes are enabled and have the given type: we say \emph{(i-1)}-attributes are
\emph{non void}. If the size of the tuple is $k$, with $k < \emph{non void}. If the size of the tuple is \emph{k}, with $k <
dimension+1$, $\forall i: k \leq i \leq dimension$, $i$-attributes are dimension+1$, $\forall i: k \leq i \leq dimension$, \emph{i}-attributes are
void. void.
The class \ccc{Combinatorial_map_min_items<d>} is a model of the The class \ccc{Combinatorial_map_min_items<d>} is a model of the
@ -945,20 +948,20 @@ It defines \ccc{CGAL::Dart<d,CMap>} as type of dart, and
\subsection{Darts}\label{ssec-darts} \subsection{Darts}\label{ssec-darts}
The class \ccc{Dart<d,CMap>}, a model of the \ccc{Dart} concept, The class \ccc{Dart<d,CMap>}, a model of the \ccc{Dart} concept,
defines a $d$D dart. It has two template parameters standing for the defines a \emph{d}D dart. It has two template parameters standing for the
dimension of the combinatorial map, and a model of the dimension of the combinatorial map, and a model of the
\ccc{CombinatorialMap} concept, which provides the two types \ccc{CombinatorialMap} concept, which provides the two types
\ccc{Dart_handle} and \ccc{Dart_const_handle}. \ccc{Dart_handle} and \ccc{Dart_const_handle}.
Each instance \ccc{d0} of \ccc{Dart<d,CMap>} stores the $\beta_i$ pointers in an Each instance \ccc{d0} of \ccc{Dart<d,CMap>} stores the $\beta_i$ pointers in an
array of $d+1$ \ccc{Dart_handle} (because we describe also the array of \emph{d+1} \ccc{Dart_handle} (because we describe also the
$\beta_0$ pointer). It also stores the attributes associated to this $\beta_0$ pointer). It also stores the attributes associated to this
dart in a tuple of \ccc{CMap::Attribute_handle<i>::type}, one for each dart in a tuple of \ccc{CMap::Attribute_handle<i>::type}, one for each
non void $i$-attribute. non void \emph{i}-attribute.
Methods are defined allowing to retrieve each $\beta_i$ and each Methods are defined allowing to retrieve each $\beta_i$ and each
associated $i$-attribute of \ccc{d0}, and allowing to test if \ccc{d0} associated \emph{i}-attribute of \ccc{d0}, and allowing to test if \ccc{d0}
dart is $i$-free. dart is \emph{i}-free.
Note that the use of the \ccc{Dart} class is not hard wired in Note that the use of the \ccc{Dart} class is not hard wired in
the combinatorial map class. Users can provide their own model of the the combinatorial map class. Users can provide their own model of the
@ -1124,7 +1127,7 @@ There are three different categories of dart range classes:
\ccc{Dart_of_orbit_range<1,2>} for the orbit \ccc{Dart_of_orbit_range<1,2>} for the orbit
$\orb{\mb{1},\mb{2}}(d0)$); $\orb{\mb{1},\mb{2}}(d0)$);
\item \ccc{Dart_of_cell_range<i,dim>}: range of all the darts of \item \ccc{Dart_of_cell_range<i,dim>}: range of all the darts of
the $i$-cell containing a given dart. The $i$-cell is considered in the \cell{i} containing a given dart. The \cell{i} is considered in
dimension \ccc{dim} (with $0 \leq dim \leq d$, $dim=d$ by default), dimension \ccc{dim} (with $0 \leq dim \leq d$, $dim=d$ by default),
with $0\leq i \leq dim+1$. If $i=dim+1$, with $0\leq i \leq dim+1$. If $i=dim+1$,
\ccc{Dart_of_cell_range<i,dim>} is the range of all the darts of \ccc{Dart_of_cell_range<i,dim>} is the range of all the darts of
@ -1138,17 +1141,17 @@ There are three different categories of dart range classes:
% example in a \ccc{set} of the \stl). % example in a \ccc{set} of the \stl).
There are also two different classes of ranges containing one dart per There are also two different classes of ranges containing one dart per
$i$-cell. Note that in these classes, the dart of each $i$-cell can \cell{i}. Note that in these classes, the dart of each \cell{i} can
be any dart of the cell. Moreover, each $i$-cell (and $j$-cell in the be any dart of the cell. Moreover, each \cell{i} (and \cell{j} in the
second case) is considered in dimension \ccc{dim} (with $0 \leq dim second case) is considered in dimension \ccc{dim} (with $0 \leq dim
\leq d$, $dim=d$ by default). \leq d$, $dim=d$ by default).
\begin{itemize} \begin{itemize}
\item \ccc{One_dart_per_cell_range<i,dim>}: range containing one dart of \item \ccc{One_dart_per_cell_range<i,dim>}: range containing one dart of
each $i$-cell of the combinatorial map, $0\leq i \leq dim+1$ (for each \cell{i} of the combinatorial map, $0\leq i \leq dim+1$ (for
example \ccc{One_dart_per_cell_range<2>} for the range of one dart per example \ccc{One_dart_per_cell_range<2>} for the range of one dart per
2-cell of the combinatorial map); 2-cell of the combinatorial map);
\item \ccc{One_dart_per_incident_cell_range<i,j,dim>}: range \item \ccc{One_dart_per_incident_cell_range<i,j,dim>}: range
containing one dart of each $i$-cell incident to the $j$-cell containing one dart of each \cell{i} incident to the \cell{j}
containing a given dart, with $0\leq i \leq dim+1$ and $0\leq j containing a given dart, with $0\leq i \leq dim+1$ and $0\leq j
\leq dim+1$ (for example \leq dim+1$ (for example
\ccc{One_dart_per_incident_cell_range<0,3>} for the range of \ccc{One_dart_per_incident_cell_range<0,3>} for the range of
@ -1183,7 +1186,7 @@ a \ccc{Dart_handle} to a new dart created during the operation.
linked by $\beta_2$); dimension must be greater or equal than two; linked by $\beta_2$); dimension must be greater or equal than two;
\item \ccc{make_combinatorial_polygon<CMap>(cm,alg)}: creates an \item \ccc{make_combinatorial_polygon<CMap>(cm,alg)}: creates an
isolated combinatorial polygon of length \ccc{alg} (\ccc{alg} darts isolated combinatorial polygon of length \ccc{alg} (\ccc{alg} darts
linked by $\beta_1$), for \ccc{alg}$>0$; dimension must be greater linked by $\beta_1$), for \ccc{alg>0}; dimension must be greater
or equal than one; or equal than one;
\item \ccc{make_combinatorial_tetrahedron<CMap>(cm)}: creates an \item \ccc{make_combinatorial_tetrahedron<CMap>(cm)}: creates an
isolated combinatorial tetrahedron (four combinatorial triangles isolated combinatorial tetrahedron (four combinatorial triangles
@ -1198,7 +1201,7 @@ a \ccc{Dart_handle} to a new dart created during the operation.
\begin{ccAdvanced} \begin{ccAdvanced}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Boolean Marks\label{ssec-adv-marks}} \subsection{Boolean Marks\label{ssec-adv-marks}}
It is often necessary to mark darts, for example to retrieve in $O(1)$ It is often necessary to mark darts, for example to retrieve in \emph{O(1)}
if a given dart was already processed during a specific algorithm, for example, if a given dart was already processed during a specific algorithm, for example,
iteration over a given range. Users can also mark specific parts of a iteration over a given range. Users can also mark specific parts of a
combinatorial map (for example mark all the darts belonging to objects combinatorial map (for example mark all the darts belonging to objects
@ -1211,22 +1214,22 @@ wants to use a Boolean mark, the following methods are available (with
\item get a new free mark: \ccc{int m = cm.get_new_mark()} (return \item get a new free mark: \ccc{int m = cm.get_new_mark()} (return
-1 if no mark is available); -1 if no mark is available);
\item set mark $m$ for a given dart \ccc{d0}: \ccc{cm.mark(dh0,m)}; \item set mark \ccc{m} for a given dart \ccc{d0}: \ccc{cm.mark(dh0,m)};
\item unset mark $m$ for a given dart \ccc{d0}: \ccc{cm.unmark(dh0,m)}; \item unset mark \ccc{m} for a given dart \ccc{d0}: \ccc{cm.unmark(dh0,m)};
\item test if a given dart \ccc{d0} is marked for $m$: \ccc{cm.is_marked(dh0,m)}; \item test if a given dart \ccc{d0} is marked for \ccc{m}: \ccc{cm.is_marked(dh0,m)};
\item unmark all the darts of \ccc{cm} for $m$: \ccc{cm.unmark_all(m)}; \item unmark all the darts of \ccc{cm} for \ccc{m}: \ccc{cm.unmark_all(m)};
% The complexity of this method is $O(1)$, if % The complexity of this method is $O(1)$, if
% the darts of \ccc{cm} $D$ are all marked or all unmarked, and it is $O(|D|)$ % the darts of \ccc{cm} $D$ are all marked or all unmarked, and it is $O(|D|)$
% otherwise % otherwise
\item negate mark $m$ of all the darts of \ccc{cm}: \ccc{cm.negate_mark(m)}. \item negate mark \ccc{m} of all the darts of \ccc{cm}: \ccc{cm.negate_mark(m)}.
All the marked darts become unmarked and all the unmarked darts become marked; All the marked darts become unmarked and all the unmarked darts become marked;
% The complexity of this method is $O(1)$; % The complexity of this method is $O(1)$;
\item free mark $m$: \item free mark \ccc{m}:
\ccc{cm.free_mark(m)}. This method unmarks all the darts of \ccc{cm} \ccc{cm.free_mark(m)}. This method unmarks all the darts of \ccc{cm}
for $m$ before freeing it.% (same complexity as \ccc{cm.unmark_all(m)}). for \ccc{m} before freeing it.% (same complexity as \ccc{cm.unmark_all(m)}).
\end{itemize} \end{itemize}
It is important to free a mark when it is no longer needed, otherwise It is important to free a mark when it is no longer needed, otherwise
@ -1296,11 +1299,11 @@ $\beta$ pointers of existing darts.
\begin{itemize} \begin{itemize}
\item The \ccc{sew} and \ccc{unsew} methods iterate over two orbits in \item The \ccc{sew} and \ccc{unsew} methods iterate over two orbits in
order to link or unlink specific darts two by two. Intuitively, a order to link or unlink specific darts two by two. Intuitively, a
\ccc{sew<i>} operation glues two $i$-cells by identifying two of \ccc{sew<i>} operation glues two \cells{i} by identifying two of
their $(i-1)$-cells (see example in Figure~\ref{fig-exemple-sew} their \cells{(i-1)} (see example in Figure~\ref{fig-exemple-sew}
where \ccc{sew<3>} is used to glue two 3-cells along one 2-cell). where \ccc{sew<3>} is used to glue two 3-cells along one 2-cell).
Reciprocally, a \ccc{unsew<i>} operation un-glues two $i$-cells which Reciprocally, a \ccc{unsew<i>} operation un-glues two \cells{i} which
were glued along one of their $(i-1)$-cells. were glued along one of their \cells{(i-1)}.
These methods guarantee that given a valid combinatorial map and a These methods guarantee that given a valid combinatorial map and a
possible operation we obtain a valid combinatorial map as result of possible operation we obtain a valid combinatorial map as result of
the operation. the operation.
@ -1373,14 +1376,14 @@ In addition, the sew operations update the associations between darts
and non void attributes in order to guarantee that all the darts and non void attributes in order to guarantee that all the darts
belonging to a given cell are associated with the same attribute belonging to a given cell are associated with the same attribute
(which is a condition of combinatorial map validity). For each couple (which is a condition of combinatorial map validity). For each couple
of $j$-cells $c_1$ and $c_2$ that are merged into one $j$-cell during of \cells{j} $c_1$ and $c_2$ that are merged into one \cell{j} during
the sew, we have to update the two associated attributes $attr_1$ and the sew, we have to update the two associated attributes $attr_1$ and
$attr_2$. If both are NULL, there is nothing to do. If one is NULL $attr_2$. If both are NULL, there is nothing to do. If one is NULL
and the other not, we only associate the non NULL attribute to all the and the other not, we only associate the non NULL attribute to all the
darts of the resulting cell. When the two attributes are non NULL, we darts of the resulting cell. When the two attributes are non NULL, we
first apply functor \ccc{On_merge} on the two attributes $attr_1$ and first apply functor \ccc{On_merge} on the two attributes $attr_1$ and
$attr_2$ (see Section~\ref{ssec-attributes}). Then, we associate the $attr_2$ (see Section~\ref{ssec-attributes}). Then, we associate the
attribute $attr_1$ to all darts of the resulting $j$-cell. Finally, attribute $attr_1$ to all darts of the resulting \cell{j}. Finally,
attribute $attr_2$ is removed from the combinatorial map. attribute $attr_2$ is removed from the combinatorial map.
Note that when the two attributes are non NULL, the first one is Note that when the two attributes are non NULL, the first one is
@ -1396,7 +1399,7 @@ For example, in Figure~\ref{fig-exemple-sew}, we want to 3-sew the two
initial volumes. \ccc{sew<3>(1,5)} links by $\mb{3}$ the pairs of initial volumes. \ccc{sew<3>(1,5)} links by $\mb{3}$ the pairs of
darts $(1,5)$, $(2,8)$, $(3,7)$ and $(4,6)$, thus the combinatorial map darts $(1,5)$, $(2,8)$, $(3,7)$ and $(4,6)$, thus the combinatorial map
obtained is valid. 2-attributes are updated so that all the darts obtained is valid. 2-attributes are updated so that all the darts
belonging to the 2-cell containing dart $1$ become associated to the belonging to the 2-cell containing dart 1 become associated to the
same 2-attribute after the operation. same 2-attribute after the operation.
% %
@ -1406,9 +1409,9 @@ and thus guarantee to obtain a valid combinatorial map. This
operation is possible for any non $i$-free dart. operation is possible for any non $i$-free dart.
As for the sew operations, attributes are updated to As for the sew operations, attributes are updated to
guarantee that two darts belonging to two different $j$-cells are guarantee that two darts belonging to two different \cells{j} are
associated to two different $j$-attributes. If the unsew operation associated to two different $j$-attributes. If the unsew operation
splits a $j$-cell $c$ in two $j$-cells $c_1$ and $c_2$, and if $c$ is splits a \cell{j} $c$ in two \cells{j} $c_1$ and $c_2$, and if $c$ is
associated to a $j$-attribute $attr_1$, then this attribute is duplicated associated to a $j$-attribute $attr_1$, then this attribute is duplicated
into $attr_2$, and all the darts belonging to $c_2$ are associated into $attr_2$, and all the darts belonging to $c_2$ are associated
with this new attribute. Finally, we call the functor \ccc{On_split} with this new attribute. Finally, we call the functor \ccc{On_split}
@ -1490,14 +1493,14 @@ valid.
% \end{figure} % \end{figure}
The first one is \ccc{remove_cell<CMap,i>(cm,dh0)} which modifies the The first one is \ccc{remove_cell<CMap,i>(cm,dh0)} which modifies the
combinatorial map to remove the $i$-cell containing dart \ccc{d0}, combinatorial map to remove the \cell{i} containing dart \ccc{d0},
with $0 \leq i \leq d$. This operation is possible if $i==d$ or if the given with $0 \leq i \leq d$. This operation is possible if $i==d$ or if the given
$i$-cell is incident to at most two $(i+1)$-cells which can be tested \cell{i} is incident to at most two \cells{(i+1)} which can be tested
thanks to \ccc{is_removable<CMap,i>(cm,dh0)}. If the removed $i$-cell thanks to \ccc{is_removable<CMap,i>(cm,dh0)}. If the removed \cell{i}
was incident to two different $(i+1)$-cells, these two cells are was incident to two different \cells{(i+1)}, these two cells are
merged into one $(i+1)$-cell. In this case, the \ccc{On_merge} functor merged into one \cell{(i+1)}. In this case, the \ccc{On_merge} functor
is called if two $(i+1)$-attributes are associated to the two is called if two \emph{(i+1)}-attributes are associated to the two
$(i+1)$-cells. If the $i$-cell is associated with a non void \cells{(i+1)}. If the \cell{i} is associated with a non void
attribute, it is removed from the combinatorial map (see three attribute, it is removed from the combinatorial map (see three
examples on Figures~\ref{fig-insert-vertex}, \ref{fig-insert-edge} and examples on Figures~\ref{fig-insert-vertex}, \ref{fig-insert-edge} and
\ref{fig-insert-face}). \ref{fig-insert-face}).
@ -1522,11 +1525,11 @@ examples on Figures~\ref{fig-insert-vertex}, \ref{fig-insert-edge} and
The inverse operation of the removal is the insertion operation. The inverse operation of the removal is the insertion operation.
Several versions exist, sharing a common principle. They consist in Several versions exist, sharing a common principle. They consist in
adding a new $i$-cell ``inside'' an existing $j$-cell, $i<j$, by adding a new \cell{i} ``inside'' an existing \cell{j}, \emph{i<j}, by
splitting the $j$-cell into several $j$-cells. Contrary to splitting the \cell{j} into several \cells{j}. Contrary to
\ccc{remove_cell<CMap,i>}, is it not possible to define a unique \ccc{remove_cell<CMap,i>}, is it not possible to define a unique
\ccc{insert_cell_i_in_cell_j<CMap,i,j>} function because parameters \ccc{insert_cell_i_in_cell_j<CMap,i,j>} function because parameters
are different depending on $i$ and $j$. are different depending on \ccc{i} and \ccc{j}.
%The following versions exist: %The following versions exist:
% \begin{itemize} % \begin{itemize}
@ -1610,6 +1613,7 @@ This operation is possible if \ccc{d0}$\in$\ccc{cm.darts()}.
\ccc{d5}, we obtain the initial combinatorial map.} \ccc{d5}, we obtain the initial combinatorial map.}
\label{fig-insert-face} \label{fig-insert-face}
\end{figure} \end{figure}
% \item % \item
\ccc{insert_cell_2_in_cell_3<CMap>(cm,itbegin,itend)} adds a \ccc{insert_cell_2_in_cell_3<CMap>(cm,itbegin,itend)} adds a
2-cell in the 3-cell containing all the darts between 2-cell in the 3-cell containing all the darts between
@ -1741,14 +1745,14 @@ of cells of the combinatorial map are displayed, and its validity is
checked. checked.
By looking at these numbers of cells, we can see that the 4D By looking at these numbers of cells, we can see that the 4D
combinatorial map contains only one 3-cell. Indeed, the $sew<4>$ combinatorial map contains only one 3-cell. Indeed, the \ccc{sew<4>}
operation has identified by pairs all the darts of the two 3-cells operation has identified by pairs all the darts of the two 3-cells
by definition of the sew operation (see Section~\ref{ssec-link-darts}) by definition of the sew operation (see Section~\ref{ssec-link-darts})
which, in 4D, links by $\beta_3$ all the darts in which, in 4D, links by $\beta_3$ all the darts in
$\orb{\mb{1},\mb{2}}(d_1)$ and in $\orb{\mb{1},\mb{2}}(d_2)$. The $\orb{\mb{1},\mb{2}}(d_1)$ and in $\orb{\mb{1},\mb{2}}(d_2)$. The
situation is similar (but in higher dimension) to the situation is similar (but in higher dimension) to the
configuration where we have two triangles in a 3D combinatorial map, configuration where we have two triangles in a 3D combinatorial map,
and you use $sew<3>$ between these two triangles. The two triangles and you use \ccc{sew<3>} between these two triangles. The two triangles
are identified since all their darts are linked by $\beta_3$, thus we are identified since all their darts are linked by $\beta_3$, thus we
obtain a 3D combinatorial map containing only one 3-cell. Note that obtain a 3D combinatorial map containing only one 3-cell. Note that
this 3-cell is unbounded since the darts of the two triangles are all this 3-cell is unbounded since the darts of the two triangles are all
@ -1806,8 +1810,8 @@ second cube with attribute having 13 as value. During the
the value of the new 2-cell is the sum of the two previous one: 20. the value of the new 2-cell is the sum of the two previous one: 20.
Then we call \ccc{CGAL::insert_cell_0_in_cell_2} on a dart which Then we call \ccc{CGAL::insert_cell_0_in_cell_2} on a dart which
belong to this 2-cell. This method splits the existing 2-cell in $k$ belong to this 2-cell. This method splits the existing 2-cell in \emph{k}
2-cells, $k$ being the number of 1-cells of the initial 2-cell (4 in 2-cells, \emph{k} being the number of 1-cells of the initial 2-cell (4 in
this example). These splits are made consecutively, thus for the first this example). These splits are made consecutively, thus for the first
split, we create a new attribute as copy of the initial one and call split, we create a new attribute as copy of the initial one and call
functor \ccc{Divide_by_two_functor} on these two attributes: the value functor \ccc{Divide_by_two_functor} on these two attributes: the value
@ -1883,7 +1887,7 @@ of darts which can be obtained from $a$ by elements of $\orb{S}$:
$\orb{f_1,\ldots,f_k}(a)=\{\phi(a)|\phi \in \orb{S}\}\setminus\{\varnothing\}$. $\orb{f_1,\ldots,f_k}(a)=\{\phi(a)|\phi \in \orb{S}\}\setminus\{\varnothing\}$.
Let $d_0 \in D$ be a dart. Given $i$, $1\leq i \leq d$, Let $d_0 \in D$ be a dart. Given $i$, $1\leq i \leq d$,
the $i$-cell containing $d_0$ is the \cell{i} containing $d_0$ is
$\orb{\beta_1,\ldots,\beta_{i-1},\beta_{i+1},\ldots,\beta_d}(d_0)$. $\orb{\beta_1,\ldots,\beta_{i-1},\beta_{i+1},\ldots,\beta_d}(d_0)$.
The $0$-cell containing $d_0$ is The $0$-cell containing $d_0$ is
$\orb{\{\mb{i}\circ\mb{j}|\forall i,j: 1\leq i<j \leq d\}}(d_0)$. $\orb{\{\mb{i}\circ\mb{j}|\forall i,j: 1\leq i<j \leq d\}}(d_0)$.