mirror of https://github.com/CGAL/cgal
199 lines
9.1 KiB
TeX
199 lines
9.1 KiB
TeX
%+-------------------------------------------------------
|
|
%| CGAL Manual : pmwx.tex
|
|
%+--------------------------------------------------------
|
|
%| update log
|
|
%|
|
|
%| 04 May 2001 - Eyal Flato
|
|
%| Created from arr documentation
|
|
%| 15 May 2003 - Efi Fogel
|
|
%| Cleanup
|
|
%| 1 July 2003 - Ron Wein
|
|
%| Some more revisions
|
|
%--------------------------------------------------------
|
|
|
|
|
|
\section{Introduction}
|
|
|
|
Given a collection ${\mathcal C}$ of (possibly intersecting and not necessarily
|
|
$x$-monotone curves) in the plane, we construct a collection ${\mathcal C}''$ in
|
|
two steps, as follows: First, we decompose each curve in ${\mathcal C}$ into
|
|
maximal $x$-monotone curves, thus obtaining the collection
|
|
${\mathcal C}'$. Second, We decompose each curve in ${\mathcal C}'$ into
|
|
maximal connected pieces not intersecting any other curve in ${\mathcal C}'$.
|
|
This way we obtain the collection ${\mathcal C}''$ of $x$-monotone, pairwise
|
|
interior disjoint curves. Constructing the {\it planar map with
|
|
intersection} of the curves in ${\mathcal C}$ is therefore equivalent to the
|
|
construction of the {\it planar map}(see Chapter~\ref{I1_ChapterPlanarMap})
|
|
induced by the curves in ${\mathcal C}''$.
|
|
|
|
The \ccc{Planar Map with Intersections} package extends the functionality
|
|
of the \ccc{Planar Map} package by enabling simple insertion of intersecting
|
|
and not necessarily $x$-monotone curves. The
|
|
\ccc{Planar_map_with_intersections_2} class has different insertion functions
|
|
but it uses the same data structures as the \ccc{Planar_map_2} class.
|
|
Therefore, almost any functionality of the planar map is also supported here
|
|
(e.g., traversal of planar map features, point location queries and I/O
|
|
operations are supported but infinite objects are not supported). However,
|
|
to maintain a planar map with intersections one obviously needs to support
|
|
some additional functions in the geometric traits class, handling with
|
|
intersections and $x$-monotonicity.
|
|
|
|
Note that if one needs to build a planar map of $x$-monotone, pairwise
|
|
interior disjoint curves, then it would be more efficient (in running time)
|
|
and less demanding (in traits class functionality) to use the
|
|
\ccc{Planar_map_2} class instead.
|
|
|
|
\paragraph{Degeneracies}
|
|
|
|
Like the \ccc{Planar Map} package (see Chapter~\ref{I1_ChapterPlanarMap}),
|
|
the \ccc{Planar Map with Intersections} package can deal with $x$-degenerate
|
|
input (including vertical segments). However, while in the planar map the input
|
|
curves were assumed to be non-intersecting in their interiors, there is no
|
|
such assumption when using planar map with intersections. Furthermore,
|
|
overlapping curves are also supported: If two curves overlap the traits
|
|
intersection function must return the two endpoints of the common part.
|
|
|
|
%---------------------------------------------------
|
|
\subsection{A Simple Program}
|
|
\label{ssec:example1}
|
|
The simple program listed below demonstrates the construction of an
|
|
$X$-shaped planar subdivision out of two intersecting segments.
|
|
The coordinates of the halfedges of the constructed subdivision are
|
|
printed to standard output.
|
|
|
|
\ccIncludeExampleCode{Pm_with_intersections/example1.C}
|
|
|
|
The output of the program looks like this:
|
|
\begin{verbatim}
|
|
Inserting the segments:
|
|
0 0 1 1
|
|
0 1 1 0
|
|
|
|
Edges of the planar map:
|
|
0 0 --- 0.5 0.5
|
|
0.5 0.5 --- 1 1
|
|
0 1 --- 0.5 0.5
|
|
1 0 --- 0.5 0.5
|
|
\end{verbatim}
|
|
|
|
\section{Architecture}
|
|
|
|
The \ccc{Planar_map_with_intersections_2<Planar_map_2<Dcel, Traits> >} class
|
|
is parameterized with the \ccc{Planar_map_2} class it inherits from, which
|
|
includes the \ccc{Dcel} object represents the underlying topological data structure and maintains a {\em doubly-connected edge list}.
|
|
The geometric functionality is provided by the \ccc{Traits} class, and is
|
|
tailored to handle a specific family of curves. It encapsulates the
|
|
number type used and the coordinate representation. This package
|
|
contains traits classes that handle various types of curves (e.g.,
|
|
segments, polylines, conics, etc.).
|
|
|
|
\subsection{Operations}
|
|
The set of operations that can be applied to a planar map with intersection
|
|
is divided into four subsets, namely constructors, modifiers, queries, and
|
|
input/output operations. These operations are overviewed in detail in
|
|
section~\ref{I1_ChapterPlanarMap}, so next we will just emphasize the
|
|
differences between the two classes.
|
|
% RWRW - Give a more exact reference.
|
|
|
|
\subsubsection{Aggregated Insert}
|
|
|
|
A \ccc{Planar Map with Intersections} can be built incrementally by
|
|
inserting one curve after the other into the map. However, for a large number
|
|
of curves that intersect rather sparsely, it can be more efficient to use the
|
|
aggregate insertion method, that inserts a set of curves to an empty map at
|
|
once by performing the sweep-line algorithm on the set of input curves.
|
|
|
|
The aggregate insertion method is more efficient in many cases and it also
|
|
has less requirements from the traits class, in comparison with the the
|
|
incremental insertion function. Namely, the \ccc{curves_compare_y_at_x_left()} and the \ccc{nearest_intersection_to_left()} functions are not required, nor do
|
|
the various reflection functions.
|
|
|
|
\subsubsection{Example of Aggregate Insertion}
|
|
\label{sssec:example1_aggrinsrt}
|
|
The following example demonstrates the usage of the aggregate insertion
|
|
method. It constructs a planar map out of four segments ---
|
|
$(0,0)-(1,1)$ , $(0,1)-(1,0)$ , $(0,0)-(1,0)$ and $(0,1)-(1,1)$
|
|
(an hourglass shape), two of them are intersecting in their interior.
|
|
The resulting planar map will contain all the disjoint interior sub-segments
|
|
obtained by the calculation of the sweep line algorithm. For clarity, we printed all the halfedges of the resulting planar map to the standard output.
|
|
|
|
% RWRW - where are the examples?
|
|
%\ccIncludeExampleCode{Sweep_line_2/example1.C}
|
|
|
|
The output of the program looks like this:
|
|
|
|
% RWRW - Where are the examples?
|
|
%\ccIncludeExampleCode{Sweep_line_2/example1.cout}
|
|
|
|
\subsubsection{Non Intersecting Insertion Functions}
|
|
|
|
In some cases the users insert curves to a planar map with intersections
|
|
in an incremental manner, but have some knowledge regarding the location
|
|
of several curves. In such cases, special insertion functions may be called
|
|
in order to speed up the construction of the map:
|
|
\begin{itemize}
|
|
\item If it is known in advance that the current curve is $x$-monotone and does
|
|
not intersect any one of the curves currently in the map in its interior,
|
|
it is possible to insert this curve using the \ccc{non_intersecting_insert()}
|
|
function. A similar function is also available for a range of $x$-monotone
|
|
and interior-disjoint curves, that does not induce any intersection with the
|
|
existing curves in the map.
|
|
\item Sometimes the exact location of the $x$-monotone curve in the map is known. It may be inserted (1) within the interior of a given face, (2) with one given vertex as one of its endpoints, or (3) between to given vertices. The \ccc{non_intersecting_insert_in_face_interior()}, \ccc{non_intersecting_insert_from_vertex()} and \ccc{non_intersecting_insert_at_vertices()} functions serve for this purpose. For more details regrading these special insertion functions, as well as for an example for their usage, see section~\ref{I1_ChapterPlanarMap}.
|
|
% RWRW - refine this reference.
|
|
\end{itemize}
|
|
|
|
\begin{ccAdvanced}
|
|
\subsection{Change Notification}
|
|
%-----------------------------------------------
|
|
|
|
An insertion of an intersecting curve into a planar map may add
|
|
several halfedges and modify several features of the map (i.e.
|
|
split halfedges, split faces, etc.). The so-called \ccc{Change
|
|
Notification} class provides this kind of flexibility. The modification
|
|
methods accept an additional parameter, a class which is a model of the
|
|
\ccc{PlanarMapWithIntersectionsChangeNotification_2} concept. The
|
|
change notification includes an associative function for each
|
|
modification method. This function is called after each such
|
|
modification.
|
|
|
|
The change notification class is useful in many cases. For example,
|
|
one may add a color (or other extra data) to any halfedge of a
|
|
planar map. An insertion of a new curve can split halfedges that
|
|
were previously in the map. After such a split the color of the
|
|
newly created halfedges should be updated according to the original
|
|
color of the split halfedge. One can do this by implementing the
|
|
\ccc{split_edge} function of the change notification class. This
|
|
function will be called after each split of an halfedge in the map.
|
|
|
|
\subsubsection{Example of Change Notification}
|
|
\label{ssecn:example2}
|
|
The following example demonstrates the usage of the change
|
|
notification concept during the construction of a
|
|
planar map out of three segments --- $(0,1)-(1,0)$, $(0,0)-(1,1)$
|
|
and $(0,1)-(1,1)$.
|
|
During the insertion we use \ccc{My_notification} instance to
|
|
output the internal process of the construction of the planar map.
|
|
We also count how many edges are in the map by incrementing a
|
|
counter each time an edge is added (\ccc{add_edge}) or split
|
|
(\ccc{split_edge}).
|
|
|
|
\ccIncludeExampleCode{Pm_with_intersections/example2.C}
|
|
|
|
The output of the program looks like this:
|
|
\begin{verbatim}
|
|
inserting 0 1 1 0
|
|
add_edge
|
|
add_hole
|
|
inserting 0 0 1 1
|
|
split_edge
|
|
add_edge
|
|
add_edge
|
|
inserting 0 1 1 1
|
|
add_edge
|
|
split_face
|
|
Total number of edges 5
|
|
\end{verbatim}
|
|
|
|
\end{ccAdvanced}
|
|
|