mirror of https://github.com/CGAL/cgal
first version of CCPA
This commit is contained in:
parent
9b3148b2b3
commit
6a720eaef5
|
|
@ -0,0 +1,9 @@
|
||||||
|
\begin{ccPkgDescription}{Curve- and CurvePairAnalysis \label{Pkg:CurveAndCurvePairAnalysis}}
|
||||||
|
\ccPkgHowToCiteCgal{cgal:ccpa-bhkt}
|
||||||
|
\ccPkgSummary{
|
||||||
|
This package is ...
|
||||||
|
}
|
||||||
|
|
||||||
|
\ccPkgIntroducedInCGAL{3.?}
|
||||||
|
\ccPkgLicense{?}
|
||||||
|
\end{ccPkgDescription}
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
\ccUserChapter{Curve- and CurvePairAnalysis}
|
||||||
|
\label{chapter-curve-and-curvepair-analysis}
|
||||||
|
\ccChapterAuthor{Eric Berberich \and Michael Hemmer \and Menelaos Karavelas \and Monique Teillaud}
|
||||||
|
|
||||||
|
\input{Curve_and_curve_pair_analysis_2/PkgDescription}
|
||||||
|
|
||||||
|
\minitoc
|
||||||
|
|
||||||
|
|
@ -0,0 +1,52 @@
|
||||||
|
\begin{ccRefConcept}{AlgebraicCurveKernel_2}
|
||||||
|
|
||||||
|
\ccDefinition
|
||||||
|
|
||||||
|
|
||||||
|
The \ccc{AlgebraicCurveKernel_2} concept is meant to provide the curved
|
||||||
|
kernel with all the algebraic functionalities on bivariate polynomials
|
||||||
|
required for the manipulation of arcs of algebraic curves of general degree
|
||||||
|
$\R^2$ using an $y$-per-$x$-view on the curves.
|
||||||
|
|
||||||
|
\ccTypes
|
||||||
|
|
||||||
|
A model of \ccc{AlgebraicCurveKernel_2} is supposed to provide
|
||||||
|
|
||||||
|
\ccNestedType{Coefficient}{A model of \ccc{IntegralDomain}. }
|
||||||
|
|
||||||
|
\ccNestedType{Polynomial_2}{A model of \ccc{Polynomial_2}, for
|
||||||
|
bivariate polynomials on an \ccc{IntegralDomain} coefficient type.
|
||||||
|
it must also be possible to perform \ccc{Canonicalize,
|
||||||
|
GcdUpToConstantFactor,
|
||||||
|
IntegralDivUpToConstantFactor,
|
||||||
|
MakeSquareFreeUpToConstantFactor, and
|
||||||
|
SquareFreeFactorizationUpToConstantFactor} on this type - maybe using a
|
||||||
|
traits class. Also needed some PolynomialConstruction concept
|
||||||
|
}
|
||||||
|
|
||||||
|
% TODO: Boundary: RealEmbeddable that is 'dense R'
|
||||||
|
|
||||||
|
\ccNestedType{Solution_2}{A model of
|
||||||
|
\ccc{AlgebraicCurveKernel_2::Solution_2}, for solutions of systems
|
||||||
|
of two bivariate polynomials of type \ccc{Polynomial_2}.}
|
||||||
|
|
||||||
|
\ccNestedType{CurvePairAnalysis_2}{A model of
|
||||||
|
\ccc{AlgebraicCurveKernel_2::CurvePairAnalysis_2},
|
||||||
|
for analysing a pair of curves
|
||||||
|
defined as two analyses of type \ccc{CurveAnalysis_2}.}
|
||||||
|
|
||||||
|
\ccNestedType{CurveAnalysis_2}{A model of
|
||||||
|
\ccc{CurvePairAnalyis_2::CurveAnalysis_2}, for analysing single
|
||||||
|
curves defined as bivariate polynomials of type \ccc{Polynomial_2}.}
|
||||||
|
|
||||||
|
\ccNestedType{Compare_x_2}{A model of the concept
|
||||||
|
\ccc{AlgebraicKernel_d_2::CompareX_2}.}
|
||||||
|
\ccGlue
|
||||||
|
\ccNestedType{Compare_y_2}{A model of the concept
|
||||||
|
\ccc{AlgebraicKernel_d_2::CompareY_2}.}
|
||||||
|
\ccGlue
|
||||||
|
\ccNestedType{Compare_xy_2}{A model of the concept
|
||||||
|
\ccc{AlgebraicKernel_d_2::CompareXY_2}.}
|
||||||
|
|
||||||
|
|
||||||
|
\end{ccRefConcept}
|
||||||
|
|
@ -0,0 +1,184 @@
|
||||||
|
\begin{ccRefConcept}{CurveVerticalLine}
|
||||||
|
|
||||||
|
\ccDefinition
|
||||||
|
|
||||||
|
The \ccc{CurveVerticalLine} concept is meant to provide information
|
||||||
|
about the intersections of a curve with a vertical line at a given
|
||||||
|
finite $x$-coordinate. Note that a curve can have a vertical line component
|
||||||
|
at this coordinate and/or also non-vertical components intersecting
|
||||||
|
this vertical line. With the help of the concept's methods one is able
|
||||||
|
to compute the local topology of the curve at the given vertical line.
|
||||||
|
Note that vertical lines at $x = \pm\infty$ are not allowed, since different
|
||||||
|
events (curve end going to infinity with different non-horizontal asympotes)
|
||||||
|
would have equal $y$-coordinate ($\pm\infty$), which confuses more than it
|
||||||
|
helps. Note in addition that curve ends approaching the vertical asymptote
|
||||||
|
introduce an event (depending on whether approaching $+\infty$ or $-\infty$ -
|
||||||
|
but the event with coordinates $(x,-\infty)$, resp. $(x,+\infty)$, occur
|
||||||
|
only once, if they occur)
|
||||||
|
|
||||||
|
\ccTypes
|
||||||
|
|
||||||
|
\ccNestedType{Solution_1}{
|
||||||
|
Is a model of the \ccc{AlgebraicCurveKernel_2::Solution_1} concept
|
||||||
|
}
|
||||||
|
|
||||||
|
\ccNestedType{Solution_2}{
|
||||||
|
Is a model of the \ccc{AlgebraicCurveKernel_2::Solution_2} concept
|
||||||
|
}
|
||||||
|
|
||||||
|
\ccCreationVariable{cvl}
|
||||||
|
\ccAccessFunctions
|
||||||
|
|
||||||
|
\ccMethod{Solution_1 x();}{
|
||||||
|
returns the $x$-coordinate of the vertical line (always a finite value).
|
||||||
|
}
|
||||||
|
|
||||||
|
\ccMethod{bool covers_line();}{
|
||||||
|
returns \ccc{true} in case the given curve contains the vertical line as
|
||||||
|
a component
|
||||||
|
}
|
||||||
|
|
||||||
|
\ccMethod{unsigned int num_events();}{
|
||||||
|
returns number of distinct intersection of a curve with a
|
||||||
|
(fictious) vertical line ignoring a real vertical line component
|
||||||
|
of the curve at the given $x$-coordinate.
|
||||||
|
}
|
||||||
|
|
||||||
|
\ccMethod{Solution_2 get_solution_2(int j);}{
|
||||||
|
returns an object of type \ccc{Solution_2} for the $j$-th event
|
||||||
|
\ccPrecond{$0 \leq j < \mbox{num\_events()}$}
|
||||||
|
}
|
||||||
|
|
||||||
|
\ccMethod{std::pair< unsigned int, unsigned int > get_num_branches(int j);}{
|
||||||
|
returns the number of branches of the curve connected to $j$-th event
|
||||||
|
immediately to the left,
|
||||||
|
to the right, respectively, as a pair of \ccc{unsigned int} ignoring
|
||||||
|
vertical curve components at the given $x$-coordinate.
|
||||||
|
\ccPrecond{$0 \leq j < \mbox{num\_events()}$}
|
||||||
|
}
|
||||||
|
|
||||||
|
\ccMethod{bool has_event_of_curve();}{
|
||||||
|
returns \ccc{true} if curve has vertical line component or
|
||||||
|
curve $f$ has intersection with $f_y$ at $x$
|
||||||
|
}
|
||||||
|
|
||||||
|
%
|
||||||
|
%TODO: Do we want to have CVLs for minus and plus infinity as additional
|
||||||
|
%events? For the sake of a nice interface
|
||||||
|
%(see CurveAnalysis\_2) we want to have it: A user can then just ask for the
|
||||||
|
%behavior of the curve at $x = \pm\infty$. On the other side counting
|
||||||
|
%the number of intersection points is not well-defined: Consider several
|
||||||
|
%curve end with the same horizontal asymptote - are they equal or not?
|
||||||
|
%It's unsure whether one can compute the $y$-coordinates of these points -
|
||||||
|
%maybe even not the ``sign of infinity''. One solution is to forbid access
|
||||||
|
%to get\_solution\_2 for CurveVerticalLines with $x = \pm\infty$.
|
||||||
|
%
|
||||||
|
|
||||||
|
\end{ccRefConcept}
|
||||||
|
|
||||||
|
\begin{ccRefConcept}{CurveAnalysis_2}\footnote{There is no need
|
||||||
|
for curves to be algebraic, hence the generic name. Only the number
|
||||||
|
of events must be finite.}
|
||||||
|
|
||||||
|
\ccDefinition
|
||||||
|
|
||||||
|
The \ccc{CurveAnalysis_2} concept is meant to provide tools to analyse a single
|
||||||
|
curve. An analysis is meant to describe the curve's interesting points and how
|
||||||
|
they are connected. The analysis searches for {\it events}. Events only
|
||||||
|
occur at a finite number of $x$-coordinates. Each such coordinate defines
|
||||||
|
a CurveVerticalLine of an event. These coordinates also define open
|
||||||
|
{\it intervals} on the $x$-axis. CurveVerticalLines at values within one
|
||||||
|
such interval only differ in the values of the Solution\_2 entries.
|
||||||
|
Topological information are equal.
|
||||||
|
|
||||||
|
\ccRefines{
|
||||||
|
\ccc{DefaultConstructible, CopyConstructible, Assignable}
|
||||||
|
}
|
||||||
|
|
||||||
|
\ccTypes
|
||||||
|
|
||||||
|
\ccNestedType{Solution_1}
|
||||||
|
{Is a model of \ccc{AlgebraicCurveKernel_2::Solution_1} concept}
|
||||||
|
|
||||||
|
\ccNestedType{Solution_2}
|
||||||
|
{Is a model of \ccc{AlgebraicCurveKernel_2::Solution_2} concept}
|
||||||
|
|
||||||
|
\ccNestedType{Polynomial_2}{
|
||||||
|
Is a model of \ccc{AlgebraicCurveKernel_2::Polynomial_2}
|
||||||
|
concept.\\
|
||||||
|
Especially needed: Canonicalize, GcdUpToConstantFactor,
|
||||||
|
IntegralDivUpToConstantFactor,
|
||||||
|
MakeSquareFreeUpToConstantFactor, and
|
||||||
|
SquareFreeFactorizationUpToConstantFactor
|
||||||
|
}
|
||||||
|
|
||||||
|
\ccNestedType{Curve_vertical_ine}
|
||||||
|
{Is a model of the \ccc{CurveAnalysis_2::CurveVerticalLine} concept}
|
||||||
|
|
||||||
|
\ccCreation
|
||||||
|
\ccCreationVariable{ca}
|
||||||
|
|
||||||
|
\ccConstructor{CurveAnalysis_2(Polynomial_2 p);}
|
||||||
|
{constructs an analysis for the curve defined by p. The polynomial must
|
||||||
|
be squarefree.}
|
||||||
|
|
||||||
|
\begin{ccAdvanced}
|
||||||
|
\ccConstructor{template < class InputIterator >
|
||||||
|
CurveAnalysis_2(Polynomial_2 p, InputIterator begin, InputIterator end);}{
|
||||||
|
constructs an analysis for the curve defined by p. The polynomial must
|
||||||
|
be squarefree. The iterator range [begin,end) contains factors of
|
||||||
|
$\mbox{resultant}(p,p_y,y)$, i.e., define $x$-coordinates,
|
||||||
|
which allows to simplify the real root isolation within this layer.
|
||||||
|
The \ccc{value_type} of InputIterator is \ccc{Polynomial_2}.
|
||||||
|
This constructor has been introduced to enable an upper layer (CK) to use
|
||||||
|
additional knowledge on the problem.
|
||||||
|
}
|
||||||
|
\end{ccAdvanced}
|
||||||
|
|
||||||
|
\ccAccessFunctions
|
||||||
|
|
||||||
|
\ccMethod{Polynomial_2 get_polynomial_2();}{
|
||||||
|
returns the defining polynomial of the anyalsis
|
||||||
|
}
|
||||||
|
|
||||||
|
\ccMethod{unsigned int num_vertical_lines_with_event();}{
|
||||||
|
returns number of vertical lines that encode an event
|
||||||
|
}
|
||||||
|
|
||||||
|
%\ccMethod{void x_to_id(Solution_1 x, bool\& is_event, unsigned int\& i);}{
|
||||||
|
% For a given $x$, this method computes whether the vertical line at this $x$
|
||||||
|
% contains an event (\ccc{is_event} == \ccc{true}) and returns the id $i$
|
||||||
|
% of it. Otherwise, $i$ returns the id of the interval $x$ lies in.
|
||||||
|
%}
|
||||||
|
|
||||||
|
\ccMethod{Curve_vertical_line vertical_line_at_event(int i);}{
|
||||||
|
returns an instance of \ccc{CurveVerticalLine} at the $i$-th event
|
||||||
|
}
|
||||||
|
|
||||||
|
\ccMethod{Curve_vertical_line vertical_line_of_interval(int i);}{
|
||||||
|
returns an instance of \ccc{CurveVerticalLine} of the $i$-th interval
|
||||||
|
between $x$-events.
|
||||||
|
}
|
||||||
|
|
||||||
|
\ccMethod{Curve_vertical_line vertical_line_for_x(Solution_1 x,
|
||||||
|
CGAL::Sign perturb = CGAL::ZERO););}{
|
||||||
|
returns vertical\_line\_at\_event(i), if $x$ hits $i$-th event, otherwise
|
||||||
|
returns vertical\_line\_of\_interval(i), where $i$ is the id of the interval
|
||||||
|
$x$ lies in. If $pertub$ is CGAL::POSITIVE/CGAL::NEGATIVE, then a slighty
|
||||||
|
perturbed x is used (adding $\pm\epsilon$).
|
||||||
|
\ccPrecond{$x$ is finite}
|
||||||
|
}
|
||||||
|
|
||||||
|
\ccMethod{Curve_vertical_line vertical_line_at_exact_x(Solution_1 x);}{
|
||||||
|
returns an instance of \ccc{CurveVerticalLine} at the given $x$.
|
||||||
|
\ccPrecond{$x$ is finite}
|
||||||
|
}
|
||||||
|
|
||||||
|
Note that the access methods to vertical lines are not redundant! The ones
|
||||||
|
using an id-value are efficient for speed-ups (caching, avoids to search some
|
||||||
|
$x$, just one representative vertical line for an interval). The others
|
||||||
|
enables a user to compute vertical lines for given $x$, i.e. also to
|
||||||
|
$y$-coordinates at given $x$.
|
||||||
|
|
||||||
|
\end{ccRefConcept}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,205 @@
|
||||||
|
\begin{ccRefConcept}{CurvePairVerticalLine}
|
||||||
|
|
||||||
|
\ccDefinition
|
||||||
|
|
||||||
|
The \ccc{CurvePairVerticalLine} concept is meant to provide information
|
||||||
|
about the intersections of a pair of curves with a (fictious) vertical line
|
||||||
|
(ignoring vertical lines of the curves themselves). Each intersection of a
|
||||||
|
curve with the vertical line defined by some given $x$ induces an event.
|
||||||
|
An event can be asked for its coordinates (\ccc{Solution_2}) and the involved
|
||||||
|
curve(s). Note that the involvment also holds for curve ends approaching the
|
||||||
|
vertical asymptote. Again CurvePairVerticalLines at $x = \pm\infty$ are
|
||||||
|
not allowed.
|
||||||
|
|
||||||
|
\ccTypes
|
||||||
|
|
||||||
|
\ccNestedType{Solution_1}{
|
||||||
|
Is a model of the \ccc{AlgebraicCurveKernel_2::Solution_1} concept
|
||||||
|
}
|
||||||
|
|
||||||
|
\ccNestedType{Solution_2}{
|
||||||
|
Is a model of the \ccc{AlgebraicCurveKernel_2::Solution_2} concept
|
||||||
|
}
|
||||||
|
|
||||||
|
\ccCreationVariable{cpvl}
|
||||||
|
\ccAccessFunctions
|
||||||
|
|
||||||
|
\ccMethod{Solution_1 x();}{
|
||||||
|
returns the $x$-coordinate of the vertical line (always a finite value).
|
||||||
|
}
|
||||||
|
|
||||||
|
\ccMethod{unsigned int num_events();}{
|
||||||
|
returns number of distinct intersections of a pair of curves with a
|
||||||
|
(fictious) vertical line ignoring a real vertical line component
|
||||||
|
of the curves at the given $x$-coordinate.
|
||||||
|
}
|
||||||
|
|
||||||
|
\ccMethod{int get_y_position_of_event(int k, bool c);}{
|
||||||
|
returns the $y$-position of the $k$-th arc of the $c$-''th''
|
||||||
|
(0 or 1) curve in the sequence of events. Note that each event
|
||||||
|
is formed by the first, the second, or both curves.
|
||||||
|
\ccPrecond{$0 \leq j < \mbox{number of arcs defined for the curve at x()}$}
|
||||||
|
}
|
||||||
|
|
||||||
|
\ccMethod{int get_multiplicity_of_intersection_event(int j);}{
|
||||||
|
returns the multiplicity of intersection defined at event with position $j$
|
||||||
|
\ccPrecond{Both curves form event $j$}
|
||||||
|
\ccPrecond{$0 \leq j < \mbox{num\_events()}$}
|
||||||
|
}
|
||||||
|
|
||||||
|
\ccMethod{std::pair< int, int > curve_arcs_at_event(int j);}{
|
||||||
|
returns a pair of int indicating whether event $j$ is formed by
|
||||||
|
which arc numbers of the first and the second curve, or $-1$, if the
|
||||||
|
corresponding curve is not involved.
|
||||||
|
\ccPrecond{$0 \leq j < \mbox{num\_events()}$}
|
||||||
|
}
|
||||||
|
|
||||||
|
\ccMethod{Solution_2 get_solution_2(int j);}{
|
||||||
|
returns an object of type \ccc{Solution_2} for the $j$-the event
|
||||||
|
\ccPrecond{$0 \leq j < \mbox{num\_events()}$}
|
||||||
|
}
|
||||||
|
|
||||||
|
\ccMethod{bool has_event_of_curve();}{
|
||||||
|
returns \ccc{true} if curve has vertical line component or
|
||||||
|
curve $f$ has intersection with $f_y$ at $x$
|
||||||
|
}
|
||||||
|
|
||||||
|
\end{ccRefConcept}
|
||||||
|
|
||||||
|
\begin{ccRefConcept}{CurvePairAnalysis_2}
|
||||||
|
|
||||||
|
\ccDefinition
|
||||||
|
|
||||||
|
The \ccc{CurvePairAnalysis_2} concept is meant to provide tools to analyse
|
||||||
|
a pair of curves. An analysis is meant to describe the curve pair's
|
||||||
|
interesting points and how they are connected.
|
||||||
|
The analysis searches for {\it events}. Events only
|
||||||
|
occur at a finite number of $x$-coordinate. Each such coordinate is
|
||||||
|
covered by a CurvePairVerticalLine, originated by the events of a single curve
|
||||||
|
and also the intersections of two curves.
|
||||||
|
These coordinates also define open {\it intervals}
|
||||||
|
on the $x$-axis. CurvePairVerticalLines at values in between one such interval
|
||||||
|
differ only in the values of the Solution\_2 entries. Topological
|
||||||
|
information are equal.
|
||||||
|
|
||||||
|
\ccRefines{
|
||||||
|
\ccc{DefaultConstructible, CopyConstructible, Assignable}
|
||||||
|
}
|
||||||
|
|
||||||
|
\ccTypes
|
||||||
|
|
||||||
|
\ccNestedType{Solution_1}{
|
||||||
|
Is a model of the \ccc{AlgebraicCurveKernel_2::Solution_1} concept
|
||||||
|
}
|
||||||
|
|
||||||
|
\ccNestedType{Solution_2}{
|
||||||
|
Is a model of the \ccc{AlgebraicCurveKernel_2::Solution_2} concept
|
||||||
|
}
|
||||||
|
|
||||||
|
\ccNestedType{Polynomial_2}{
|
||||||
|
Is a model of \ccc{AlgebraicCurveKernel_2::Polynomial_2}
|
||||||
|
concept.\\
|
||||||
|
Especially needed: Canonicalize, GcdUpToConstantFactor,
|
||||||
|
IntegralDivUpToConstantFactor,
|
||||||
|
MakeSquareFreeUpToConstantFactor, and
|
||||||
|
SquareFreeFactorizationUpToConstantFactor
|
||||||
|
}
|
||||||
|
|
||||||
|
\ccNestedType{Curve_pair_vertical_line}
|
||||||
|
{Is a model of the \ccc{CurvePairAnalysis_2::CurvePairVerticalLine} concept}
|
||||||
|
|
||||||
|
\ccNestedType{Curve_analysis_2}
|
||||||
|
{Is a model of the \ccc{CurvePairAnalysis::CurveAnalysis_2} concept}
|
||||||
|
|
||||||
|
\ccCreation
|
||||||
|
\ccCreationVariable{cp}
|
||||||
|
|
||||||
|
\ccConstructor{CurvePairAnalysis_2(Curve_analysis_2 p1, Curve_analysis_2 p2);}
|
||||||
|
{constructs an analysis for the curve-pair defined by analyses given by
|
||||||
|
p1 and p2. The polynomials defining the analyses must be squarefree and
|
||||||
|
coprime.
|
||||||
|
}
|
||||||
|
|
||||||
|
\begin{ccAdvanced}
|
||||||
|
|
||||||
|
\ccConstructor{template < class InputIterator >
|
||||||
|
CurvePairAnalysis_2(Curve_analysis_2 p1, Curve_analysis_2 p2,
|
||||||
|
InputIterator begin, InputIterator end);}{
|
||||||
|
constructs an analysis for the pair of curves defined by $p1$ and $p2$.
|
||||||
|
The polynomials definining the analyses must be squarefree and coprime.
|
||||||
|
The iterator range [begin,end) contains factors of $\mbox{resultant}(p,q,y)$,
|
||||||
|
i.e., define $x$-coordinates,
|
||||||
|
which allows to simplify the real root isolation within this layer.
|
||||||
|
The \ccc{value_type} of InputIterator is \ccc{Polynomial_1}.
|
||||||
|
This constructor has been introduced to enable an upper layer (CK) to use
|
||||||
|
additional knowledge on the problem.
|
||||||
|
}
|
||||||
|
|
||||||
|
\end{ccAdvanced}
|
||||||
|
|
||||||
|
\ccAccessFunctions
|
||||||
|
|
||||||
|
\ccMethod{Curve_analysis_2 get_curve_analysis(bool c);}{
|
||||||
|
returns curve analyis for $c$-''th'' curve (0 or 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
\ccMethod{unsigned int num_vertical_lines_with_event();}{
|
||||||
|
returns number of vertical lines that encode an event
|
||||||
|
}
|
||||||
|
|
||||||
|
%\ccMethod{void x_to_id(Solution_1 x, bool\& is_event, unsigned int\& i);}{
|
||||||
|
% For a given $x$, this method computes whether the vertical line at this $x$
|
||||||
|
% contains an event (\ccc{is_event} == \ccc{true}) and returns the id $i$
|
||||||
|
% of it. Otherwise, $i$ returns the id of the interval $x$ lies in.
|
||||||
|
%}
|
||||||
|
|
||||||
|
\ccMethod{int event_of_curve_analysis(unsigned int i, bool c);}{
|
||||||
|
Given the $i$-th event,
|
||||||
|
this method returns the id of the event of the corresponding curve
|
||||||
|
analysis $c$ (0 or 1), or $-1$, if the curve has no event at this coordinate.
|
||||||
|
}
|
||||||
|
|
||||||
|
\ccMethod{Curve_pair_vertical_line vertical_line_at_event(int i);}{
|
||||||
|
returns an instance of \ccc{CurvePairVerticalLine} at the $i$-th event
|
||||||
|
}
|
||||||
|
|
||||||
|
\ccMethod{Curve_pair_vertical_line vertical_line_of_interval(int i);}{
|
||||||
|
returns an instance of \ccc{CurvePairVerticalLine} of the $i$-th interval
|
||||||
|
between $x$-events.
|
||||||
|
}
|
||||||
|
|
||||||
|
\ccMethod{Curve_pair_vertical_line vertical_line_for_x(Solution_1 x,
|
||||||
|
CGAL::Sign perturb = CGAL::ZERO);}{
|
||||||
|
returns vertical\_line\_at\_event(i), if $x$ hits $i$-th event, otherwise
|
||||||
|
returns vertical\_line\_of\_interval(i), where $i$ is the id of the interval
|
||||||
|
$x$ lies in. If $pertub$ is CGAL::POSITIVE/CGAL::NEGATIVE, then a slighty
|
||||||
|
perturbed x is used (adding $\pm\epsilon$).
|
||||||
|
\ccPrecond{$x$ is finite}
|
||||||
|
}
|
||||||
|
|
||||||
|
\ccMethod{Curve_pair_vertical_line vertical_line_at_exact_x(Solution_1 x);}{
|
||||||
|
returns an instance of \ccc{CurvePairVerticalLine} at the given $x$
|
||||||
|
\ccPrecond{$x$ is finite}
|
||||||
|
}
|
||||||
|
|
||||||
|
Note that the access methods to vertical lines are not redundant! The ones
|
||||||
|
using an id-value are efficient for speed-ups (caching, avoids to search some
|
||||||
|
$x$, just one representative vertical line for an interval). The others
|
||||||
|
enables a user to compute vertical lines for given $x$, i.e. also to
|
||||||
|
$y$-coordinates at given $x$.
|
||||||
|
|
||||||
|
%Additionally note that we talk about 4 sequences of $x$-critical lines here.
|
||||||
|
%
|
||||||
|
%\begin{itemize}
|
||||||
|
%\item The sequence of CurveVerticalLines of $p$ where each CVL has been
|
||||||
|
%converted and merged with $q$ to a CVPL.
|
||||||
|
%\item The sequence of CurveVerticalLines of $q$ where each CVL has been
|
||||||
|
%converted and merged with $p$ to a CPVL.
|
||||||
|
%\item The sequence of CurvePairVerticalLines of the intersections of
|
||||||
|
%$p$ and $q$
|
||||||
|
%\item The merged sequence of CurvePairVerticalLines of the former three
|
||||||
|
%sequences. The method event\_id\_of\_x helps to find indeces in the first
|
||||||
|
%three sequences starting from an index in this sequence!
|
||||||
|
%\end{itemize}
|
||||||
|
|
||||||
|
\end{ccRefConcept}
|
||||||
|
|
@ -0,0 +1,51 @@
|
||||||
|
\begin{ccRefConcept}{Solution_1}
|
||||||
|
|
||||||
|
\ccDefinition
|
||||||
|
|
||||||
|
The concept \ccc{Solution_1} is meant to store a coordinate ($x$, or $y$) of
|
||||||
|
a point on curve.
|
||||||
|
|
||||||
|
\ccRefines
|
||||||
|
\ccc{RealEmbeddable}
|
||||||
|
|
||||||
|
Remark: Michael Hemmer proposed to extend the concept \ccc{RealEmbeddable}
|
||||||
|
with the notion of compactification (adding/dealing with $\pm\infty$). A
|
||||||
|
valid model has to implement handling of infinity.
|
||||||
|
|
||||||
|
\begin{ccAdvanced}
|
||||||
|
|
||||||
|
\ccTypes
|
||||||
|
|
||||||
|
\ccTypedef{typedef typename Solution_1::Boundary Boundary;}{A NT being able
|
||||||
|
to represent values between two Solution\_1}
|
||||||
|
|
||||||
|
\ccCreationVariable{sol1}
|
||||||
|
|
||||||
|
\ccAccessFunctions
|
||||||
|
|
||||||
|
Is this type meant to be really abstract (only RealEmbeddable) or
|
||||||
|
do we want to have access
|
||||||
|
to certain entries? In general, it should be possible to use an appropriate
|
||||||
|
NT here, i.e., a NT that fits the needs of the CA/CPA.
|
||||||
|
|
||||||
|
TODO: Defining polynomial?
|
||||||
|
|
||||||
|
TODO: For some purposes (e.g., drawing, seperation) it is useful to have the
|
||||||
|
following methods:
|
||||||
|
|
||||||
|
\ccMethod{Boundary between(Solution_1 s);}{
|
||||||
|
returns a rational between \ccc{sol1} and \ccc{s}
|
||||||
|
\ccPrecond{sol1 != s}
|
||||||
|
}
|
||||||
|
|
||||||
|
\ccMethod{std::pair<Boundary,Boundary> s1.approximate(int prec);}{
|
||||||
|
Refines the representation to the given precision (binary digits
|
||||||
|
after point). Internally the precision can already be higher.
|
||||||
|
}
|
||||||
|
|
||||||
|
The advanced methods can be seen as a refined concept for enabling drawing.
|
||||||
|
Maybe, we can have it orthogonal to the normal concept.
|
||||||
|
|
||||||
|
\end{ccAdvanced}
|
||||||
|
|
||||||
|
\end{ccRefConcept}
|
||||||
|
|
@ -0,0 +1,43 @@
|
||||||
|
\begin{ccRefConcept}{Solution_2}
|
||||||
|
|
||||||
|
\ccDefinition
|
||||||
|
|
||||||
|
The concept \ccc{Solution_2} is meant to store both coordinates of a point
|
||||||
|
on a curve.
|
||||||
|
|
||||||
|
\ccCreationVariable{sol2}
|
||||||
|
|
||||||
|
\ccAccessFunctions
|
||||||
|
|
||||||
|
\ccMethod{Solution_1 x();}{
|
||||||
|
returns $x$-coordinate.
|
||||||
|
May throw some exception if algebraic degree becomes to large.
|
||||||
|
Usual always computed and therefore easy to access.
|
||||||
|
}
|
||||||
|
|
||||||
|
\ccMethod{Solution_1 y();}{
|
||||||
|
returns $y$-coordinate.
|
||||||
|
May throw some exception if algebraic degree becomes to large.
|
||||||
|
Note that it can be costly to compute this value, so accessing it
|
||||||
|
should be handled with care.
|
||||||
|
}
|
||||||
|
|
||||||
|
\ccMethod{std::pair<Boundary,Boundary> s1.approximate_x(int prec);}{
|
||||||
|
Refines the representation of $x$ to the given precision
|
||||||
|
(binary digits after point).
|
||||||
|
Internally the precision can already be higher. Note that it can just
|
||||||
|
refer to x().approximate(), but it can be more efficient or just possible
|
||||||
|
to compute it without constructing the exact value.
|
||||||
|
}
|
||||||
|
|
||||||
|
\ccMethod{std::pair<Boundary,Boundary> s1.approximate_y(int prec);}{
|
||||||
|
Refines the representation of $y$ to the given precision
|
||||||
|
(binary digits after point).
|
||||||
|
Internally the precision can already be higher. Note that it can just
|
||||||
|
refer to y().approximate(), but it can be more efficient or just possible
|
||||||
|
to compute it without constructing the exact value.
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
\end{ccRefConcept}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
\ccRefChapter{Curve- and CurvePairAnalysis}
|
||||||
|
|
||||||
|
Initial remark: The design is not symmetric in the coordinates, due to the fact
|
||||||
|
that people also only talk about ``vertical decomposition'' and not
|
||||||
|
``horizontal decompositions''. A {\it horizontal} version can easily
|
||||||
|
derived from the concept, if needed.
|
||||||
|
|
||||||
|
\input{Curve_and_curve_pair_analysis_2_ref/Solution_1}
|
||||||
|
\input{Curve_and_curve_pair_analysis_2_ref/Solution_2}
|
||||||
|
\input{Curve_and_curve_pair_analysis_2_ref/CurveAnalysis_2}
|
||||||
|
\input{Curve_and_curve_pair_analysis_2_ref/CurvePairAnalysis_2}
|
||||||
|
\input{Curve_and_curve_pair_analysis_2_ref/AlgebraicCurveKernel_2}
|
||||||
Loading…
Reference in New Issue