mirror of https://github.com/CGAL/cgal
173 lines
7.2 KiB
TeX
173 lines
7.2 KiB
TeX
% ------------------------------------------------------------------------
|
|
\subsection{CGAL Polyhedron}
|
|
|
|
CGAL Polyhedron (\cgalpoly) is realized as a container class that
|
|
manages geometry items such as vertices, halfedges, and facets with
|
|
their incidences. \cgalpoly\ has chosen the halfedge data structure
|
|
as the underlying connectivity structure. In the halfedge data
|
|
structure, a halfedge is associated with a facet and stores the
|
|
adjacency pointers to it previous, next and opposite halfedge
|
|
(\figurename\ \ref{fig:halfedge}). The details of the halfedge data
|
|
structure and the \cgalpoly\ based on it are described
|
|
in~\cite{k-ugpdd-99}.
|
|
|
|
\begin{figure}[h]
|
|
\centering{\includegraphics[width=7.0cm]{figs/halfedge}}
|
|
\caption{One halfedge and its incident primitives. The next
|
|
halfedge, the opposite halfedge, and the incident vertex are
|
|
mandatory, the remaining elements are optional.
|
|
}
|
|
\label{fig:halfedge}
|
|
\end{figure}
|
|
|
|
What are the potential obstacles in using CGAL and \cgalpoly?
|
|
\begin{enumerate}
|
|
\item
|
|
Is it fast enough? Yes. \cgal, coming from the field of Computational
|
|
Geometry, might have a reputation of using slow exact arithmetic
|
|
to be on the safe side, but nonetheless, we know where to apply
|
|
the right techniques of exact arithmetic to gain robustness and
|
|
yet not to loose efficiency. In addition, \cgal\ uses
|
|
\emph{generic programming\/} and \emph{compile-time
|
|
polymorphism\/} to realize flexibility without affecting optimal
|
|
runtime.
|
|
\item
|
|
Is it small enough? Yes. \CodeFmt{CGAL::Polyhedron \_3} can be
|
|
tailored to store exactly the required incidences and other
|
|
required data, not more and not less.
|
|
\item
|
|
Is it flexible enough? Yes, certainly within its design
|
|
space of oriented 2-manifold meshes with boundary that was
|
|
sufficient for the range of applications illustrated with our
|
|
example programs.
|
|
\item
|
|
Is it easy enough to use? Yes. The full tutorial with its example
|
|
programs are exactly the starting point for using \cgalpoly. The
|
|
example programs are short and easy to understand. There is
|
|
certainly a learning curve for mastering \CC\ to the level
|
|
of using templates, but it has to be emphasized that
|
|
using templates is far easier then developing templated code.
|
|
\item
|
|
What is the license, can I use it? Yes, we hope so. \cgal\ since
|
|
release 3.0 and our tutorial programs have open source
|
|
licenses. Other options are available.
|
|
\end{enumerate}
|
|
|
|
% ------------------------------------------------------------------------
|
|
\subsection{Subdivision Surfaces}
|
|
|
|
A subdivision algorithm recursively
|
|
applies \emph{refinement} and \emph{geometry smoothing}
|
|
on the control mesh (\figurename\ \ref{fig:sqrt3},
|
|
\ref{fig:quad-triangle}), and approximates the limit surface of
|
|
the control mesh. Several refinement schemes in practice are
|
|
illustrated in
|
|
\figurename\ \ref{fig:RefSchemes}. The stencils of the
|
|
geometry smoothing are depending on the refinement schemes,
|
|
i.e.\ the reparameterizations. A stencil defines a control
|
|
submesh that is associated with normalized weights of the
|
|
nodes. \figurename\ \ref{fig:RefMap}
|
|
demonstrates the stencils of the PQQ scheme
|
|
in Catmull-Clark subdivision \cite{cc} and DQQ scheme in Doo-Sabin
|
|
subdivision \cite{ds}. We also demonstrate Loop \cite{loop},
|
|
$\sqrt{3}$ \cite{sqrt3} and Quad-Triangle \cite{qts} subdivisions
|
|
in this tutorial. For further details about subdivisions, readers
|
|
should refer to \cite{Warren:subdivision} and \cite{Sub:course:2000}.
|
|
|
|
\begin{figure}[tb]
|
|
\centering
|
|
\psfrag{PQQ}[]{\scriptsize PQQ}
|
|
\psfrag{PTQ}[]{\scriptsize PTQ}
|
|
\psfrag{DQQ}[]{\scriptsize DQQ}
|
|
\psfrag{Sqrt3}[]{\scriptsize $\sqrt{3}$}
|
|
\epsfig{file=figs/RefSchemes.eps, width=12cm}
|
|
\caption{Examples of refinement schemes:
|
|
primal quadrilateral quadrisection (PQQ),
|
|
primal triangle quadrisection (PTQ),
|
|
dual quadrilateral quadrisection (DQQ) and
|
|
$\sqrt{3}$ triangulation. The control meshes are shown
|
|
in the first row.}
|
|
\label{fig:RefSchemes}
|
|
\end{figure}
|
|
|
|
\begin{figure}[h]
|
|
\centering
|
|
\psfrag{A}[]{(a)}
|
|
\psfrag{B}[]{(b)}
|
|
\psfrag{C}[]{(c)}
|
|
\psfrag{D}[]{(d)}
|
|
\epsfig{file=figs/RefMap.eps, width=12cm}
|
|
\caption{The stencil ({\itshape top blue}) and its
|
|
vertex ({\itshape bottom red}) in
|
|
Catmull-Clark subdivision (a-c)
|
|
and Doo-Sabin subdivision (d). Catmull-Clark
|
|
subdivision has three stencils: facet-stencil (a),
|
|
edge-stencil (b) and vertex-stencil (c).
|
|
Doo-Sabin subdivision has only corner-stencil (d).
|
|
The stencil weights are not shown.}
|
|
\label{fig:RefMap}
|
|
\end{figure}
|
|
|
|
|
|
% ------------------------------------------------------------------------
|
|
%% \section{FAQs}
|
|
|
|
%% We compile a list of questions concerned about the tutorial and the
|
|
%% accompanying source codes and libraray.
|
|
|
|
%% \begin{itemize}
|
|
|
|
%% \item Why should I read this tutorial? I am not interested in subdivisions.
|
|
%% The goal of this tutorial is to show how to use \cgalpoly\
|
|
%% on basic graphics functionalities, such as rendering and
|
|
%% interactive trackball manipulation, \emph{and} how to design and
|
|
%% implement algorithms around meshes. Subdivisions are choosen for their
|
|
%% connectivity and geometry operations. These two operations are the
|
|
%% primal components in most mesh algorithms. For reader not interested
|
|
%% in subdivisions, the know-how of the connectivity and geometry
|
|
%% manipulations is the foundation of mesh algorithm implementations
|
|
%% based on \cgalpoly .
|
|
|
|
%% \item Why do you use \cgal\ polyhedron? How about OpenMesh and its
|
|
%% subdivision library?
|
|
%% \cgal\ is highly generic and well-tested robust. \cgal\
|
|
%% and versatile for its geometry
|
|
%% functionalities. The OpenMesh subdivision
|
|
%% library is not as generic.
|
|
|
|
%% \item Is is difficult or what's the difficulties to use \cgal\ Polyhedron?
|
|
%% It is not, once you buy the concepts taken or inspired from
|
|
%% the STL (iterators, circulars). You also have to be familiar
|
|
%% with the concept of handles and halfedges.
|
|
|
|
%% \item How about the performance?
|
|
%% as fast as other libraries (and sometimes faster). It also
|
|
%% scales well.
|
|
|
|
%% \item I don't like the subdivisions you have, how can I build my own
|
|
%% subdivision on your solution?
|
|
%% depending on the level of genericity you are targeting, the
|
|
%% type of scheme and whether you want to store all levels of subdivision
|
|
%% in memory, choose either Euler operators, incremental builder
|
|
%% or one new template rule to be plugged into the CSL.
|
|
|
|
%% \item What's the future plan for CSL?
|
|
%% CGAL Package?
|
|
%% referenced from Warren's web site about subdivision?
|
|
|
|
%% \item The viewer is based on OpenGL. Can I learn from it
|
|
%% to write my own viewer based on another graphics library?
|
|
|
|
%% \item What could be improved in the Polyhedron?
|
|
%% built-in functions for # of boundaries, # of connected
|
|
%% components and genus.
|
|
%% edge collapses without the currently too restrictive precondition
|
|
%% (along with a function bool is_collapsible(Halfedge_handle h)
|
|
%% based on e.g. Edelsbrunner criteria.
|
|
%% built-in function bool is_border(Vertex_handle v)
|
|
%% built-in function to know the type of mesh (e.g. pure tri,
|
|
%% pure quad, tri-quad or polygonal).
|
|
|
|
%% \end{itemize}
|
|
|