mirror of https://github.com/CGAL/cgal
122 lines
4.6 KiB
TeX
122 lines
4.6 KiB
TeX
\subsubsection{Combinatorial Modification}
|
|
\cgalpoly\ provides a set of operators for combinatorial
|
|
modifications. Most of them are categorized as Euler operations
|
|
that maintain the Euler-Poincar\'e equality: $V - E + F = 2 - 2G$.
|
|
These atomic operators can split/join of two facets, two vertices
|
|
or two loops. They can also create/erase a center vertex or a facet.
|
|
|
|
TODO: example of creating a triangle strip.
|
|
\begin{lstlisting}
|
|
typedef CGAL::Cartesian<int> Kernel;
|
|
typedef Kernel::Point_3 Point;
|
|
typedef CGAL::Polyhedron_3<Kernel> Polyhedron;
|
|
typedef Polyhedron::Halfedge_handle Halfedge_handle;
|
|
int main() {
|
|
Polyhedron P;
|
|
|
|
Point p0(0, 0, 0), p1(1, 0, 0), p2(0, 1, 0);
|
|
Halfedge_handle e = P.make_triangle( p0, p1, p2); // e points to p0
|
|
e = e->prev(); // e points to p2
|
|
e = P.add_vertex_and_facet_to_border(e->next()->opposite(), e->opposite());
|
|
e->point() = Point(1, 1, 0);
|
|
e = P.add_vertex_and_facet_to_border(e->next()->opposite(), e->opposite());
|
|
e->point() = Point(2, 0, 0);
|
|
e = e->next();
|
|
e = P.add_vertex_and_facet_to_border(e->next()->opposite(), e->opposite());
|
|
e->point() = Point(2, 1, 0);
|
|
}
|
|
\end{lstlisting}
|
|
|
|
Reader should refer the references manual for precise definitions and
|
|
examples. \footnote{See \href{http://www.cgal.org/Manual/doc_html/
|
|
basic_lib/Polyhedron/Chapter_main.html}{Euleroperators}}.
|
|
|
|
\subsubsection{Modifier and Polyhedron Incremental Builder}
|
|
\label{sec:builder}
|
|
In addition to the modification operators \poly\ has,
|
|
the \polybuilder\ countenances the direct accesses and modifications
|
|
of the internal representation, i.e. the halfedge data structure,
|
|
of the \poly\ in a controlled manner. A \polybuilder\ is a function object
|
|
serving the callback mechanism of the modifier. A modifier is a function
|
|
object derived from \lstinline!Modifier_base<R>! that implements a
|
|
pure virtual member function \lstinline!operator()!.
|
|
A call of \lstinline!delegate(a_modifier)! triggers the callback and
|
|
authorizes the access of the internal representation of
|
|
the polyhedron. When called, the \lstinline!operator()! receives the
|
|
internal halfedge data structure. A \polybuilder\ is then
|
|
created to build incrementally the geometry and
|
|
the connectivity of the halfedge data struture.
|
|
On return, the check for the polyhedron validity of the halfedge
|
|
data structure is enforced.
|
|
%The validity check is implemented
|
|
%as an expensive postcondition at the end of the delegate()
|
|
%member function, i.e., it is not
|
|
%called by default, only when expensive checks are activated.
|
|
|
|
Following example shows how to create a triangle strip using the
|
|
modifier and the incremental builder. \lstinline!Build_triangle_strip!
|
|
is a function object derived from \lstinline!Modifier_base<HalfedgeDS>!.
|
|
The \lstinline!P.delegate()! accepts this function object and
|
|
direct the call to the \lstinline!operator()! with a reference of the
|
|
internally halfedge data structure.
|
|
TODO: a figure for the excution flow.
|
|
|
|
\begin{lstlisting}
|
|
template <class _HDS>
|
|
class Build_triangle_strip : public CGAL::Modifier_base<_HDS> {
|
|
typedef typename _HDS::Vertex Vertex;
|
|
typedef typename Vertex::Point Point;
|
|
public:
|
|
Build_triangle_strip() {}
|
|
|
|
void operator()(_HDS& hds) {
|
|
CGAL::Polyhedron_incremental_builder_3<_HDS> B(hds);
|
|
B.begin_surface(6, 4, 12); {
|
|
B.add_vertex(Point(0, 0, 0));
|
|
B.add_vertex(Point(1, 0, 0));
|
|
B.add_vertex(Point(0, 1, 0));
|
|
B.add_vertex(Point(1, 1, 0));
|
|
B.add_vertex(Point(2, 0, 0));
|
|
B.add_vertex(Point(2, 1, 0));
|
|
|
|
B.begin_facet();
|
|
B.add_vertex_to_facet(0);
|
|
B.add_vertex_to_facet(1);
|
|
B.add_vertex_to_facet(2);
|
|
B.end_facet();
|
|
B.begin_facet();
|
|
B.add_vertex_to_facet(1);
|
|
B.add_vertex_to_facet(3);
|
|
B.add_vertex_to_facet(2);
|
|
B.end_facet();
|
|
B.begin_facet();
|
|
B.add_vertex_to_facet(1);
|
|
B.add_vertex_to_facet(4);
|
|
B.add_vertex_to_facet(3);
|
|
B.end_facet();
|
|
B.begin_facet();
|
|
B.add_vertex_to_facet(4);
|
|
B.add_vertex_to_facet(5);
|
|
B.add_vertex_to_facet(3);
|
|
B.end_facet();
|
|
} B.end_surface();
|
|
}
|
|
};
|
|
|
|
typedef CGAL::Cartesian<double> Kernel;
|
|
typedef CGAL::Polyhedron_3<Kernel> Polyhedron;
|
|
|
|
Polyhedron P;
|
|
Build_triangle_strip<Polyhedron::HalfedgeDS> tstrip;
|
|
P.delegate(tstrip);
|
|
\end{lstlisting}
|
|
|
|
|
|
% ------------------------------------------------------------------------
|
|
% initialize a specific polyhedron (incremental builder on enriched-polyhedron?)
|
|
\subsubsection{Polyhedron Initialization}
|
|
The \polybuilder is particularly useful for implementing file reader for
|
|
common file formats. TODO: initilaize the enriched-polyhedron
|
|
%\input ??
|
|
|