diff --git a/Packages/Triangulation_3/doc_tex/Triangulation_3/TDS3.tex b/Packages/Triangulation_3/doc_tex/Triangulation_3/TDS3.tex index de3b5e6ec54..200899274f9 100644 --- a/Packages/Triangulation_3/doc_tex/Triangulation_3/TDS3.tex +++ b/Packages/Triangulation_3/doc_tex/Triangulation_3/TDS3.tex @@ -25,12 +25,28 @@ \section{Introduction} \label{TDS3-sec-intro} -\subsection{Definition} +A three-dimensional triangulation is a three-dimensional simplicial +complex, pure connected and without singularities \cite{by-ag-98}. It +is a set of cells ($3$-faces, tetrahedra) such that two cells +either do not intersect or share a common facet ($2$-face), edge +($1$-face) or vertex ($0$-face). + +A geometric triangulation has two aspects: the combinatorial structure which +gives the incidence and adjacency relations between faces, and the +geometric information related to the position of vertices. + +\cgal\ proposes 3D geometric triangulations in which these +two aspects are clearly separated. + +This chapter deals with 3D- triangulation data structures, meant to +maintain the combinatorial information for 3D-geometric +triangulations. The reader interested in geometric triangulations of +$\R^3$ is advised to read Chapter~\ref{chapter-Triangulation3}. + +\subsection{Representation} \label{TDS3-sec-def} -A 3D- triangulation data structure is meant to maintain the combinatorial -information (incidence and adjacency relations) for 3D-geometric -triangulations. In \cgal, a triangulation data structure is a +In \cgal, a triangulation data structure is a container of cells ($3$-faces) and vertices ($0$-faces). Each cell gives access to its four incident vertices and to its four adjacent cells. Each vertex gives access to one of its incident cells. @@ -38,7 +54,21 @@ cells. Each vertex gives access to one of its incident cells. The four vertices of a cell are indexed with 0, 1, 2 and 3. The neighbors of a cell are also indexed with 0, 1, 2, 3 in such a way that the neighbor indexed by $i$ is opposite to the vertex -with the same index. +with the same index (see Figure~\ref{TDS3-fig-repres}). + +\begin{ccTexOnly} +\begin{figure} +\begin{center} +\includegraphics{repres.eps} +\end{center} +\caption{Representation \label{TDS3-fig-repres}} +\end{figure} +\end{ccTexOnly} + +\begin{ccHtmlOnly} + +\end{ccHtmlOnly} Edges ($1$-faces) and facets ($2$-faces) are not explicitely represented: a facet is given by a cell and an index (the facet @@ -57,7 +87,7 @@ is not of full dimension. As described in Chapter~\ref{chapter-Triangulation3}, a geometric triangulation of a set of points in $\R^d$ is a partition of the whole space $\R^d$ into cells having $d+1$ vertices: some of them -are infinite, they are obtained by liking an additional vertex at +are infinite, they are obtained by linking an additional vertex at infinity to each facet of the convex hull of the points. The underlying combinatorial triangulation of such a triangulation without boundary of $\R^d$ can be seen as a triangulation of the @@ -76,15 +106,51 @@ the boundary of a 4-dimensional simplex, which has 5 vertices. A geometric embedding consists in choosing one of these vertices to be infinite, thus four of the five 3-cells becomes infinite: the geometric triangulation has one finite tetrahedron remaining, each of its facets -being incident to the infinite cell. +being incident to the infinite cell. See Figure~\ref{TDS3-fig-topo-simplex4}. +\begin{ccTexOnly} +\begin{figure} +\begin{center} +\includegraphics{topo-simplex4.eps} +\end{center} +\caption{4D simplex and a 3D geometric embedding \label{TDS3-fig-topo-simplex4}} +\end{figure} +\end{ccTexOnly} +\begin{ccHtmlOnly} + +\end{ccHtmlOnly} \item \emph{dimension 2.} We have 4 vertices forming one 3-dimensional simplex, i.e. the boundary of a tetrahedron. The geometric embedding in the plane consists in choosing one of these vertices to be infinite, then the geometric triangulation has one finite triangle whose edges are -adjacent to the infinite triangles. See Figure~\ref{TDS3-fig-topo-simplex}. +adjacent to the infinite triangles. See Figure~\ref{TDS3-fig-topo-simplex3}. +\begin{ccTexOnly} +\begin{figure} +\begin{center} +\includegraphics{topo-simplex3.eps} +\end{center} +\caption{3D simplex and a 2D geometric embedding \label{TDS3-fig-topo-simplex3}} +\end{figure} +\end{ccTexOnly} +\begin{ccHtmlOnly} + +\end{ccHtmlOnly} \item \emph{dimension 1.} A 2-dimensional simplex (a triangle) has 3 vertices. The geometric embedding is and edge whose vertices are linked -to an infinite point. +to an infinite point. See Figure~\ref{TDS3-fig-topo-simplex2}. +\begin{ccTexOnly} +\begin{figure} +\begin{center} +\includegraphics{topo-simplex2.eps} +\end{center} +\caption{2D simplex and a 1D geometric embedding \label{TDS3-fig-topo-simplex2}} +\end{figure} +\end{ccTexOnly} +\begin{ccHtmlOnly} + +\end{ccHtmlOnly} \end{itemize} The last two cases are defined uniquely: @@ -105,20 +171,6 @@ triangulation data structure. The infinite vertex of the geometric embedding is a vertex without any particularity in the combinatorial triangulation. -\begin{ccTexOnly} -\begin{figure} -\begin{center} -\includegraphics{topo-simplex.eps} -\end{center} -\caption{3D simplex and its 2D geometric embedding \label{TDS3-fig-topo-simplex}} -\end{figure} -\end{ccTexOnly} - -\begin{ccHtmlOnly} - -\end{ccHtmlOnly} - The implicit representation of facets (resp. edges) still holds for degenerate ($< 3$) dimensions : in dimension~2, each cell has only one facet of index 3, and 3 edges $(0,1)$, $(1,2)$ and $(2,0)$; in @@ -189,29 +241,144 @@ software design in this case. Layers in the software design \end{ccHtmlOnly} -In the bottom -layer, the base classes store elementary geometric information as -well as any other information for the given application. The middle -layer class stores the triangulation data structure, which is purely -combinatorial. It provides operations such as insertion of a new -vertex in a given cell, and is responsible for the combinatorial -integrity of the triangulation. The upper layer is the geometric -triangulation class, providing operations such as location of a point -in the triangulation, insertion of a point, and is responsible for -the geometric validity. +In the bottom layer, the \cgal\ base classes store elementary +geometric information. These classes are parameterized by a geometric +traits class providing all the geometric types. A vertex has a pointer +to a cell, and a cell has four pointers to vertices. These pointers +are of type \ccc{void*}. -The triangulation data structure class is parameterized by the base -vertex and the base cell classes. It is up to the user to derive its -own base classes from the \cgal\ base classes, and to use the -triangulation data structure class proposed by \cgal. +The middle layer class stores the triangulation data structure, which +is purely combinatorial. A vertex of the triangulation data structure +has a pointer to a cell of the triangulation data structure, and a +cell has four pointers to vertices. These pointers are usual +\ccc{C++} pointers. The triangulation data structure provides +operations such as insertion of a new vertex in a given cell, on a +$1$ or $2$-face, or, if the dimension of the triangulation is smaller +than 3, outside the ``affine'' hull of the vertices, thus increasing +the dimension of the triangulation by one. The triangulation data +structure is responsible for the combinatorial integrity of the +triangulation. + +It is up to the user to derive its own base classes from the \cgal\ +base classes to add any other information the may need for his given +application, or to write his own base classes from scratch. In this +case, his base classes must be models for the concepts described in +Section~\ref{TDS3-sec-concept-Base}. As the triangulation data +structure class is parameterized by the base vertex and the base cell +classes. it will consider the user's bases classes instead of the +predefined base classes. + +The upper layer, described in Chapter~\ref{chapter-Triangulation3}, is +the geometric triangulation class, providing operations such as +location of a point in the triangulation, insertion of a point, and is +responsible for the geometric validity. A vertex of the triangulation +has a pointer to a cell and a cell has four pointers to +vertices. These pointers are \cgal\ \emph{handles}. The triangulation +data structure class is one of the template parameters of the +geometric triangulation class. The user may choose to replace the +\cgal\ triangulation data structure class by its own triangulation +data structure, in this case, his class has to be a model of the +concept described in Section~\ref{TDS3-sec-concept}. \section{Examples} \label{TDS3-sec-examples} +The following example shows how to construct a 3D triangulation data +structure by inserting vertices. +\begin{verbatim} +#include + +#include +#include +#include +#include + +#include + +#include +#include + +#include +#include +#include +#include + +// the definition of the geometric traits class is necessary to +// instanciate base vertices and cells but will in fact never be used +// in the program +typedef CGAL::Cartesian Rep; +typedef CGAL::Triangulation_geom_traits_3 Gt; + +typedef CGAL::Triangulation_vertex_base_3 Vb; +typedef CGAL::Triangulation_cell_base_3 Cb; + +typedef CGAL::Triangulation_data_structure_3 Tds; + +typedef typename Tds::Cell TDSCell; +typedef typename Tds::Vertex TDSVertex; + +int main() +{ + Tds T; + + assert( T.number_of_vertices() == 0 ); + assert( T.dimension() == -2 ); + assert( T.is_valid() ); + + std::vector V(5); + std::vector PV(7); + + PV[0] = T.insert_outside_affine_hull(V[0]); + assert( T.number_of_vertices() == 1 ); + assert( T.dimension() == -1 ); + assert( T.is_valid() ); + + int i; + // each of the following insertions of vertices increases the dimension + for ( i=1; i<5; i++ ) { + PV[i] = T.insert_outside_affine_hull(V[i], PV[0]); + assert( T.number_of_vertices() == i+1 ); + assert( T.dimension() == i-1 ); + assert( T.is_valid() ); + } + assert( T.number_of_cells() == 5 ); + + // we now have a simplex in dimension 4 + + // cell incident to PV[0] + TDSCell* c = PV[0]->cell(); + int ind; + assert( c->has_vertex( PV[0], ind ) ); + // PV[0] is the vertex of index ind in c + + // insertion of a new vertex in the facet opposite to PV[0] + PV[5] = T.insert_in_facet(TDSVertex(), c, ind); + + assert( T.number_of_vertices() == 6 ); + assert( T.dimension() == 3 ); + assert( T.is_valid() ); + + // insertion of a new vertex in c + PV[6] = T.insert_in_cell( TDSVertex(), c ); + + assert( T.number_of_vertices() == 7 ); + assert( T.dimension() == 3 ); + assert( T.is_valid() ); + + std::ofstream oFileT("output_tds",ios::out); + // writing file output_tds; + oFileT << T; + + return 0; +} +\end{verbatim} \clearpage \section{Concepts} +This section describes the concepts for a 3D- triangulation data +structure, its vertices and cells. + \subsection{Concepts for a 3D- Triangulation Data Structure} \label{TDS3-sec-concept} \begin{ccClassTemplate}{Tds} @@ -277,9 +444,12 @@ incident to a given edge. They are bidirectional and non mutable. \ccMethod{Tds operator=(const Tds & tds1);} {Assignment. All the vertices and cells are duplicated.} +The previous first two methods are equivalent. + \ccMethod{void swap(Tds & tds1);} {Swaps \ccVar\ and \ccc{tds1}. Should be preferred to \ccVar=\ccc{tds1} -or \ccVar(\ccc{tds1}) when tds1 is deleted after that.} +or \ccVar(\ccc{tds1}) when tds1 is deleted after that. Indeed, there is no +copy of cells and vertices, thus this method runs in constant time.} \ccMethod{Vertex* copy_tds(const Tds & tds1, Vertex* v = NULL);} {\ccc{tds1} is copied into \ccVar. The vertex of \ccVar\ @@ -288,7 +458,8 @@ corresponding to \ccc{v} is returned. \ccc{tds1}.}} \ccFunction{void \ccTilde\ccVar();} -{Destructor. All vertices and cells are deleted.} +{Destructor. All vertices and cells are deleted, and \ccVar\ itself is +deleted.} \ccAccessFunctions @@ -424,11 +595,12 @@ operation is exactly reciprocal to \ccc{\ccVar.insert_in_cell(v)}. \textit{not yet implemented}} \ccMethod{void clear();} -{Deletes all cells and vertices.} +{Deletes all cells and vertices. \ccVar\ is reset as a triangulation +data structure constructed by the default constructor.} In addition to these requirements, in order to be used as a triangulation data structure by the class -\ccc{CGAL_Delaunay_triangulation_3}, the triangulation +\ccc{Delaunay_triangulation_3}, the triangulation must offer the following method: \ccMethod{void star_region( set > & region, @@ -542,8 +714,6 @@ each cell given by their index in the preceding list of cells. \ccCreationVariable{v} -The vertex stores a point and a pointer to an incident cell. - The vertex class of a 3D- triangulation data structure must define the types and operations listed in this section. Some of these requirements are of geometric nature, they are \textit{optional} @@ -725,8 +895,8 @@ a precise indication on the kind of invalidity encountered.} \end{ccClass} -\begin{ccClassTemplate}{CGAL_Triangulation_data_structure_3} -\section{The Triangulation Data Structure Class\\ +\begin{ccClassTemplate}{Triangulation_data_structure_3} +\section{A model of Triangulation Data Structure:\\ \protect \ccClassTemplateName} \label{TDS3-sec-class} @@ -736,26 +906,24 @@ geometric functionalities. It is templated by base classes for vertices and cells described in Section~\ref{TDS3-sec-concept-Base}. \ccInheritsFrom -\ccc{CGAL_Triangulation_utils_3} +\ccc{Triangulation_utils_3} \\This class defines basic computations on indices of vertices and -neighbors of cells (see Section~\ref{Triangulation3-sec-class-Utils} of +neighbors of cells (Details are presented in +Section~\ref{Triangulation3-sec-class-Utils} of Chapter~\ref{chapter-Triangulation3}). \ccInclude{CGAL/Triangulation_data_structure_3.h} -The class \ccc{CGAL_Triangulation_ds_vertex_3} is a model for the vertex +The class \ccc{Triangulation_ds_vertex_3} is a model for the vertex concept described in Section~\ref{TDS3-sec-concept-Tds_Vertex}. \ccInclude{CGAL/Triangulation_ds_vertex_3.h} -The class \ccc{CGAL_Triangulation_ds_cell_3} is a model for the +The class \ccc{Triangulation_ds_cell_3} is a model for the cell concept described in Section~\ref{TDS3-sec-concept-Tds_Cell}. \ccInclude{CGAL/Triangulation_ds_cell_3.h} -\ccInheritsFrom -\ccc{CGAL_Triangulation_utils_3} - \end{ccClassTemplate} \section{Concepts for the Base Vertices and Cells} @@ -943,29 +1111,33 @@ a precise indication on the kind of invalidity encountered.} \end{ccClass} -\section{The Base Classes for Vertices and Cells} +\section{Models of Base Vertices and Cells} \label{TDS3-sec-class-Base} - \begin{ccClassTemplate}{CGAL_Triangulation_vertex_base_3} + \begin{ccClassTemplate}{Triangulation_vertex_base_3} \subsection{The Base Class \protect \ccClassTemplateName} \label{TDS3-sec-class-Base_Vertex} -This class is proposed by \cgal\ as a base vertex class. -It is templated by a geometric traits class. Using the same -geometric traits class \ccc{Traits} as the one used for -\ccc{CGAL_Triangulation_3} is strongly advised. In this way, the -point type defined by \ccClassName\ is the same as the point type -defined by the geometric traits class. +This class is proposed by \cgal\ as a base vertex class. It is +templated by a geometric traits class \ccc{Traits} that provides the +geometric types. The user who uses the geometric layer (see +Section~\ref{TDS3-sec-design} and +Chapter~\ref{chapter-Triangulation3}) is strongly advised to use the +same geometric traits class \ccc{Traits} as the one used for +\ccc{Triangulation_3}. In this way, the point type +defined by \ccClassName\ is the same as the point type defined by the +geometric traits class. The default geometric traits class proposed by +\cgal\ is presented in Section~\ref{Triangulation3-sec-Traits}. -This base class can be used directly or can serve as a base to derive -other base classes with some additionnal attribute (a color for example) -tuned for a specific application. +This base class can be used directly or can serve as a base to derive +other base classes with some additionnal attributes (a color for +example) tuned for a specific application. \ccInclude{CGAL/Triangulation_vertex_base_3.h} \end{ccClassTemplate} - \begin{ccClassTemplate}{CGAL_Triangulation_cell_base_3} + \begin{ccClassTemplate}{Triangulation_cell_base_3} \subsection{The Base Class \protect \ccClassTemplateName} This class is proposed by \cgal\ as a base cell class, and is similar @@ -975,4 +1147,3 @@ Section~\ref{TDS3-sec-class-Base_Vertex}). \ccInclude{CGAL/Triangulation_cell_base_3.h} \end{ccClassTemplate} - diff --git a/Packages/Triangulation_3/doc_tex/Triangulation_3/Triangulation3.tex b/Packages/Triangulation_3/doc_tex/Triangulation_3/Triangulation3.tex index 267df4975fb..0a977dbf3d7 100644 --- a/Packages/Triangulation_3/doc_tex/Triangulation_3/Triangulation3.tex +++ b/Packages/Triangulation_3/doc_tex/Triangulation_3/Triangulation3.tex @@ -46,7 +46,7 @@ fourth vertex an auxiliary vertex called the \ccc{infinite vertex}. In that way, each facet is incident to exactly two cells and special cases at the boundary of the convex hull are simple to deal with. -The class \ccc{CGAL_Triangulation_3} of \cgal\ implements this +The class \ccc{Triangulation_3} of \cgal\ implements this point of view and therefore considers the triangulation of the set of points as a set of finite and infinite tetrahedra. Notice that the infinite vertex has no significant coordinates and that no @@ -58,23 +58,45 @@ access to its four incident vertices and to its four adjacent cells. Each vertex gives access to one of its incident cells. The four vertices of a cell are indexed with 0, 1, 2 and 3 in positive -orientation. The neighbors of a cell are also indexed with 0, 1, 2, 3 -in such a way that the neighbor indexed by $i$ is opposite to the vertex -with the same index. +orientation, the orientation being defined by the orientation of the +underlying space $\R^3$. The neighbors of a cell are also indexed with +0, 1, 2, 3 in such a way that the neighbor indexed by $i$ is opposite +to the vertex with the same index. See +Figure~\ref{Triangulation3-fig-orient}. -Edges ($1$-faces) and facets ($2$-faces) are not explicitely represented: -a facet is given by a cell and an index (the facet +\begin{ccTexOnly} +\begin{figure}[htbp] +\begin{center} +\includegraphics{orient.eps} +\end{center} +\caption{Orientation of a cell (3-dimensional case) +\label{Triangulation3-fig-orient}} +\end{figure} +\end{ccTexOnly} + +\begin{ccHtmlOnly} +Orientation of a cell 
+(3-dimensional case) +\end{ccHtmlOnly} + +As in the underlying combinatorial triangulation (see +Chapter~\ref{chapter-TDS3}), edges ($1$-faces) and facets ($2$-faces) +are not explicitely +represented: a facet is given by a cell and an index (the facet \ccc{i} of a cell \ccc{c} is the facet of \ccc{c} that is opposite to the vertex of index \ccc{i}) and an edge is given by a cell and two -indices (the edge \ccc{(i,j)} of a cell \ccc{c} is the edge -whose endpoints are the vertices of indices \ccc{i} and \ccc{j} of -\ccc{c}). +indices (the edge \ccc{(i,j)} of a cell \ccc{c} is the edge whose +endpoints are the vertices of indices \ccc{i} and \ccc{j} of +\ccc{c}). See Figure~\ref{TDS3-fig-repres}. \subsection{Degenerate Dimensions} \label{Triangulation3-sec-degen_dim} -The class \ccc{CGAL_Triangulation_3} can deal with degenerate -dimensions: +The class \ccc{Triangulation_3} can deal with degenerate +dimensions. A triangulation of a set of points in $\R^d$ is a partition of the +whole space $\R^d$ into cells having $d+1$ vertices: some of them +are infinite, they are obtained by linking the additional infinite +vertex to each facet of the convex hull of the points. \begin{itemize} \item {} \emph{dimension 2:} when a triangulation only contains coplanar points (which is the case when there are only three points), @@ -121,21 +143,6 @@ When all the points are collinear, this condition becomes: {\bf (c-1D)} For any two adjacent edges $(u,v)$ and $(v,w)$, $u$ and $w$ lie on opposite sides of the common vertex $v$. -\begin{ccTexOnly} -\begin{figure}[htbp] -\begin{center} -\includegraphics{orient.eps} -\end{center} -\caption{Orientation of a cell (3-dimensional case) -\label{Triangulation3-fig-orient}} -\end{figure} -\end{ccTexOnly} - -\begin{ccHtmlOnly} -Orientation of a cell 
-(3-dimensional case) -\end{ccHtmlOnly} - The \ccc{is_valid()} method provided by \cgal\ checks the local validity of a given triangulation. This does not always ensure global validity \cite{mnssssu-cgpvg-96,dlpt-ccpps-98} but it is @@ -144,7 +151,7 @@ sufficient for practical cases. \section{Software Design} \label{Triangulation3-sec-design} -The class \ccc{CGAL_Triangulation_3} is designed to be used as +The class \ccc{Triangulation_3} is designed to be used as a layer upon a 3D-triangulation data structure as presented in Section~\ref{TDS3-sec-design} of Chapter~\ref{chapter-TDS3}. It provides high level geometric operations such as location of a point @@ -163,22 +170,114 @@ described in Chapter~\ref{chapter-TDS3}. Delaunay triangulations as well as hierarchical Delaunay triangulations \cite{d-iirdt-98} are also implemented in the package: -\ccc{CGAL_Delaunay_triangulation_3} inherits from -\ccc{CGAL_Triangulation_3} and -\ccc{CGAL_Delaunay_hierarchic_triangulation_3} inherits from -\ccc{CGAL_Delaunay_triangulation_3}. +\ccc{Delaunay_triangulation_3} inherits from +\ccc{Triangulation_3} and +\ccc{Delaunay_hierarchic_triangulation_3} inherits from +\ccc{Delaunay_triangulation_3}. \textit{(hierarchical +Delaunay triangulations are not yet implemented).} -\ccc{CGAL_Triangulation_3} derives from -\ccc{CGAL_Triangulation_utils_3}, which defines tools on +\ccc{Triangulation_3} derives from +\ccc{Triangulation_utils_3}, which defines tools on the indices of vertices in cells (see Section~\ref{Triangulation3-sec-class-Utils}). \section{Examples} \label{Triangulation3-sec-examples} +This example shows the incremental construction of a 3D triangulation, +the location of a point, and how to manipulate elementary operations +on indices in a cell. + +\begin{verbatim} +#include + +#include +#include +#include +#include + +#include +#include + +#include + +#include + +#include +#include +#include +#include +#include + +typedef CGAL::Cartesian Rep; + +typedef CGAL::Triangulation_geom_traits_3 Gt; +typedef CGAL::Triangulation_vertex_base_3 Vb; +typedef CGAL::Triangulation_cell_base_3 Cb; + +typedef CGAL::Triangulation_data_structure_3 TDS; +typedef CGAL::Triangulation_3 Triangulation; + +typedef typename Triangulation::Cell_handle Cell_handle; +typedef typename Triangulation::Vertex_handle Vertex_handle; +typedef typename Triangulation::Locate_type Locate_type; + +typedef Gt::Point Point; + +int main(int argc, char* argv[]) +{ + + Triangulation T; + + // insertion from a list : + std::list L; + L.push_front(Point(0,0,0)); + L.push_front(Point(1,0,0)); + L.push_front(Point(0,1,0)); + + int n = T.insert(L.begin(), L.end()); + + // insertion from a vector : + std::vector V(3); + V[0] = Point(0,0,1); + V[1] = Point(1,1,1); + V[2] = Point(2,2,2); + + n = n + T.insert(V.begin(), V.end()); + + // 6 points have been inserted : + assert( n == 6 ); + + // checking validity of T : + assert( T.is_valid(false) ); + + Locate_type lt; + int li, lj; + Point p(0,0,0); + Cell_handle c = T.locate(p, lt, li, lj); + // p is the vertex of c of index li : + assert( lt == Triangulation::VERTEX ); + assert( c->vertex(li)->point() == p ); + + Vertex_handle v = c->vertex( (li+1)&3 ); + // v is another vertex of c + Cell_handle nc = c->neighbor(li); + // nc = neighbor of c opposite to the vertex associated with p + // nc must have vertex v : + int nli; + assert( nc->has_vertex( v, nli ) ); + // nli is the index of v in nc + + std::ofstream oFileT("output",ios::out); + // writing file output; + oFileT << T; + + return 0; +} +\end{verbatim} \clearpage -\begin{ccClass}{CGAL_Triangulation_utils_3} +\begin{ccClass}{Triangulation_utils_3} \section{A Class of Tools \protect \ccClassTemplateName} \label{Triangulation3-sec-class-Utils} @@ -223,7 +322,7 @@ Figure~\ref{Triangulation3-fig-utils}). \end{ccClass} -\begin{ccClassTemplate}{CGAL_Triangulation_3} +\begin{ccClassTemplate}{Triangulation_3} \section{The Triangulation Class \protect \ccClassTemplateName} \ccDefinition @@ -237,7 +336,7 @@ and~\ref{Triangulation3-sec-class-Traits}. \ccInclude{CGAL/Triangulation_3.h} \ccInheritsFrom -\ccc{CGAL_Triangulation_utils_3} +\ccc{Triangulation_utils_3} (see Section~\ref{Triangulation3-sec-class-Utils}) \ccTypes @@ -278,7 +377,8 @@ A handle is a type which supports the two dereference operators bidirectionnel and non mutable. Circulators and iterators are assignable to the corresponding handle types. Whenever a handle appears in the parameter list of a function, an appropriate iterator or -circulator can be used as well \textit{not yet implemented}. The edges and facets of the +circulator can be used as well \textit{(not yet implemented)}. The +edges and facets of the triangulation can also be visited through iterators and circulators which are bidirectionnel and non mutable. @@ -314,7 +414,7 @@ OUTSIDE_AFFINE_HULL};} {Introduces a triangulation \ccVar\ having only one vertex which is the infinite vertex.} -\ccConstructor{\ccClassName(const CGAL_Triangulation_3 & tr);} +\ccConstructor{\ccClassName(const Triangulation_3 & tr);} {Copy constructor. All the vertices and faces are duplicated. \ccVar\ and \ccc{tr}\ refer to different triangulations. After the copy, if \ccc{tr} is modified, \ccVar\ is not modified.} @@ -325,19 +425,22 @@ deleted.} \ccHeading{Assignment} -\ccMethod{CGAL_Triangulation_3 - operator=(const CGAL_Triangulation_3 & tr);} +\ccMethod{Triangulation_3 + operator=(const Triangulation_3 & tr);} {The triangulation is duplicated, and modifying one after the copy does not modify the other.} -\ccMethod{copy_triangulation - (const CGAL_Triangulation_3 & tr);} +\ccMethod{void copy_triangulation + (const Triangulation_3 & tr);} {The triangulation is duplicated.} -\ccMethod{void swap(CGAL_Triangulation_3 & tr);} +The previous first two methods are equivalent. + +\ccMethod{void swap(Triangulation_3 & tr);} {The triangulations \ccc{tr} and \ccVar\ are swapped. \ccc{\ccVar.swap(tr)} should be preferred to \ccVar\ = \ccc{tr} or to -\ccc{t(tr)} if \ccc{tr} is deleted after that.} +\ccc{t(tr)} if \ccc{tr} is deleted after that. Indeed, there is no +copy of cells and vertices, thus this method runs in constant time.} \ccAccessFunctions \ccMethod{const Traits & geom_traits() const;} @@ -553,69 +656,69 @@ triangulation, \ccc{lt} is set to \ccc{OUTSIDE_AFFINE_HULL} and {Same as the previous method, but \ccc{start} is used as a starting place for the location.} -\ccMethod{CGAL_Bounded_side +\ccMethod{Bounded_side side_of_cell(const Point & p, Cell_handle c, Locate_type & lt, int & li, int & lj) const;} {Returns on which side of the oriented boundary of \ccc{c} lies the point \ccc{p}. More precisely, it returns:\\ -- \ccc{CGAL_ON_BOUNDED_SIDE} if \ccc{p} is inside the cell (for an infinite +- \ccc{ON_BOUNDED_SIDE} if \ccc{p} is inside the cell (for an infinite cell this means that \ccc{p} lies strictly in the half space limited by its finite facet) \\ -- \ccc{CGAL_ON_BOUNDARY} if p on the boundary of the cell (for an infinite +- \ccc{ON_BOUNDARY} if p on the boundary of the cell (for an infinite cell this means that \ccc{p} lies on the *finite* facet). Then \ccc{lt} together with \ccc{li} and \ccc{lj} give the precise location on the boundary (see the descriptions of \ccc{locate} methods)\\ -- \ccc{CGAL_ON_UNBOUNDED_SIDE} if \ccc{p} lies outside the cell (for an +- \ccc{ON_UNBOUNDED_SIDE} if \ccc{p} lies outside the cell (for an infinite cell this means that \ccc{p} is not in the preceding two cases). \ccPrecond{\ccc{\ccVar.dimension()} $=3$}} -\ccMethod{CGAL_Bounded_side +\ccMethod{Bounded_side side_of_facet(const Point & p, const Facet & f, Locate_type & lt, int & li, int & lj) const;} {Returns on which side of the oriented boundary of \ccc{f} lies the point \ccc{p}:\\ -- \ccc{CGAL_ON_BOUNDED_SIDE} if \ccc{p} is inside the facet (for an +- \ccc{ON_BOUNDED_SIDE} if \ccc{p} is inside the facet (for an infinite facet this means that \ccc{p} lies strictly in the half plane limited by its finite edge) \\ -- \ccc{CGAL_ON_BOUNDARY} if \ccc{p} is on the boundary of the facet +- \ccc{ON_BOUNDARY} if \ccc{p} is on the boundary of the facet (for an infinite facet this means that \ccc{p} lies on the finite edge). \ccc{lt}, \ccc{li} and \ccc{lj} give the precise location of \ccc{p} on the boundary of the facet. \ccc{li} and \ccc{lj} refer to indices in the cell \ccc{c} storing \ccc{f}\\ -- \ccc{CGAL_ON_UNBOUNDED_SIDE} if \ccc{p} lies outside the facet (for +- \ccc{ON_UNBOUNDED_SIDE} if \ccc{p} lies outside the facet (for an infinite facet this means that \ccc{p} is not in the preceding two cases) \ccPrecond{\ccc{\ccVar.dimension()} $=2$ and \ccc{p} lies in the plane containing the triangulation. \ccc{f.first} $=3$ (in dimension~2 there is only one facet per cell).}} \ccGlue -\ccMethod{CGAL_Bounded_side +\ccMethod{Bounded_side side_of_facet(const Point & p, Cell_handle c, Locate_type & lt, int & li, int & lj) const;} {Same as the previous method for the facet \ccc{(c,3)}.} -\ccMethod{CGAL_Bounded_side +\ccMethod{Bounded_side side_of_edge(const Point & p, const Edge & e, Locate_type & lt, int & li) const;} {Returns on which side of the oriented boundary of \ccc{e} lies the point \ccc{p}:\\ -- \ccc{CGAL_ON_BOUNDED_SIDE} if \ccc{p} is inside the edge (for an +- \ccc{ON_BOUNDED_SIDE} if \ccc{p} is inside the edge (for an infinite edge this means that \ccc{p} lies in the half line defined by the vertex)\\ -- \ccc{CGAL_ON_BOUNDARY} if \ccc{p} equals one of the vertices, +- \ccc{ON_BOUNDARY} if \ccc{p} equals one of the vertices, \ccc{li} give the index of the vertex in the cell storing \ccc{e}\\ -- \ccc{CGAL_ON_UNBOUNDED_SIDE} if \ccc{p} lies outside the edge (for +- \ccc{ON_UNBOUNDED_SIDE} if \ccc{p} lies outside the edge (for an infinite edge this means that \ccc{p} lies on the other half line)\\ \ccPrecond{\ccc{\ccVar.dimension()} $=1$ and \ccc{p} is collinear with the points of the triangulation. \ccc{e.first} $=0$ and \ccc{e.second} $=1$ (in dimension~2 there is only one edge per cell).}} \ccGlue -\ccMethod{CGAL_Bounded_side +\ccMethod{Bounded_side side_of_edge(const Point & p, Cell_handle c, Locate_type & lt, int & li) const;} @@ -691,8 +794,8 @@ inside cell \ccc{c}.}} {Inserts point \ccc{p} in facet \ccc{f}. In dimension~3, the 2 neighboring cells are split into 3 tetrahedra; in dimension~2, the facet is split into 3 triangles. -\ccPrecond{\ccc{\ccVar.dimension()} $\geq 2$ and \ccc{p} lies inside -face \ccc{f}.}} +\ccPrecond{\ccc{\ccVar.dimension()} $\geq 2$ and \ccc{p} lies strictly +inside face \ccc{f}.}} \ccGlue \ccMethod{Vertex_handle insert_in_facet(const Point & p, Cell_handle c, int i);} @@ -717,7 +820,7 @@ dimension~1.}} \ccMethod{Vertex_handle insert_outside_convex_hull(const Point & p, Cell_handle c, int li, int lj=0);} -{\ccc{c}, together with \ccc{li} and possibly \ccc{lj}, give a +{The cell \ccc{c}, together with \ccc{li} and possibly \ccc{lj}, give a separator (facet, edge or vertex, depending on the dimension) for \ccc{p} from the triangulation (see the description of method \ccc{locate()} for more details on the way the separator is represented).\\ @@ -792,7 +895,7 @@ and \ccc{Vertex}. They are all invalidated by any change in the triangulation. \ccMethod{Vertex_iterator finite_vertices_begin() const;} -{Starts at an arbitrary finite vertex. Then \ccc{$++$} and \ccc{$--$} will +{Starts at an arbitrary finite vertex. Then \ccc{++} and \ccc{--} will iterate on finite vertices. Returns \ccc{vertices_end()} when \ccc{\ccVar.number_of_vertices()} $<1$.} \ccGlue @@ -805,7 +908,7 @@ ones). Returns \ccc{vertices_end()} when {Past-the-end iterator} \ccMethod{Edge_iterator finite_edges_begin() const;} -{Starts at an arbitrary finite edge. Then \ccc{$++$} and \ccc{$--$} will +{Starts at an arbitrary finite edge. Then \ccc{++} and \ccc{--} will iterate on finite edges. Returns \ccc{edges_end()} when \ccc{\ccVar.dimension()} $<1$.} \ccGlue @@ -817,7 +920,7 @@ ones). Returns \ccc{edges_end()} when \ccc{\ccVar.dimension()} $<1$.} {Past-the-end iterator} \ccMethod{Facet_iterator finite_facets_begin() const;} -{Starts at an arbitrary finite facet. Then \ccc{$++$} and \ccc{$--$} will +{Starts at an arbitrary finite facet. Then \ccc{++} and \ccc{--} will iterate on finite facets. Returns \ccc{facets_end()} when \ccc{\ccVar.dimension()} $<2$.} \ccGlue @@ -830,7 +933,7 @@ ones). Returns \ccc{facets_end()} when {Past-the-end iterator} \ccMethod{Cell_iterator finite_cells_begin() const;} -{Starts at an arbitrary finite cell. Then \ccc{$++$} and \ccc{$--$} will +{Starts at an arbitrary finite cell. Then \ccc{++} and \ccc{--} will iterate on finite cells. Returns \ccc{cells_end()} when \ccc{\ccVar.dimension()} $<3$.} \ccGlue @@ -907,7 +1010,7 @@ debugging. \ccMethod{bool is_valid(bool verbose = false) const;} -{Checks the combinatorial validity of the triangulation and also the +{Checks the combinatorial validity of the triangulation. Checks also the validity of its geometric embedding (see Section~\ref{Triangulation3-sec-Valid}). When \ccc{verbose} is set to true, messages describing the first invalidity encountered are printed.\\ @@ -936,7 +1039,7 @@ corresponding input operators of the vertex and the cell classes. Assigns the resulting triangulation to \ccc{t}.} \ccFunction{ostream& operator<< -(ostream& os, const CGAL_Triangulation_3 &t);} +(ostream& os, const Triangulation_3 &t);} {Writes the triangulation \ccc{t} into \ccc{os}.} The information in the \ccc{iostream} is: the dimension, the number of @@ -949,7 +1052,7 @@ of maximal dimension.) \end{ccClassTemplate} -\begin{ccClassTemplate}{CGAL_Triangulation_vertex_3} +\begin{ccClassTemplate}{Triangulation_vertex_3} \section{The Vertex Class of a Triangulation \protect \ccClassTemplateName} \label{Triangulation3-sec-class-Vertex} @@ -973,9 +1076,9 @@ defined in the class \ccc{Triangulation_3}: \ccGlue \ccTypedef{typedef typename Tds::Cell Ctds;}{cell of the triangulation data structure} \ccGlue -\ccTypedef{typedef CGAL_Triangulation_vertex_handle_3 Vertex_handle;}{handle to a vertex} +\ccTypedef{typedef Triangulation_vertex_handle_3 Vertex_handle;}{handle to a vertex} \ccGlue -\ccTypedef{typedef CGAL_Triangulation_cell_handle_3 Cell_handle;}{handle to a cell} +\ccTypedef{typedef Triangulation_cell_handle_3 Cell_handle;}{handle to a cell} \begin{ccAdvanced} \ccCreation @@ -1034,7 +1137,7 @@ of maximal dimension (Section~\ref{Triangulation3-sec-degen_dim}).} \end{ccClassTemplate} -\begin{ccClassTemplate}{CGAL_Triangulation_cell_3} +\begin{ccClassTemplate}{Triangulation_cell_3} \section{The Cell Class of a Triangulation \protect \ccClassTemplateName} \label{Triangulation3-sec-class-Cell} @@ -1056,7 +1159,7 @@ dimension: (Section~\ref{Triangulation3-sec-degen_dim}). \ccTypes The class \ccClassTemplateName\ defines the same types as the -\ccc{CGAL_Triangulation_vertex_3} class. +\ccc{Triangulation_vertex_3} class. \begin{ccAdvanced} \ccCreation @@ -1168,7 +1271,7 @@ computes the index \ccc{i} of the neighbor.} \label{Triangulation3-sec-Traits} The first template parameter of the triangulation class -\ccc{CGAL_Triangulation_3} of \cgal\ is the geometric traits class. +\ccc{Triangulation_3} of \cgal\ is the geometric traits class. The first subsection of this section describes the requirements that the geometric traits class must fulfill. The second subsection @@ -1180,12 +1283,12 @@ presents a predefined geometric traits class available in \cgal. \protect \ccClassName} \label{Triangulation3-sec-concept-Traits} -\subsubsection{To be used by \protect \ccc{CGAL_Triangulation_3}} +\subsubsection{To be used by \protect \ccc{Triangulation_3}} \ccCreationVariable{traits} The geometric traits class \ccClassName\ of the triangulation -class \ccc{CGAL_Triangulation_3} must define the geometric +class \ccc{Triangulation_3} must define the geometric objects (points, segments, triangles and tetrahedra) forming the triangulation together with a few geometric predicates on these objects: equality, coordinates comparison, orientation in the space, orientation @@ -1225,36 +1328,36 @@ can be provided. \ccMethod{bool equal(const Point & p, const Point & q) const;} {Equality test.} -\ccMethod{CGAL_Comparison_result compare_x(const Point & p, const Point +\ccMethod{Comparison_result compare_x(const Point & p, const Point & q) const;} -{Comparison of \ccc{x}-coordinates. Returns \ccc{CGAL_LARGER} -(resp. \ccc{CGAL_EQUAL}, \ccc{CGAL_SMALLER}) when the \ccc{x} +{Comparison of \ccc{x}-coordinates. Returns \ccc{LARGER} +(resp. \ccc{EQUAL}, \ccc{SMALLER}) when the \ccc{x} coordinate of \ccc{p} is larger than (resp. equal to, smaller than) the \ccc{x} coordinate of \ccc{q}.} \ccGlue -\ccMethod{CGAL_Comparison_result compare_y(const Point & p, const Point +\ccMethod{Comparison_result compare_y(const Point & p, const Point & q) const;} {Comparison of \ccc{y}-coordinates.} \ccGlue -\ccMethod{CGAL_Comparison_result compare_z(const Point & p, const Point +\ccMethod{Comparison_result compare_z(const Point & p, const Point & q) const;} {Comparison of \ccc{z}-coordinates.} -\ccMethod{CGAL_Orientation orientation(const Point& p0, +\ccMethod{Orientation orientation(const Point& p0, const Point& p1, const Point& p2, const Point& p3) const;} {Orientation test in three dimensions.} -\ccMethod{CGAL_Orientation orientation_in_plane +\ccMethod{Orientation orientation_in_plane (const Point & q, const Point & r, const Point & s, const Point & test) const;} {When \ccc{test, q, r, s} are coplanar, tests whether \ccc{test} is on the -same side of \ccc{(q, r)} as \ccc{s}. Returns \ccc{CGAL_COLLINEAR} if -\ccc{test, q, r} are collinear, \ccc{CGAL_POSITIVE} if \ccc{(q, r, test)} -and \ccc{(q, r, s)} have the same orientation, \ccc{CGAL_NEGATIVE} if +same side of \ccc{(q, r)} as \ccc{s}. Returns \ccc{COLLINEAR} if +\ccc{test, q, r} are collinear, \ccc{POSITIVE} if \ccc{(q, r, test)} +and \ccc{(q, r, s)} have the same orientation, \ccc{NEGATIVE} if \ccc{(q, r, test)} and \ccc{(q, r, s)} have opposite orientations. \ccPrecond{\ccc{test,q,r,s} are coplanar and \ccc{q,r,s} are not collinear.}} @@ -1264,7 +1367,7 @@ and \ccc{(q, r, s)} have the same orientation, \ccc{CGAL_NEGATIVE} if {Collinearity test.} \subsubsection{To be used by \protect -\ccc{CGAL_Delaunay_triangulation_3}} +\ccc{Delaunay_triangulation_3}} In addition to the requirements described before, the geometric traits class of a @@ -1272,7 +1375,7 @@ Delaunay triangulation must fulfill the following requirements: \ccHeading{Predicates} -\ccMethod{CGAL_Oriented_side +\ccMethod{Oriented_side side_of_oriented_sphere(const Point & p, const Point & q, const Point & r, @@ -1281,23 +1384,23 @@ Delaunay triangulation must fulfill the following requirements: {Computes the side of point \ccc{test} with respect to the oriented sphere circumscribing \ccc{p,q,r,s}.} -\ccMethod{CGAL_Oriented_side +\ccMethod{Oriented_side side_of_oriented_circle(const Point & p, const Point & q, const Point & r, const Point & test) const;} -{computes the side of \ccc{test} with respect to the oriented circle +{Computes the side of \ccc{test} with respect to the oriented circle circumscribing \ccc{p,q,r}. \ccPrecond{\ccc{p,q,r,test} are coplanar.}} \subsubsection{To be used by \protect -\ccc{CGAL_Delaunay_hierarchic_triangulation_3}} +\ccc{Delaunay_hierarchic_triangulation_3}} \textit{Not yet implemented} \end{ccClass} - \begin{ccClassTemplate}{CGAL_Triangulation_geom_traits_3} + \begin{ccClassTemplate}{Triangulation_geom_traits_3} \subsection{The Class \protect \ccClassTemplateName} \label{Triangulation3-sec-class-Traits} @@ -1314,13 +1417,13 @@ Section~\ref{Triangulation3-sec-concept-Traits}. \ccTypes -\ccTypedef{typedef CGAL_Point_3 Point;}{} +\ccTypedef{typedef Point_3 Point;}{} \ccGlue -\ccTypedef{typedef CGAL_Segment_3 Segment;}{} +\ccTypedef{typedef Segment_3 Segment;}{} \ccGlue -\ccTypedef{typedef CGAL_Triangle_3 Triangle;}{} +\ccTypedef{typedef Triangle_3 Triangle;}{} \ccGlue -\ccTypedef{typedef CGAL_Tetrahedron_3 Tetrahedron;}{} +\ccTypedef{typedef Tetrahedron_3 Tetrahedron;}{} \end{ccClassTemplate} @@ -1328,32 +1431,32 @@ Section~\ref{Triangulation3-sec-concept-Traits}. \label{Triangulation3-sec-tds} The second template parameter of the basic triangulation class -\ccc{CGAL_Triangulation_3} is a triangulation data structure +\ccc{Triangulation_3} is a triangulation data structure class. This class can be seen as a container for the cells and vertices maintaining incidence and adjacency relations. The concept for the triangulation data structure is described in Section~\ref{TDS3-sec-concept} of Chapter~\ref{chapter-TDS3}. Its optional arguments related to geometry are compulsory for this use as a -template parameter of \ccc{CGAL_Triangulation_3}. +template parameter of \ccc{Triangulation_3}. A model of this triangulation data structure is -\ccc{CGAL_Triangulation_data_structuree_3} presented in +\ccc{Triangulation_data_structuree_3} presented in Section~\ref{TDS3-sec-class}. -\begin{ccClassTemplate}{CGAL_Delaunay_triangulation_3} +\begin{ccClassTemplate}{Delaunay_triangulation_3} \section{The Delaunay Triangulation Class \protect \ccClassTemplateName} \ccDefinition \ccInclude{CGAL/Delaunay_triangulation_3.h} -\ccInheritsFrom{\ccc{CGAL_Triangulation_3}} +\ccInheritsFrom{\ccc{Triangulation_3}} \ccCreationVariable{dt} \ccTypes -Inherits the types of \ccc{CGAL_Triangulation_3}. +Inherits the types of \ccc{Triangulation_3}. \ccCreation @@ -1364,13 +1467,17 @@ Inherits the types of \ccc{CGAL_Triangulation_3}. {Creates an empty Delaunay triangulation with traits class \ccc{traits}.} -\ccConstructor{\ccClassName(const CGAL_Delaunay_triangulation_3 & dt1)} +\ccConstructor{\ccClassName(const Delaunay_triangulation_3 & dt1)} {Copy constructor.} \ccModifiers \ccHeading{Insertion} +The following methods, which already exist in triangulations, are +overloaded to ensure the empty sphere property of Delaunay +triangulations. + \ccMethod{Vertex_handle insert(const Point & p );} {Inserts point \ccc{p} in the triangulation and returns the corresponding vertex. Similar to the insertion in a triangulation, but insures in @@ -1408,45 +1515,45 @@ number of inserted points. \ccHeading{Queries} -\ccMethod{CGAL_Bounded_side +\ccMethod{Bounded_side side_of_sphere(Cell_handle c, const Point & p) const;} {Returns on which side of the circumscribed sphere of \ccc{c} lies the point \ccc{p}. More precisely, it returns:\\ -- \ccc{CGAL_ON_BOUNDED_SIDE} if \ccc{p} is inside the sphere (for an infinite +- \ccc{ON_BOUNDED_SIDE} if \ccc{p} is inside the sphere (for an infinite cell this means that \ccc{p} lies strictly either in the half space limited by its finite facet, or in the interior of the disk circumscribing the *finite* facet) \\ -- \ccc{CGAL_ON_BOUNDARY} if p on the boundary of the sphere (for an infinite +- \ccc{ON_BOUNDARY} if p on the boundary of the sphere (for an infinite cell this means that \ccc{p} lies on the circle circumscribing the *finite* facet)\\ -- \ccc{CGAL_ON_UNBOUNDED_SIDE} if \ccc{p} lies outside the sphere (for an +- \ccc{ON_UNBOUNDED_SIDE} if \ccc{p} lies outside the sphere (for an infinite cell this means that \ccc{p} is not in the preceding two cases). \ccPrecond{\ccc{\ccVar.dimension()} $=3$.}} -\ccMethod{CGAL_Bounded_side +\ccMethod{Bounded_side side_of_circle(const Facet & f, const Point & p) const;} {Returns on which side of the circumscribed circle of \ccc{f} lies the point \ccc{p}. More precisely, it returns:\\ - in dimension~3:\\ --- for a finite facet, \ccc{CGAL_ON_BOUNDARY} if \ccc{p} lies -on the circle, \ccc{CGAL_ON_UNBOUNDED_SIDE} when it lies in the exterior of -the disk, \ccc{CGAL_ON_BOUNDED_SIDE} when it lies in its interior.\\ +-- for a finite facet, \ccc{ON_BOUNDARY} if \ccc{p} lies +on the circle, \ccc{ON_UNBOUNDED_SIDE} when it lies in the exterior of +the disk, \ccc{ON_BOUNDED_SIDE} when it lies in its interior.\\ -- for an infinite facet, it considers the plane defined by the finite facet of the same cell, and does the same as in dimension~2 in this plane.\\ - in dimension~2:\\ --- for a finite facet, \ccc{CGAL_ON_BOUNDARY} if \ccc{p} lies -on the circle, \ccc{CGAL_ON_UNBOUNDED_SIDE} when it lies in the exterior of -the disk, \ccc{CGAL_ON_BOUNDED_SIDE} when it lies in its interior.\\ --- for an infinite facet, \ccc{CGAL_ON_BOUNDARY} if the +-- for a finite facet, \ccc{ON_BOUNDARY} if \ccc{p} lies +on the circle, \ccc{ON_UNBOUNDED_SIDE} when it lies in the exterior of +the disk, \ccc{ON_BOUNDED_SIDE} when it lies in its interior.\\ +-- for an infinite facet, \ccc{ON_BOUNDARY} if the point lies on the finite edge of \ccc{f} (endpoints included), -\ccc{CGAL_ON_BOUNDED_SIDE} for a point in the open half-plane defined -by \ccc{f}, \ccc{CGAL_ON_UNBOUNDED_SIDE} elsewhere. +\ccc{ON_BOUNDED_SIDE} for a point in the open half-plane defined +by \ccc{f}, \ccc{ON_UNBOUNDED_SIDE} elsewhere. \ccPrecond{\ccc{\ccVar.dimension()} $\geq 2$.}} -\ccMethod{CGAL_Bounded_side +\ccMethod{Bounded_side side_of_circle(Cell_handle c, int i, const Point & p);} -{Same as the previous method.} +{Same as the previous method for facet \ccc{i} of cell \ccc{c}.} \begin{ccAdvanced} \ccHeading{Checking} @@ -1464,7 +1571,7 @@ This method is mainly a debugging help for the users of advanced features. \end{ccClassTemplate} -\begin{ccClassTemplate}{CGAL_Delaunay_hierarchic_triangulation_3} +\begin{ccClassTemplate}{Delaunay_hierarchic_triangulation_3} \section{The Hierarchic Delaunay Triangulation Class \protect \ccClassTemplateName} @@ -1491,13 +1598,13 @@ To work around this problem, two functions have been defined to transform \ccc{handles} into usual $C^{++}$ pointers for debugging purposes. \ccFunction{template - CGAL_Triangulation_vertex_3 * -CGAL_debug(const CGAL_Triangulation_vertex_handle_3 v);} + Triangulation_vertex_3 * +debug(const Triangulation_vertex_handle_3 v);} {} \ccFunction{template - CGAL_Triangulation_cell_3 * - CGAL_debug(const CGAL_Triangulation_cell_handle_3 + Triangulation_cell_3 * + debug(const Triangulation_cell_handle_3 c);} {} diff --git a/Packages/Triangulation_3/doc_tex/basic/Triangulation_3/TDS3.tex b/Packages/Triangulation_3/doc_tex/basic/Triangulation_3/TDS3.tex index de3b5e6ec54..200899274f9 100644 --- a/Packages/Triangulation_3/doc_tex/basic/Triangulation_3/TDS3.tex +++ b/Packages/Triangulation_3/doc_tex/basic/Triangulation_3/TDS3.tex @@ -25,12 +25,28 @@ \section{Introduction} \label{TDS3-sec-intro} -\subsection{Definition} +A three-dimensional triangulation is a three-dimensional simplicial +complex, pure connected and without singularities \cite{by-ag-98}. It +is a set of cells ($3$-faces, tetrahedra) such that two cells +either do not intersect or share a common facet ($2$-face), edge +($1$-face) or vertex ($0$-face). + +A geometric triangulation has two aspects: the combinatorial structure which +gives the incidence and adjacency relations between faces, and the +geometric information related to the position of vertices. + +\cgal\ proposes 3D geometric triangulations in which these +two aspects are clearly separated. + +This chapter deals with 3D- triangulation data structures, meant to +maintain the combinatorial information for 3D-geometric +triangulations. The reader interested in geometric triangulations of +$\R^3$ is advised to read Chapter~\ref{chapter-Triangulation3}. + +\subsection{Representation} \label{TDS3-sec-def} -A 3D- triangulation data structure is meant to maintain the combinatorial -information (incidence and adjacency relations) for 3D-geometric -triangulations. In \cgal, a triangulation data structure is a +In \cgal, a triangulation data structure is a container of cells ($3$-faces) and vertices ($0$-faces). Each cell gives access to its four incident vertices and to its four adjacent cells. Each vertex gives access to one of its incident cells. @@ -38,7 +54,21 @@ cells. Each vertex gives access to one of its incident cells. The four vertices of a cell are indexed with 0, 1, 2 and 3. The neighbors of a cell are also indexed with 0, 1, 2, 3 in such a way that the neighbor indexed by $i$ is opposite to the vertex -with the same index. +with the same index (see Figure~\ref{TDS3-fig-repres}). + +\begin{ccTexOnly} +\begin{figure} +\begin{center} +\includegraphics{repres.eps} +\end{center} +\caption{Representation \label{TDS3-fig-repres}} +\end{figure} +\end{ccTexOnly} + +\begin{ccHtmlOnly} + +\end{ccHtmlOnly} Edges ($1$-faces) and facets ($2$-faces) are not explicitely represented: a facet is given by a cell and an index (the facet @@ -57,7 +87,7 @@ is not of full dimension. As described in Chapter~\ref{chapter-Triangulation3}, a geometric triangulation of a set of points in $\R^d$ is a partition of the whole space $\R^d$ into cells having $d+1$ vertices: some of them -are infinite, they are obtained by liking an additional vertex at +are infinite, they are obtained by linking an additional vertex at infinity to each facet of the convex hull of the points. The underlying combinatorial triangulation of such a triangulation without boundary of $\R^d$ can be seen as a triangulation of the @@ -76,15 +106,51 @@ the boundary of a 4-dimensional simplex, which has 5 vertices. A geometric embedding consists in choosing one of these vertices to be infinite, thus four of the five 3-cells becomes infinite: the geometric triangulation has one finite tetrahedron remaining, each of its facets -being incident to the infinite cell. +being incident to the infinite cell. See Figure~\ref{TDS3-fig-topo-simplex4}. +\begin{ccTexOnly} +\begin{figure} +\begin{center} +\includegraphics{topo-simplex4.eps} +\end{center} +\caption{4D simplex and a 3D geometric embedding \label{TDS3-fig-topo-simplex4}} +\end{figure} +\end{ccTexOnly} +\begin{ccHtmlOnly} + +\end{ccHtmlOnly} \item \emph{dimension 2.} We have 4 vertices forming one 3-dimensional simplex, i.e. the boundary of a tetrahedron. The geometric embedding in the plane consists in choosing one of these vertices to be infinite, then the geometric triangulation has one finite triangle whose edges are -adjacent to the infinite triangles. See Figure~\ref{TDS3-fig-topo-simplex}. +adjacent to the infinite triangles. See Figure~\ref{TDS3-fig-topo-simplex3}. +\begin{ccTexOnly} +\begin{figure} +\begin{center} +\includegraphics{topo-simplex3.eps} +\end{center} +\caption{3D simplex and a 2D geometric embedding \label{TDS3-fig-topo-simplex3}} +\end{figure} +\end{ccTexOnly} +\begin{ccHtmlOnly} + +\end{ccHtmlOnly} \item \emph{dimension 1.} A 2-dimensional simplex (a triangle) has 3 vertices. The geometric embedding is and edge whose vertices are linked -to an infinite point. +to an infinite point. See Figure~\ref{TDS3-fig-topo-simplex2}. +\begin{ccTexOnly} +\begin{figure} +\begin{center} +\includegraphics{topo-simplex2.eps} +\end{center} +\caption{2D simplex and a 1D geometric embedding \label{TDS3-fig-topo-simplex2}} +\end{figure} +\end{ccTexOnly} +\begin{ccHtmlOnly} + +\end{ccHtmlOnly} \end{itemize} The last two cases are defined uniquely: @@ -105,20 +171,6 @@ triangulation data structure. The infinite vertex of the geometric embedding is a vertex without any particularity in the combinatorial triangulation. -\begin{ccTexOnly} -\begin{figure} -\begin{center} -\includegraphics{topo-simplex.eps} -\end{center} -\caption{3D simplex and its 2D geometric embedding \label{TDS3-fig-topo-simplex}} -\end{figure} -\end{ccTexOnly} - -\begin{ccHtmlOnly} - -\end{ccHtmlOnly} - The implicit representation of facets (resp. edges) still holds for degenerate ($< 3$) dimensions : in dimension~2, each cell has only one facet of index 3, and 3 edges $(0,1)$, $(1,2)$ and $(2,0)$; in @@ -189,29 +241,144 @@ software design in this case. Layers in the software design \end{ccHtmlOnly} -In the bottom -layer, the base classes store elementary geometric information as -well as any other information for the given application. The middle -layer class stores the triangulation data structure, which is purely -combinatorial. It provides operations such as insertion of a new -vertex in a given cell, and is responsible for the combinatorial -integrity of the triangulation. The upper layer is the geometric -triangulation class, providing operations such as location of a point -in the triangulation, insertion of a point, and is responsible for -the geometric validity. +In the bottom layer, the \cgal\ base classes store elementary +geometric information. These classes are parameterized by a geometric +traits class providing all the geometric types. A vertex has a pointer +to a cell, and a cell has four pointers to vertices. These pointers +are of type \ccc{void*}. -The triangulation data structure class is parameterized by the base -vertex and the base cell classes. It is up to the user to derive its -own base classes from the \cgal\ base classes, and to use the -triangulation data structure class proposed by \cgal. +The middle layer class stores the triangulation data structure, which +is purely combinatorial. A vertex of the triangulation data structure +has a pointer to a cell of the triangulation data structure, and a +cell has four pointers to vertices. These pointers are usual +\ccc{C++} pointers. The triangulation data structure provides +operations such as insertion of a new vertex in a given cell, on a +$1$ or $2$-face, or, if the dimension of the triangulation is smaller +than 3, outside the ``affine'' hull of the vertices, thus increasing +the dimension of the triangulation by one. The triangulation data +structure is responsible for the combinatorial integrity of the +triangulation. + +It is up to the user to derive its own base classes from the \cgal\ +base classes to add any other information the may need for his given +application, or to write his own base classes from scratch. In this +case, his base classes must be models for the concepts described in +Section~\ref{TDS3-sec-concept-Base}. As the triangulation data +structure class is parameterized by the base vertex and the base cell +classes. it will consider the user's bases classes instead of the +predefined base classes. + +The upper layer, described in Chapter~\ref{chapter-Triangulation3}, is +the geometric triangulation class, providing operations such as +location of a point in the triangulation, insertion of a point, and is +responsible for the geometric validity. A vertex of the triangulation +has a pointer to a cell and a cell has four pointers to +vertices. These pointers are \cgal\ \emph{handles}. The triangulation +data structure class is one of the template parameters of the +geometric triangulation class. The user may choose to replace the +\cgal\ triangulation data structure class by its own triangulation +data structure, in this case, his class has to be a model of the +concept described in Section~\ref{TDS3-sec-concept}. \section{Examples} \label{TDS3-sec-examples} +The following example shows how to construct a 3D triangulation data +structure by inserting vertices. +\begin{verbatim} +#include + +#include +#include +#include +#include + +#include + +#include +#include + +#include +#include +#include +#include + +// the definition of the geometric traits class is necessary to +// instanciate base vertices and cells but will in fact never be used +// in the program +typedef CGAL::Cartesian Rep; +typedef CGAL::Triangulation_geom_traits_3 Gt; + +typedef CGAL::Triangulation_vertex_base_3 Vb; +typedef CGAL::Triangulation_cell_base_3 Cb; + +typedef CGAL::Triangulation_data_structure_3 Tds; + +typedef typename Tds::Cell TDSCell; +typedef typename Tds::Vertex TDSVertex; + +int main() +{ + Tds T; + + assert( T.number_of_vertices() == 0 ); + assert( T.dimension() == -2 ); + assert( T.is_valid() ); + + std::vector V(5); + std::vector PV(7); + + PV[0] = T.insert_outside_affine_hull(V[0]); + assert( T.number_of_vertices() == 1 ); + assert( T.dimension() == -1 ); + assert( T.is_valid() ); + + int i; + // each of the following insertions of vertices increases the dimension + for ( i=1; i<5; i++ ) { + PV[i] = T.insert_outside_affine_hull(V[i], PV[0]); + assert( T.number_of_vertices() == i+1 ); + assert( T.dimension() == i-1 ); + assert( T.is_valid() ); + } + assert( T.number_of_cells() == 5 ); + + // we now have a simplex in dimension 4 + + // cell incident to PV[0] + TDSCell* c = PV[0]->cell(); + int ind; + assert( c->has_vertex( PV[0], ind ) ); + // PV[0] is the vertex of index ind in c + + // insertion of a new vertex in the facet opposite to PV[0] + PV[5] = T.insert_in_facet(TDSVertex(), c, ind); + + assert( T.number_of_vertices() == 6 ); + assert( T.dimension() == 3 ); + assert( T.is_valid() ); + + // insertion of a new vertex in c + PV[6] = T.insert_in_cell( TDSVertex(), c ); + + assert( T.number_of_vertices() == 7 ); + assert( T.dimension() == 3 ); + assert( T.is_valid() ); + + std::ofstream oFileT("output_tds",ios::out); + // writing file output_tds; + oFileT << T; + + return 0; +} +\end{verbatim} \clearpage \section{Concepts} +This section describes the concepts for a 3D- triangulation data +structure, its vertices and cells. + \subsection{Concepts for a 3D- Triangulation Data Structure} \label{TDS3-sec-concept} \begin{ccClassTemplate}{Tds} @@ -277,9 +444,12 @@ incident to a given edge. They are bidirectional and non mutable. \ccMethod{Tds operator=(const Tds & tds1);} {Assignment. All the vertices and cells are duplicated.} +The previous first two methods are equivalent. + \ccMethod{void swap(Tds & tds1);} {Swaps \ccVar\ and \ccc{tds1}. Should be preferred to \ccVar=\ccc{tds1} -or \ccVar(\ccc{tds1}) when tds1 is deleted after that.} +or \ccVar(\ccc{tds1}) when tds1 is deleted after that. Indeed, there is no +copy of cells and vertices, thus this method runs in constant time.} \ccMethod{Vertex* copy_tds(const Tds & tds1, Vertex* v = NULL);} {\ccc{tds1} is copied into \ccVar. The vertex of \ccVar\ @@ -288,7 +458,8 @@ corresponding to \ccc{v} is returned. \ccc{tds1}.}} \ccFunction{void \ccTilde\ccVar();} -{Destructor. All vertices and cells are deleted.} +{Destructor. All vertices and cells are deleted, and \ccVar\ itself is +deleted.} \ccAccessFunctions @@ -424,11 +595,12 @@ operation is exactly reciprocal to \ccc{\ccVar.insert_in_cell(v)}. \textit{not yet implemented}} \ccMethod{void clear();} -{Deletes all cells and vertices.} +{Deletes all cells and vertices. \ccVar\ is reset as a triangulation +data structure constructed by the default constructor.} In addition to these requirements, in order to be used as a triangulation data structure by the class -\ccc{CGAL_Delaunay_triangulation_3}, the triangulation +\ccc{Delaunay_triangulation_3}, the triangulation must offer the following method: \ccMethod{void star_region( set > & region, @@ -542,8 +714,6 @@ each cell given by their index in the preceding list of cells. \ccCreationVariable{v} -The vertex stores a point and a pointer to an incident cell. - The vertex class of a 3D- triangulation data structure must define the types and operations listed in this section. Some of these requirements are of geometric nature, they are \textit{optional} @@ -725,8 +895,8 @@ a precise indication on the kind of invalidity encountered.} \end{ccClass} -\begin{ccClassTemplate}{CGAL_Triangulation_data_structure_3} -\section{The Triangulation Data Structure Class\\ +\begin{ccClassTemplate}{Triangulation_data_structure_3} +\section{A model of Triangulation Data Structure:\\ \protect \ccClassTemplateName} \label{TDS3-sec-class} @@ -736,26 +906,24 @@ geometric functionalities. It is templated by base classes for vertices and cells described in Section~\ref{TDS3-sec-concept-Base}. \ccInheritsFrom -\ccc{CGAL_Triangulation_utils_3} +\ccc{Triangulation_utils_3} \\This class defines basic computations on indices of vertices and -neighbors of cells (see Section~\ref{Triangulation3-sec-class-Utils} of +neighbors of cells (Details are presented in +Section~\ref{Triangulation3-sec-class-Utils} of Chapter~\ref{chapter-Triangulation3}). \ccInclude{CGAL/Triangulation_data_structure_3.h} -The class \ccc{CGAL_Triangulation_ds_vertex_3} is a model for the vertex +The class \ccc{Triangulation_ds_vertex_3} is a model for the vertex concept described in Section~\ref{TDS3-sec-concept-Tds_Vertex}. \ccInclude{CGAL/Triangulation_ds_vertex_3.h} -The class \ccc{CGAL_Triangulation_ds_cell_3} is a model for the +The class \ccc{Triangulation_ds_cell_3} is a model for the cell concept described in Section~\ref{TDS3-sec-concept-Tds_Cell}. \ccInclude{CGAL/Triangulation_ds_cell_3.h} -\ccInheritsFrom -\ccc{CGAL_Triangulation_utils_3} - \end{ccClassTemplate} \section{Concepts for the Base Vertices and Cells} @@ -943,29 +1111,33 @@ a precise indication on the kind of invalidity encountered.} \end{ccClass} -\section{The Base Classes for Vertices and Cells} +\section{Models of Base Vertices and Cells} \label{TDS3-sec-class-Base} - \begin{ccClassTemplate}{CGAL_Triangulation_vertex_base_3} + \begin{ccClassTemplate}{Triangulation_vertex_base_3} \subsection{The Base Class \protect \ccClassTemplateName} \label{TDS3-sec-class-Base_Vertex} -This class is proposed by \cgal\ as a base vertex class. -It is templated by a geometric traits class. Using the same -geometric traits class \ccc{Traits} as the one used for -\ccc{CGAL_Triangulation_3} is strongly advised. In this way, the -point type defined by \ccClassName\ is the same as the point type -defined by the geometric traits class. +This class is proposed by \cgal\ as a base vertex class. It is +templated by a geometric traits class \ccc{Traits} that provides the +geometric types. The user who uses the geometric layer (see +Section~\ref{TDS3-sec-design} and +Chapter~\ref{chapter-Triangulation3}) is strongly advised to use the +same geometric traits class \ccc{Traits} as the one used for +\ccc{Triangulation_3}. In this way, the point type +defined by \ccClassName\ is the same as the point type defined by the +geometric traits class. The default geometric traits class proposed by +\cgal\ is presented in Section~\ref{Triangulation3-sec-Traits}. -This base class can be used directly or can serve as a base to derive -other base classes with some additionnal attribute (a color for example) -tuned for a specific application. +This base class can be used directly or can serve as a base to derive +other base classes with some additionnal attributes (a color for +example) tuned for a specific application. \ccInclude{CGAL/Triangulation_vertex_base_3.h} \end{ccClassTemplate} - \begin{ccClassTemplate}{CGAL_Triangulation_cell_base_3} + \begin{ccClassTemplate}{Triangulation_cell_base_3} \subsection{The Base Class \protect \ccClassTemplateName} This class is proposed by \cgal\ as a base cell class, and is similar @@ -975,4 +1147,3 @@ Section~\ref{TDS3-sec-class-Base_Vertex}). \ccInclude{CGAL/Triangulation_cell_base_3.h} \end{ccClassTemplate} - diff --git a/Packages/Triangulation_3/doc_tex/basic/Triangulation_3/Triangulation3.tex b/Packages/Triangulation_3/doc_tex/basic/Triangulation_3/Triangulation3.tex index 267df4975fb..0a977dbf3d7 100644 --- a/Packages/Triangulation_3/doc_tex/basic/Triangulation_3/Triangulation3.tex +++ b/Packages/Triangulation_3/doc_tex/basic/Triangulation_3/Triangulation3.tex @@ -46,7 +46,7 @@ fourth vertex an auxiliary vertex called the \ccc{infinite vertex}. In that way, each facet is incident to exactly two cells and special cases at the boundary of the convex hull are simple to deal with. -The class \ccc{CGAL_Triangulation_3} of \cgal\ implements this +The class \ccc{Triangulation_3} of \cgal\ implements this point of view and therefore considers the triangulation of the set of points as a set of finite and infinite tetrahedra. Notice that the infinite vertex has no significant coordinates and that no @@ -58,23 +58,45 @@ access to its four incident vertices and to its four adjacent cells. Each vertex gives access to one of its incident cells. The four vertices of a cell are indexed with 0, 1, 2 and 3 in positive -orientation. The neighbors of a cell are also indexed with 0, 1, 2, 3 -in such a way that the neighbor indexed by $i$ is opposite to the vertex -with the same index. +orientation, the orientation being defined by the orientation of the +underlying space $\R^3$. The neighbors of a cell are also indexed with +0, 1, 2, 3 in such a way that the neighbor indexed by $i$ is opposite +to the vertex with the same index. See +Figure~\ref{Triangulation3-fig-orient}. -Edges ($1$-faces) and facets ($2$-faces) are not explicitely represented: -a facet is given by a cell and an index (the facet +\begin{ccTexOnly} +\begin{figure}[htbp] +\begin{center} +\includegraphics{orient.eps} +\end{center} +\caption{Orientation of a cell (3-dimensional case) +\label{Triangulation3-fig-orient}} +\end{figure} +\end{ccTexOnly} + +\begin{ccHtmlOnly} +Orientation of a cell 
+(3-dimensional case) +\end{ccHtmlOnly} + +As in the underlying combinatorial triangulation (see +Chapter~\ref{chapter-TDS3}), edges ($1$-faces) and facets ($2$-faces) +are not explicitely +represented: a facet is given by a cell and an index (the facet \ccc{i} of a cell \ccc{c} is the facet of \ccc{c} that is opposite to the vertex of index \ccc{i}) and an edge is given by a cell and two -indices (the edge \ccc{(i,j)} of a cell \ccc{c} is the edge -whose endpoints are the vertices of indices \ccc{i} and \ccc{j} of -\ccc{c}). +indices (the edge \ccc{(i,j)} of a cell \ccc{c} is the edge whose +endpoints are the vertices of indices \ccc{i} and \ccc{j} of +\ccc{c}). See Figure~\ref{TDS3-fig-repres}. \subsection{Degenerate Dimensions} \label{Triangulation3-sec-degen_dim} -The class \ccc{CGAL_Triangulation_3} can deal with degenerate -dimensions: +The class \ccc{Triangulation_3} can deal with degenerate +dimensions. A triangulation of a set of points in $\R^d$ is a partition of the +whole space $\R^d$ into cells having $d+1$ vertices: some of them +are infinite, they are obtained by linking the additional infinite +vertex to each facet of the convex hull of the points. \begin{itemize} \item {} \emph{dimension 2:} when a triangulation only contains coplanar points (which is the case when there are only three points), @@ -121,21 +143,6 @@ When all the points are collinear, this condition becomes: {\bf (c-1D)} For any two adjacent edges $(u,v)$ and $(v,w)$, $u$ and $w$ lie on opposite sides of the common vertex $v$. -\begin{ccTexOnly} -\begin{figure}[htbp] -\begin{center} -\includegraphics{orient.eps} -\end{center} -\caption{Orientation of a cell (3-dimensional case) -\label{Triangulation3-fig-orient}} -\end{figure} -\end{ccTexOnly} - -\begin{ccHtmlOnly} -Orientation of a cell 
-(3-dimensional case) -\end{ccHtmlOnly} - The \ccc{is_valid()} method provided by \cgal\ checks the local validity of a given triangulation. This does not always ensure global validity \cite{mnssssu-cgpvg-96,dlpt-ccpps-98} but it is @@ -144,7 +151,7 @@ sufficient for practical cases. \section{Software Design} \label{Triangulation3-sec-design} -The class \ccc{CGAL_Triangulation_3} is designed to be used as +The class \ccc{Triangulation_3} is designed to be used as a layer upon a 3D-triangulation data structure as presented in Section~\ref{TDS3-sec-design} of Chapter~\ref{chapter-TDS3}. It provides high level geometric operations such as location of a point @@ -163,22 +170,114 @@ described in Chapter~\ref{chapter-TDS3}. Delaunay triangulations as well as hierarchical Delaunay triangulations \cite{d-iirdt-98} are also implemented in the package: -\ccc{CGAL_Delaunay_triangulation_3} inherits from -\ccc{CGAL_Triangulation_3} and -\ccc{CGAL_Delaunay_hierarchic_triangulation_3} inherits from -\ccc{CGAL_Delaunay_triangulation_3}. +\ccc{Delaunay_triangulation_3} inherits from +\ccc{Triangulation_3} and +\ccc{Delaunay_hierarchic_triangulation_3} inherits from +\ccc{Delaunay_triangulation_3}. \textit{(hierarchical +Delaunay triangulations are not yet implemented).} -\ccc{CGAL_Triangulation_3} derives from -\ccc{CGAL_Triangulation_utils_3}, which defines tools on +\ccc{Triangulation_3} derives from +\ccc{Triangulation_utils_3}, which defines tools on the indices of vertices in cells (see Section~\ref{Triangulation3-sec-class-Utils}). \section{Examples} \label{Triangulation3-sec-examples} +This example shows the incremental construction of a 3D triangulation, +the location of a point, and how to manipulate elementary operations +on indices in a cell. + +\begin{verbatim} +#include + +#include +#include +#include +#include + +#include +#include + +#include + +#include + +#include +#include +#include +#include +#include + +typedef CGAL::Cartesian Rep; + +typedef CGAL::Triangulation_geom_traits_3 Gt; +typedef CGAL::Triangulation_vertex_base_3 Vb; +typedef CGAL::Triangulation_cell_base_3 Cb; + +typedef CGAL::Triangulation_data_structure_3 TDS; +typedef CGAL::Triangulation_3 Triangulation; + +typedef typename Triangulation::Cell_handle Cell_handle; +typedef typename Triangulation::Vertex_handle Vertex_handle; +typedef typename Triangulation::Locate_type Locate_type; + +typedef Gt::Point Point; + +int main(int argc, char* argv[]) +{ + + Triangulation T; + + // insertion from a list : + std::list L; + L.push_front(Point(0,0,0)); + L.push_front(Point(1,0,0)); + L.push_front(Point(0,1,0)); + + int n = T.insert(L.begin(), L.end()); + + // insertion from a vector : + std::vector V(3); + V[0] = Point(0,0,1); + V[1] = Point(1,1,1); + V[2] = Point(2,2,2); + + n = n + T.insert(V.begin(), V.end()); + + // 6 points have been inserted : + assert( n == 6 ); + + // checking validity of T : + assert( T.is_valid(false) ); + + Locate_type lt; + int li, lj; + Point p(0,0,0); + Cell_handle c = T.locate(p, lt, li, lj); + // p is the vertex of c of index li : + assert( lt == Triangulation::VERTEX ); + assert( c->vertex(li)->point() == p ); + + Vertex_handle v = c->vertex( (li+1)&3 ); + // v is another vertex of c + Cell_handle nc = c->neighbor(li); + // nc = neighbor of c opposite to the vertex associated with p + // nc must have vertex v : + int nli; + assert( nc->has_vertex( v, nli ) ); + // nli is the index of v in nc + + std::ofstream oFileT("output",ios::out); + // writing file output; + oFileT << T; + + return 0; +} +\end{verbatim} \clearpage -\begin{ccClass}{CGAL_Triangulation_utils_3} +\begin{ccClass}{Triangulation_utils_3} \section{A Class of Tools \protect \ccClassTemplateName} \label{Triangulation3-sec-class-Utils} @@ -223,7 +322,7 @@ Figure~\ref{Triangulation3-fig-utils}). \end{ccClass} -\begin{ccClassTemplate}{CGAL_Triangulation_3} +\begin{ccClassTemplate}{Triangulation_3} \section{The Triangulation Class \protect \ccClassTemplateName} \ccDefinition @@ -237,7 +336,7 @@ and~\ref{Triangulation3-sec-class-Traits}. \ccInclude{CGAL/Triangulation_3.h} \ccInheritsFrom -\ccc{CGAL_Triangulation_utils_3} +\ccc{Triangulation_utils_3} (see Section~\ref{Triangulation3-sec-class-Utils}) \ccTypes @@ -278,7 +377,8 @@ A handle is a type which supports the two dereference operators bidirectionnel and non mutable. Circulators and iterators are assignable to the corresponding handle types. Whenever a handle appears in the parameter list of a function, an appropriate iterator or -circulator can be used as well \textit{not yet implemented}. The edges and facets of the +circulator can be used as well \textit{(not yet implemented)}. The +edges and facets of the triangulation can also be visited through iterators and circulators which are bidirectionnel and non mutable. @@ -314,7 +414,7 @@ OUTSIDE_AFFINE_HULL};} {Introduces a triangulation \ccVar\ having only one vertex which is the infinite vertex.} -\ccConstructor{\ccClassName(const CGAL_Triangulation_3 & tr);} +\ccConstructor{\ccClassName(const Triangulation_3 & tr);} {Copy constructor. All the vertices and faces are duplicated. \ccVar\ and \ccc{tr}\ refer to different triangulations. After the copy, if \ccc{tr} is modified, \ccVar\ is not modified.} @@ -325,19 +425,22 @@ deleted.} \ccHeading{Assignment} -\ccMethod{CGAL_Triangulation_3 - operator=(const CGAL_Triangulation_3 & tr);} +\ccMethod{Triangulation_3 + operator=(const Triangulation_3 & tr);} {The triangulation is duplicated, and modifying one after the copy does not modify the other.} -\ccMethod{copy_triangulation - (const CGAL_Triangulation_3 & tr);} +\ccMethod{void copy_triangulation + (const Triangulation_3 & tr);} {The triangulation is duplicated.} -\ccMethod{void swap(CGAL_Triangulation_3 & tr);} +The previous first two methods are equivalent. + +\ccMethod{void swap(Triangulation_3 & tr);} {The triangulations \ccc{tr} and \ccVar\ are swapped. \ccc{\ccVar.swap(tr)} should be preferred to \ccVar\ = \ccc{tr} or to -\ccc{t(tr)} if \ccc{tr} is deleted after that.} +\ccc{t(tr)} if \ccc{tr} is deleted after that. Indeed, there is no +copy of cells and vertices, thus this method runs in constant time.} \ccAccessFunctions \ccMethod{const Traits & geom_traits() const;} @@ -553,69 +656,69 @@ triangulation, \ccc{lt} is set to \ccc{OUTSIDE_AFFINE_HULL} and {Same as the previous method, but \ccc{start} is used as a starting place for the location.} -\ccMethod{CGAL_Bounded_side +\ccMethod{Bounded_side side_of_cell(const Point & p, Cell_handle c, Locate_type & lt, int & li, int & lj) const;} {Returns on which side of the oriented boundary of \ccc{c} lies the point \ccc{p}. More precisely, it returns:\\ -- \ccc{CGAL_ON_BOUNDED_SIDE} if \ccc{p} is inside the cell (for an infinite +- \ccc{ON_BOUNDED_SIDE} if \ccc{p} is inside the cell (for an infinite cell this means that \ccc{p} lies strictly in the half space limited by its finite facet) \\ -- \ccc{CGAL_ON_BOUNDARY} if p on the boundary of the cell (for an infinite +- \ccc{ON_BOUNDARY} if p on the boundary of the cell (for an infinite cell this means that \ccc{p} lies on the *finite* facet). Then \ccc{lt} together with \ccc{li} and \ccc{lj} give the precise location on the boundary (see the descriptions of \ccc{locate} methods)\\ -- \ccc{CGAL_ON_UNBOUNDED_SIDE} if \ccc{p} lies outside the cell (for an +- \ccc{ON_UNBOUNDED_SIDE} if \ccc{p} lies outside the cell (for an infinite cell this means that \ccc{p} is not in the preceding two cases). \ccPrecond{\ccc{\ccVar.dimension()} $=3$}} -\ccMethod{CGAL_Bounded_side +\ccMethod{Bounded_side side_of_facet(const Point & p, const Facet & f, Locate_type & lt, int & li, int & lj) const;} {Returns on which side of the oriented boundary of \ccc{f} lies the point \ccc{p}:\\ -- \ccc{CGAL_ON_BOUNDED_SIDE} if \ccc{p} is inside the facet (for an +- \ccc{ON_BOUNDED_SIDE} if \ccc{p} is inside the facet (for an infinite facet this means that \ccc{p} lies strictly in the half plane limited by its finite edge) \\ -- \ccc{CGAL_ON_BOUNDARY} if \ccc{p} is on the boundary of the facet +- \ccc{ON_BOUNDARY} if \ccc{p} is on the boundary of the facet (for an infinite facet this means that \ccc{p} lies on the finite edge). \ccc{lt}, \ccc{li} and \ccc{lj} give the precise location of \ccc{p} on the boundary of the facet. \ccc{li} and \ccc{lj} refer to indices in the cell \ccc{c} storing \ccc{f}\\ -- \ccc{CGAL_ON_UNBOUNDED_SIDE} if \ccc{p} lies outside the facet (for +- \ccc{ON_UNBOUNDED_SIDE} if \ccc{p} lies outside the facet (for an infinite facet this means that \ccc{p} is not in the preceding two cases) \ccPrecond{\ccc{\ccVar.dimension()} $=2$ and \ccc{p} lies in the plane containing the triangulation. \ccc{f.first} $=3$ (in dimension~2 there is only one facet per cell).}} \ccGlue -\ccMethod{CGAL_Bounded_side +\ccMethod{Bounded_side side_of_facet(const Point & p, Cell_handle c, Locate_type & lt, int & li, int & lj) const;} {Same as the previous method for the facet \ccc{(c,3)}.} -\ccMethod{CGAL_Bounded_side +\ccMethod{Bounded_side side_of_edge(const Point & p, const Edge & e, Locate_type & lt, int & li) const;} {Returns on which side of the oriented boundary of \ccc{e} lies the point \ccc{p}:\\ -- \ccc{CGAL_ON_BOUNDED_SIDE} if \ccc{p} is inside the edge (for an +- \ccc{ON_BOUNDED_SIDE} if \ccc{p} is inside the edge (for an infinite edge this means that \ccc{p} lies in the half line defined by the vertex)\\ -- \ccc{CGAL_ON_BOUNDARY} if \ccc{p} equals one of the vertices, +- \ccc{ON_BOUNDARY} if \ccc{p} equals one of the vertices, \ccc{li} give the index of the vertex in the cell storing \ccc{e}\\ -- \ccc{CGAL_ON_UNBOUNDED_SIDE} if \ccc{p} lies outside the edge (for +- \ccc{ON_UNBOUNDED_SIDE} if \ccc{p} lies outside the edge (for an infinite edge this means that \ccc{p} lies on the other half line)\\ \ccPrecond{\ccc{\ccVar.dimension()} $=1$ and \ccc{p} is collinear with the points of the triangulation. \ccc{e.first} $=0$ and \ccc{e.second} $=1$ (in dimension~2 there is only one edge per cell).}} \ccGlue -\ccMethod{CGAL_Bounded_side +\ccMethod{Bounded_side side_of_edge(const Point & p, Cell_handle c, Locate_type & lt, int & li) const;} @@ -691,8 +794,8 @@ inside cell \ccc{c}.}} {Inserts point \ccc{p} in facet \ccc{f}. In dimension~3, the 2 neighboring cells are split into 3 tetrahedra; in dimension~2, the facet is split into 3 triangles. -\ccPrecond{\ccc{\ccVar.dimension()} $\geq 2$ and \ccc{p} lies inside -face \ccc{f}.}} +\ccPrecond{\ccc{\ccVar.dimension()} $\geq 2$ and \ccc{p} lies strictly +inside face \ccc{f}.}} \ccGlue \ccMethod{Vertex_handle insert_in_facet(const Point & p, Cell_handle c, int i);} @@ -717,7 +820,7 @@ dimension~1.}} \ccMethod{Vertex_handle insert_outside_convex_hull(const Point & p, Cell_handle c, int li, int lj=0);} -{\ccc{c}, together with \ccc{li} and possibly \ccc{lj}, give a +{The cell \ccc{c}, together with \ccc{li} and possibly \ccc{lj}, give a separator (facet, edge or vertex, depending on the dimension) for \ccc{p} from the triangulation (see the description of method \ccc{locate()} for more details on the way the separator is represented).\\ @@ -792,7 +895,7 @@ and \ccc{Vertex}. They are all invalidated by any change in the triangulation. \ccMethod{Vertex_iterator finite_vertices_begin() const;} -{Starts at an arbitrary finite vertex. Then \ccc{$++$} and \ccc{$--$} will +{Starts at an arbitrary finite vertex. Then \ccc{++} and \ccc{--} will iterate on finite vertices. Returns \ccc{vertices_end()} when \ccc{\ccVar.number_of_vertices()} $<1$.} \ccGlue @@ -805,7 +908,7 @@ ones). Returns \ccc{vertices_end()} when {Past-the-end iterator} \ccMethod{Edge_iterator finite_edges_begin() const;} -{Starts at an arbitrary finite edge. Then \ccc{$++$} and \ccc{$--$} will +{Starts at an arbitrary finite edge. Then \ccc{++} and \ccc{--} will iterate on finite edges. Returns \ccc{edges_end()} when \ccc{\ccVar.dimension()} $<1$.} \ccGlue @@ -817,7 +920,7 @@ ones). Returns \ccc{edges_end()} when \ccc{\ccVar.dimension()} $<1$.} {Past-the-end iterator} \ccMethod{Facet_iterator finite_facets_begin() const;} -{Starts at an arbitrary finite facet. Then \ccc{$++$} and \ccc{$--$} will +{Starts at an arbitrary finite facet. Then \ccc{++} and \ccc{--} will iterate on finite facets. Returns \ccc{facets_end()} when \ccc{\ccVar.dimension()} $<2$.} \ccGlue @@ -830,7 +933,7 @@ ones). Returns \ccc{facets_end()} when {Past-the-end iterator} \ccMethod{Cell_iterator finite_cells_begin() const;} -{Starts at an arbitrary finite cell. Then \ccc{$++$} and \ccc{$--$} will +{Starts at an arbitrary finite cell. Then \ccc{++} and \ccc{--} will iterate on finite cells. Returns \ccc{cells_end()} when \ccc{\ccVar.dimension()} $<3$.} \ccGlue @@ -907,7 +1010,7 @@ debugging. \ccMethod{bool is_valid(bool verbose = false) const;} -{Checks the combinatorial validity of the triangulation and also the +{Checks the combinatorial validity of the triangulation. Checks also the validity of its geometric embedding (see Section~\ref{Triangulation3-sec-Valid}). When \ccc{verbose} is set to true, messages describing the first invalidity encountered are printed.\\ @@ -936,7 +1039,7 @@ corresponding input operators of the vertex and the cell classes. Assigns the resulting triangulation to \ccc{t}.} \ccFunction{ostream& operator<< -(ostream& os, const CGAL_Triangulation_3 &t);} +(ostream& os, const Triangulation_3 &t);} {Writes the triangulation \ccc{t} into \ccc{os}.} The information in the \ccc{iostream} is: the dimension, the number of @@ -949,7 +1052,7 @@ of maximal dimension.) \end{ccClassTemplate} -\begin{ccClassTemplate}{CGAL_Triangulation_vertex_3} +\begin{ccClassTemplate}{Triangulation_vertex_3} \section{The Vertex Class of a Triangulation \protect \ccClassTemplateName} \label{Triangulation3-sec-class-Vertex} @@ -973,9 +1076,9 @@ defined in the class \ccc{Triangulation_3}: \ccGlue \ccTypedef{typedef typename Tds::Cell Ctds;}{cell of the triangulation data structure} \ccGlue -\ccTypedef{typedef CGAL_Triangulation_vertex_handle_3 Vertex_handle;}{handle to a vertex} +\ccTypedef{typedef Triangulation_vertex_handle_3 Vertex_handle;}{handle to a vertex} \ccGlue -\ccTypedef{typedef CGAL_Triangulation_cell_handle_3 Cell_handle;}{handle to a cell} +\ccTypedef{typedef Triangulation_cell_handle_3 Cell_handle;}{handle to a cell} \begin{ccAdvanced} \ccCreation @@ -1034,7 +1137,7 @@ of maximal dimension (Section~\ref{Triangulation3-sec-degen_dim}).} \end{ccClassTemplate} -\begin{ccClassTemplate}{CGAL_Triangulation_cell_3} +\begin{ccClassTemplate}{Triangulation_cell_3} \section{The Cell Class of a Triangulation \protect \ccClassTemplateName} \label{Triangulation3-sec-class-Cell} @@ -1056,7 +1159,7 @@ dimension: (Section~\ref{Triangulation3-sec-degen_dim}). \ccTypes The class \ccClassTemplateName\ defines the same types as the -\ccc{CGAL_Triangulation_vertex_3} class. +\ccc{Triangulation_vertex_3} class. \begin{ccAdvanced} \ccCreation @@ -1168,7 +1271,7 @@ computes the index \ccc{i} of the neighbor.} \label{Triangulation3-sec-Traits} The first template parameter of the triangulation class -\ccc{CGAL_Triangulation_3} of \cgal\ is the geometric traits class. +\ccc{Triangulation_3} of \cgal\ is the geometric traits class. The first subsection of this section describes the requirements that the geometric traits class must fulfill. The second subsection @@ -1180,12 +1283,12 @@ presents a predefined geometric traits class available in \cgal. \protect \ccClassName} \label{Triangulation3-sec-concept-Traits} -\subsubsection{To be used by \protect \ccc{CGAL_Triangulation_3}} +\subsubsection{To be used by \protect \ccc{Triangulation_3}} \ccCreationVariable{traits} The geometric traits class \ccClassName\ of the triangulation -class \ccc{CGAL_Triangulation_3} must define the geometric +class \ccc{Triangulation_3} must define the geometric objects (points, segments, triangles and tetrahedra) forming the triangulation together with a few geometric predicates on these objects: equality, coordinates comparison, orientation in the space, orientation @@ -1225,36 +1328,36 @@ can be provided. \ccMethod{bool equal(const Point & p, const Point & q) const;} {Equality test.} -\ccMethod{CGAL_Comparison_result compare_x(const Point & p, const Point +\ccMethod{Comparison_result compare_x(const Point & p, const Point & q) const;} -{Comparison of \ccc{x}-coordinates. Returns \ccc{CGAL_LARGER} -(resp. \ccc{CGAL_EQUAL}, \ccc{CGAL_SMALLER}) when the \ccc{x} +{Comparison of \ccc{x}-coordinates. Returns \ccc{LARGER} +(resp. \ccc{EQUAL}, \ccc{SMALLER}) when the \ccc{x} coordinate of \ccc{p} is larger than (resp. equal to, smaller than) the \ccc{x} coordinate of \ccc{q}.} \ccGlue -\ccMethod{CGAL_Comparison_result compare_y(const Point & p, const Point +\ccMethod{Comparison_result compare_y(const Point & p, const Point & q) const;} {Comparison of \ccc{y}-coordinates.} \ccGlue -\ccMethod{CGAL_Comparison_result compare_z(const Point & p, const Point +\ccMethod{Comparison_result compare_z(const Point & p, const Point & q) const;} {Comparison of \ccc{z}-coordinates.} -\ccMethod{CGAL_Orientation orientation(const Point& p0, +\ccMethod{Orientation orientation(const Point& p0, const Point& p1, const Point& p2, const Point& p3) const;} {Orientation test in three dimensions.} -\ccMethod{CGAL_Orientation orientation_in_plane +\ccMethod{Orientation orientation_in_plane (const Point & q, const Point & r, const Point & s, const Point & test) const;} {When \ccc{test, q, r, s} are coplanar, tests whether \ccc{test} is on the -same side of \ccc{(q, r)} as \ccc{s}. Returns \ccc{CGAL_COLLINEAR} if -\ccc{test, q, r} are collinear, \ccc{CGAL_POSITIVE} if \ccc{(q, r, test)} -and \ccc{(q, r, s)} have the same orientation, \ccc{CGAL_NEGATIVE} if +same side of \ccc{(q, r)} as \ccc{s}. Returns \ccc{COLLINEAR} if +\ccc{test, q, r} are collinear, \ccc{POSITIVE} if \ccc{(q, r, test)} +and \ccc{(q, r, s)} have the same orientation, \ccc{NEGATIVE} if \ccc{(q, r, test)} and \ccc{(q, r, s)} have opposite orientations. \ccPrecond{\ccc{test,q,r,s} are coplanar and \ccc{q,r,s} are not collinear.}} @@ -1264,7 +1367,7 @@ and \ccc{(q, r, s)} have the same orientation, \ccc{CGAL_NEGATIVE} if {Collinearity test.} \subsubsection{To be used by \protect -\ccc{CGAL_Delaunay_triangulation_3}} +\ccc{Delaunay_triangulation_3}} In addition to the requirements described before, the geometric traits class of a @@ -1272,7 +1375,7 @@ Delaunay triangulation must fulfill the following requirements: \ccHeading{Predicates} -\ccMethod{CGAL_Oriented_side +\ccMethod{Oriented_side side_of_oriented_sphere(const Point & p, const Point & q, const Point & r, @@ -1281,23 +1384,23 @@ Delaunay triangulation must fulfill the following requirements: {Computes the side of point \ccc{test} with respect to the oriented sphere circumscribing \ccc{p,q,r,s}.} -\ccMethod{CGAL_Oriented_side +\ccMethod{Oriented_side side_of_oriented_circle(const Point & p, const Point & q, const Point & r, const Point & test) const;} -{computes the side of \ccc{test} with respect to the oriented circle +{Computes the side of \ccc{test} with respect to the oriented circle circumscribing \ccc{p,q,r}. \ccPrecond{\ccc{p,q,r,test} are coplanar.}} \subsubsection{To be used by \protect -\ccc{CGAL_Delaunay_hierarchic_triangulation_3}} +\ccc{Delaunay_hierarchic_triangulation_3}} \textit{Not yet implemented} \end{ccClass} - \begin{ccClassTemplate}{CGAL_Triangulation_geom_traits_3} + \begin{ccClassTemplate}{Triangulation_geom_traits_3} \subsection{The Class \protect \ccClassTemplateName} \label{Triangulation3-sec-class-Traits} @@ -1314,13 +1417,13 @@ Section~\ref{Triangulation3-sec-concept-Traits}. \ccTypes -\ccTypedef{typedef CGAL_Point_3 Point;}{} +\ccTypedef{typedef Point_3 Point;}{} \ccGlue -\ccTypedef{typedef CGAL_Segment_3 Segment;}{} +\ccTypedef{typedef Segment_3 Segment;}{} \ccGlue -\ccTypedef{typedef CGAL_Triangle_3 Triangle;}{} +\ccTypedef{typedef Triangle_3 Triangle;}{} \ccGlue -\ccTypedef{typedef CGAL_Tetrahedron_3 Tetrahedron;}{} +\ccTypedef{typedef Tetrahedron_3 Tetrahedron;}{} \end{ccClassTemplate} @@ -1328,32 +1431,32 @@ Section~\ref{Triangulation3-sec-concept-Traits}. \label{Triangulation3-sec-tds} The second template parameter of the basic triangulation class -\ccc{CGAL_Triangulation_3} is a triangulation data structure +\ccc{Triangulation_3} is a triangulation data structure class. This class can be seen as a container for the cells and vertices maintaining incidence and adjacency relations. The concept for the triangulation data structure is described in Section~\ref{TDS3-sec-concept} of Chapter~\ref{chapter-TDS3}. Its optional arguments related to geometry are compulsory for this use as a -template parameter of \ccc{CGAL_Triangulation_3}. +template parameter of \ccc{Triangulation_3}. A model of this triangulation data structure is -\ccc{CGAL_Triangulation_data_structuree_3} presented in +\ccc{Triangulation_data_structuree_3} presented in Section~\ref{TDS3-sec-class}. -\begin{ccClassTemplate}{CGAL_Delaunay_triangulation_3} +\begin{ccClassTemplate}{Delaunay_triangulation_3} \section{The Delaunay Triangulation Class \protect \ccClassTemplateName} \ccDefinition \ccInclude{CGAL/Delaunay_triangulation_3.h} -\ccInheritsFrom{\ccc{CGAL_Triangulation_3}} +\ccInheritsFrom{\ccc{Triangulation_3}} \ccCreationVariable{dt} \ccTypes -Inherits the types of \ccc{CGAL_Triangulation_3}. +Inherits the types of \ccc{Triangulation_3}. \ccCreation @@ -1364,13 +1467,17 @@ Inherits the types of \ccc{CGAL_Triangulation_3}. {Creates an empty Delaunay triangulation with traits class \ccc{traits}.} -\ccConstructor{\ccClassName(const CGAL_Delaunay_triangulation_3 & dt1)} +\ccConstructor{\ccClassName(const Delaunay_triangulation_3 & dt1)} {Copy constructor.} \ccModifiers \ccHeading{Insertion} +The following methods, which already exist in triangulations, are +overloaded to ensure the empty sphere property of Delaunay +triangulations. + \ccMethod{Vertex_handle insert(const Point & p );} {Inserts point \ccc{p} in the triangulation and returns the corresponding vertex. Similar to the insertion in a triangulation, but insures in @@ -1408,45 +1515,45 @@ number of inserted points. \ccHeading{Queries} -\ccMethod{CGAL_Bounded_side +\ccMethod{Bounded_side side_of_sphere(Cell_handle c, const Point & p) const;} {Returns on which side of the circumscribed sphere of \ccc{c} lies the point \ccc{p}. More precisely, it returns:\\ -- \ccc{CGAL_ON_BOUNDED_SIDE} if \ccc{p} is inside the sphere (for an infinite +- \ccc{ON_BOUNDED_SIDE} if \ccc{p} is inside the sphere (for an infinite cell this means that \ccc{p} lies strictly either in the half space limited by its finite facet, or in the interior of the disk circumscribing the *finite* facet) \\ -- \ccc{CGAL_ON_BOUNDARY} if p on the boundary of the sphere (for an infinite +- \ccc{ON_BOUNDARY} if p on the boundary of the sphere (for an infinite cell this means that \ccc{p} lies on the circle circumscribing the *finite* facet)\\ -- \ccc{CGAL_ON_UNBOUNDED_SIDE} if \ccc{p} lies outside the sphere (for an +- \ccc{ON_UNBOUNDED_SIDE} if \ccc{p} lies outside the sphere (for an infinite cell this means that \ccc{p} is not in the preceding two cases). \ccPrecond{\ccc{\ccVar.dimension()} $=3$.}} -\ccMethod{CGAL_Bounded_side +\ccMethod{Bounded_side side_of_circle(const Facet & f, const Point & p) const;} {Returns on which side of the circumscribed circle of \ccc{f} lies the point \ccc{p}. More precisely, it returns:\\ - in dimension~3:\\ --- for a finite facet, \ccc{CGAL_ON_BOUNDARY} if \ccc{p} lies -on the circle, \ccc{CGAL_ON_UNBOUNDED_SIDE} when it lies in the exterior of -the disk, \ccc{CGAL_ON_BOUNDED_SIDE} when it lies in its interior.\\ +-- for a finite facet, \ccc{ON_BOUNDARY} if \ccc{p} lies +on the circle, \ccc{ON_UNBOUNDED_SIDE} when it lies in the exterior of +the disk, \ccc{ON_BOUNDED_SIDE} when it lies in its interior.\\ -- for an infinite facet, it considers the plane defined by the finite facet of the same cell, and does the same as in dimension~2 in this plane.\\ - in dimension~2:\\ --- for a finite facet, \ccc{CGAL_ON_BOUNDARY} if \ccc{p} lies -on the circle, \ccc{CGAL_ON_UNBOUNDED_SIDE} when it lies in the exterior of -the disk, \ccc{CGAL_ON_BOUNDED_SIDE} when it lies in its interior.\\ --- for an infinite facet, \ccc{CGAL_ON_BOUNDARY} if the +-- for a finite facet, \ccc{ON_BOUNDARY} if \ccc{p} lies +on the circle, \ccc{ON_UNBOUNDED_SIDE} when it lies in the exterior of +the disk, \ccc{ON_BOUNDED_SIDE} when it lies in its interior.\\ +-- for an infinite facet, \ccc{ON_BOUNDARY} if the point lies on the finite edge of \ccc{f} (endpoints included), -\ccc{CGAL_ON_BOUNDED_SIDE} for a point in the open half-plane defined -by \ccc{f}, \ccc{CGAL_ON_UNBOUNDED_SIDE} elsewhere. +\ccc{ON_BOUNDED_SIDE} for a point in the open half-plane defined +by \ccc{f}, \ccc{ON_UNBOUNDED_SIDE} elsewhere. \ccPrecond{\ccc{\ccVar.dimension()} $\geq 2$.}} -\ccMethod{CGAL_Bounded_side +\ccMethod{Bounded_side side_of_circle(Cell_handle c, int i, const Point & p);} -{Same as the previous method.} +{Same as the previous method for facet \ccc{i} of cell \ccc{c}.} \begin{ccAdvanced} \ccHeading{Checking} @@ -1464,7 +1571,7 @@ This method is mainly a debugging help for the users of advanced features. \end{ccClassTemplate} -\begin{ccClassTemplate}{CGAL_Delaunay_hierarchic_triangulation_3} +\begin{ccClassTemplate}{Delaunay_hierarchic_triangulation_3} \section{The Hierarchic Delaunay Triangulation Class \protect \ccClassTemplateName} @@ -1491,13 +1598,13 @@ To work around this problem, two functions have been defined to transform \ccc{handles} into usual $C^{++}$ pointers for debugging purposes. \ccFunction{template - CGAL_Triangulation_vertex_3 * -CGAL_debug(const CGAL_Triangulation_vertex_handle_3 v);} + Triangulation_vertex_3 * +debug(const Triangulation_vertex_handle_3 v);} {} \ccFunction{template - CGAL_Triangulation_cell_3 * - CGAL_debug(const CGAL_Triangulation_cell_handle_3 + Triangulation_cell_3 * + debug(const Triangulation_cell_handle_3 c);} {}