diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Arrangement_on_surface_2.txt b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Arrangement_on_surface_2.txt index 1f0fc41dfb6..fb5b5a95a07 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Arrangement_on_surface_2.txt +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Arrangement_on_surface_2.txt @@ -3820,12 +3820,14 @@ asymmetry is also reflected in the predicates listed below. They help determining the order of curve-ends lying on the boundary of the parameter space with respect to regular points and among each other. -The concept `ArrangementVerticalSideTraits_2` requires the following +The concepts `ArrangementClosedLeftTraits_2`, +`ArrangementClosedRightTraits_2`, and +`ArrangementIdentifiedVerticalTraits_2` require the following additional predicate:
-
\link ArrangementVerticalSideTraits_2::Compare_y_on_boundary_2 `Compare_y_on_boundary_2`\endlink: +
\link ArrangementIdentifiedVerticalTraits_2::Compare_y_on_boundary_2 `Compare_y_on_boundary_2`\endlink:
Given two points \f$p_1=(x_{p_1},y_{p_1})\f$ and \f$p_2=(x_{p_2},y_{p_2})\f$, such that at least one of them lies on a @@ -3839,6 +3841,12 @@ this overloaded version is required only for the concepts `ArrangementClosedLeftTraits_2`, `ArrangementClosedRightTraits_2`, and `ArrangementIdentifiedVerticalTraits_2`. +
+ +The concept `ArrangementVerticalSideTraits_2` requires the following additional predicate: + +
+
\link ArrangementVerticalSideTraits_2::Compare_y_near_boundary_2 `Compare_y_near_boundary_2`\endlink:
@@ -3971,7 +3979,7 @@ boundary-side, \f$p\f$ is located far to the top in a similar manner.
The concept `ArrangementIdentifiedVerticalTraits_2` requires the following -predicate: +additional predicate:
@@ -3991,7 +3999,7 @@ boundary.
Similarly, the concept `ArrangementIdentifiedHorizontalTraits_2` -requires the following predicate: +requires the following additional predicate:
diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXOnBoundaryOfCurveEnd_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXOnBoundaryOfCurveEnd_2.h new file mode 100644 index 00000000000..0feb21ddd81 --- /dev/null +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXOnBoundaryOfCurveEnd_2.h @@ -0,0 +1,74 @@ +namespace ArrTraits { + +/*! \ingroup PkgArrangementOnSurface2ConceptsFunctionObjects + * \cgalConcept + * + * \cgalRefines AdaptableFunctor + * + * \cgalHasModel ArrangementHorizontalSideTraits_2::Compare_x_on_boundary_2 + * \cgalHasModel ArrangementOpenBoundaryTraits_2::Compare_x_on_boundary_2 + * \cgalHasModel ArrangementSphericalBoundaryTraits_2::Compare_x_on_boundary_2 + */ +class CompareXOnBoundaryOfCurveEnd_2 { +public: + + /// \name Operations + /// A model of this concept must provide: + /// @{ + + /*! Given a point `p`, an \f$x\f$-monotone curve `xcv`, and an + * enumeration `ce` that specifies either the minimum or the maximum end of + * the curve where the curve has a vertical asymptote, compares the \f$ + * x\f$-coordinate of `p` and the \f$x\f$-coordinate of the limit of the + * curve at its specificed end. The variable `xcv` identifies the parametric + * curve \f$c(t) = (x(t), y(t))\f$ defined over an open or half-open interval + * with endpoints \f$ 0\f$ and \f$ 1\f$. The enumeration `ce` identifies an + * open end \f$d \in\{0,1\}\f$ of \f$c\f$. Formally, compares the \f$ + * x\f$-coordinate of `p` and \f$ \lim_{t \rightarrow d} x(t)\f$. Returns + * `CGAL::SMALLER`, `CGAL::EQUAL`, or `CGAL::LARGER` accordingly. + * + * \pre \link ArrangementHorizontalSideTraits_2::Parameter_space_in_y_2 `Parameter_space_in_y_2`\endlink (`xcv`, `ce`) \f$\neq\f$ `CGAL::ARR_INTERIOR`. + * + * \pre If the parameter space is unbounded, \f$c\f$ has a vertical asymptote + * at its \f$ d\f$-end; that is, + * \link ArrangementVerticalSideTraits_2::Parameter_space_in_x_2 `Parameter_space_in_x_2`\endlink(`xcv`, `ce`) = `CGAL::ARR_INTERIOR`. + */ + Comparison_result operator()(const ArrTraits::Point_2& p, + const ArrTraits::X_monotone_curve_2& xcv, + CGAL::Arr_curve_end ce); + +/*! Given two \f$ x\f$-monotone curves `xcv1` and `xcv2` and two indices `ce1` + * and `ce2` that specify either the minimum or the maximum ends of `xcv1` and + * `xcv2`, respectively, where the curves have vertical asymptotes, compares the + * \f$ x\f$-coordinates of the limits of the curves at their specificed + * ends. The variables `xcv1` and `xcv2` identify the parametric curves \f$ + * c_1(t) = (x_1(t),y_1(t))\f$ and \f$ c_2(t) = (x_2(t),y_2(t))\f$, + * respectively, defined over open or half-open intervals with endpoints \f$ + * 0\f$ and \f$ 1\f$. The indices `ce1` and `ce2` identify open ends \f$ d_1 + * \in\{0,1\}\f$ and \f$ d_2 \in\{0,1\}\f$ of \f$ c_1\f$ and \f$ c_2\f$, + * respectively. Formally, compares \f$ \lim_{t \rightarrow d_1} x_1(t)\f$ and + * \f$\lim_{t \rightarrow d_2} x_2(t)\f$. Returns `CGAL::SMALLER`, + * `CGAL::EQUAL`, or `CGAL::LARGER` accordingly. + * + * \pre \link ArrangementHorizontalSideTraits_2::Parameter_space_in_y_2 `Parameter_space_in_y_2`\endlink(`xcv1`, `ce1`) \f$\neq\f$ `CGAL::ARR_INTERIOR`. + * + * \pre \link ArrangementHorizontalSideTraits_2::Parameter_space_in_y_2 `Parameter_space_in_y_2`\endlink(`xcv2`, `ce2`) \f$\neq\f$ `CGAL::ARR_INTERIOR`. + * + * \pre If the parameter space is unbounded, \f$c_1\f$ has a vertical + * asymptote at its respective end; that is, + * \link ArrangementVerticalSideTraits_2::Parameter_space_in_x_2 `Parameter_space_in_x_2`\endlink(`xcv1`, `ce1`) = `CGAL::ARR_INTERIOR`. + * + * \pre If the parameter space is unbounded, \f$c_2\f$ has a vertical asymptote + * at its respective end; that is, + * \link ArrangementVerticalSideTraits_2::Parameter_space_in_x_2 `Parameter_space_in_x_2`\endlink(`xcv2`, `ce2`) = `CGAL::ARR_INTERIOR`. + */ +Comparison_result operator()(const ArrTraits::X_monotone_curve_2& xcv1, + CGAL::Arr_curve_end ce1, + const ArrTraits::X_monotone_curve_2& xcv2, + CGAL::Arr_curve_end ce2); + +/// @} + +}; /* end ArrTraits::CompareXOnBoundaryOfCurveEnd_2 */ + +} diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXOnBoundary_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXOnBoundary_2.h index b5fe124bd5c..8e38e97c686 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXOnBoundary_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareXOnBoundary_2.h @@ -5,9 +5,9 @@ namespace ArrTraits { * * \cgalRefines AdaptableFunctor * - * \cgalHasModel ArrangementHorizontalSideTraits_2::Compare_x_on_boundary_2 - * \cgalHasModel ArrangementOpenBoundaryTraits_2::Compare_x_on_boundary_2 - * \cgalHasModel ArrangementSphericalBoundaryTraits_2::Compare_x_on_boundary_2 + * \cgalHasModel ArrangementClosedBottomTraits_2::Compare_x_on_boundary_2 + * \cgalHasModel ArrangementClosedTopTraits_2::Compare_x_on_boundary_2 + * \cgalHasModel ArrangementIdentifiedHorizontalTraits_2::Compare_x_on_boundary_2 */ class CompareXOnBoundary_2 { public: @@ -16,59 +16,21 @@ public: /// A model of this concept must provide: /// @{ - /*! Given a point `p`, an \f$x\f$-monotone curve `xcv`, and an - * enumeration `ce` that specifies either the minimum or the maximum end of - * the curve where the curve has a vertical asymptote, compares the \f$ - * x\f$-coordinate of `p` and the \f$x\f$-coordinate of the limit of the - * curve at its specificed end. The variable `xcv` identifies the parametric - * curve \f$c(t) = (x(t), y(t))\f$ defined over an open or half-open interval - * with endpoints \f$ 0\f$ and \f$ 1\f$. The enumeration `ce` identifies an - * open end \f$d \in\{0,1\}\f$ of \f$c\f$. Formally, compares the \f$ - * x\f$-coordinate of `p` and \f$ \lim_{t \rightarrow d} x(t)\f$. Returns + /*! Given two points `p1` and `p2`, such that either `p1` or `p2` (or both) + * lie on the bottom or top boundary of the parameter space, compares the \f$ + * x\f$-coordinate of `p1` and the \f$x\f$-coordinate of `p2`. Returns * `CGAL::SMALLER`, `CGAL::EQUAL`, or `CGAL::LARGER` accordingly. * - * \pre \link ArrangementHorizontalSideTraits_2::Parameter_space_in_y_2 `Parameter_space_in_y_2`\endlink (`xcv`, `ce`) \f$\neq\f$ `CGAL::ARR_INTERIOR`. - * - * \pre If the parameter space is unbounded, \f$c\f$ has a vertical asymptote - * at its \f$ d\f$-end; that is, - * \link ArrangementVerticalSideTraits_2::Parameter_space_in_x_2 `Parameter_space_in_x_2`\endlink(`xcv`, `ce`) = `CGAL::ARR_INTERIOR`. + * \pre \link ArrangementHorizontalSideTraits_2::Parameter_space_in_y_2 + * `Parameter_space_in_y_2`\endlink (`p1`) \f$\neq\f$ `CGAL::ARR_INTERIOR` or + * \link ArrangementHorizontalSideTraits_2::Parameter_space_in_y_2 + * `Parameter_space_in_y_2`\endlink (`p2`) \f$\neq\f$ `CGAL::ARR_INTERIOR`. */ - Comparison_result operator()(const ArrTraits::Point_2& p, - const ArrTraits::X_monotone_curve_2& xcv, - CGAL::Arr_curve_end ce); - -/*! Given two \f$ x\f$-monotone curves `xcv1` and `xcv2` and two indices `ce1` - * and `ce2` that specify either the minimum or the maximum ends of `xcv1` and - * `xcv2`, respectively, where the curves have vertical asymptotes, compares the - * \f$ x\f$-coordinates of the limits of the curves at their specificed - * ends. The variables `xcv1` and `xcv2` identify the parametric curves \f$ - * c_1(t) = (x_1(t),y_1(t))\f$ and \f$ c_2(t) = (x_2(t),y_2(t))\f$, - * respectively, defined over open or half-open intervals with endpoints \f$ - * 0\f$ and \f$ 1\f$. The indices `ce1` and `ce2` identify open ends \f$ d_1 - * \in\{0,1\}\f$ and \f$ d_2 \in\{0,1\}\f$ of \f$ c_1\f$ and \f$ c_2\f$, - * respectively. Formally, compares \f$ \lim_{t \rightarrow d_1} x_1(t)\f$ and - * \f$\lim_{t \rightarrow d_2} x_2(t)\f$. Returns `CGAL::SMALLER`, - * `CGAL::EQUAL`, or `CGAL::LARGER` accordingly. - * - * \pre \link ArrangementHorizontalSideTraits_2::Parameter_space_in_y_2 `Parameter_space_in_y_2`\endlink(`xcv1`, `ce1`) \f$\neq\f$ `CGAL::ARR_INTERIOR`. - * - * \pre \link ArrangementHorizontalSideTraits_2::Parameter_space_in_y_2 `Parameter_space_in_y_2`\endlink(`xcv2`, `ce2`) \f$\neq\f$ `CGAL::ARR_INTERIOR`. - * - * \pre If the parameter space is unbounded, \f$c_1\f$ has a vertical - * asymptote at its respective end; that is, - * \link ArrangementVerticalSideTraits_2::Parameter_space_in_x_2 `Parameter_space_in_x_2`\endlink(`xcv1`, `ce1`) = `CGAL::ARR_INTERIOR`. - * - * \pre If the parameter space is unbounded, \f$c_2\f$ has a vertical asymptote - * at its respective end; that is, - * \link ArrangementVerticalSideTraits_2::Parameter_space_in_x_2 `Parameter_space_in_x_2`\endlink(`xcv2`, `ce2`) = `CGAL::ARR_INTERIOR`. - */ -Comparison_result operator()(const ArrTraits::X_monotone_curve_2& xcv1, - CGAL::Arr_curve_end ce1, - const ArrTraits::X_monotone_curve_2& xcv2, - CGAL::Arr_curve_end ce2); + Comparison_result operator()(const ArrTraits::Point_2& p1, + const ArrTraits::Point_2& p2); /// @} -}; /* end ArrTraits::CompareXOnBoundary_2 */ +}; /* end ArrTraits::CompareXOnBoundaryOfCurveEnd_2 */ } diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYOnBoundary_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYOnBoundary_2.h index 1bcd4a259ab..d19d83140cb 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYOnBoundary_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrTraits--CompareYOnBoundary_2.h @@ -8,6 +8,8 @@ namespace ArrTraits { * \cgalHasModel ArrangementClosedLeftTraits_2::Compare_y_on_boundary_2 * \cgalHasModel ArrangementClosedRightTraits_2::Compare_y_on_boundary_2 * \cgalHasModel ArrangementIdentifiedVerticalTraits_2::Compare_y_on_boundary_2 + * \cgalHasModel ArrangementOpenBoundaryTraits_2::Compare_y_on_boundary_2 + * \cgalHasModel ArrangementSphericalBoundaryTraits_2::Compare_y_on_boundary_2 */ class CompareYOnBoundary_2 { public: @@ -16,9 +18,10 @@ public: /// A model of this concept must provide: /// @{ - /*! Given two points `p1` and `p2` returns `CGAL::SMALLER`, `CGAL::EQUAL`, or - * `CGAL::LARGER` according to the lexicographic \f$xy\f$-order of the points - * `p1` and `p2`. + /*! Given two points `p1` and `p2`, such that either `p1` or `p2` (or both) + * lie on the bottom or top boundary of the parameter space, compares the \f$ + * y\f$-coordinate of `p1` and the \f$y\f$-coordinate of `p2`. Returns + * `CGAL::SMALLER`, `CGAL::EQUAL`, or `CGAL::LARGER` accordingly. * * \pre \link ArrangementVerticalSideTraits_2::Parameter_space_in_x_2 * `Parameter_space_in_x_2`\endlink (`p1`) \f$\neq\f$ `CGAL::ARR_INTERIOR` or diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementClosedBottomTraits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementClosedBottomTraits_2.h index bfb8a4296be..fcd6b4d81a1 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementClosedBottomTraits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementClosedBottomTraits_2.h @@ -34,7 +34,13 @@ public: /// \name Functor Types /// @{ + /// models the concept `ArrTraits::CompareXOnBoundary_2`. + typedef unspecified_type Compare_x_on_boundary_2; + + /// @} + /// \name Accessing Functor Objects /// @{ + Compare_x_on_boundary_2 compare_x_on_boundary_2_object() const; /// @} } diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementClosedIdentifiedVerticalTraits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementClosedIdentifiedVerticalTraits_2.h deleted file mode 100644 index b736764115b..00000000000 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementClosedIdentifiedVerticalTraits_2.h +++ /dev/null @@ -1,42 +0,0 @@ -/*! \ingroup PkgArrangementOnSurface2ConceptsTraits - * \cgalConcept - * - * `ArrangementClosedIdentifiedVerticalTraits_2` is an abstract concept. It - * generalizes the concepts `ArrangementClosedLeftTraits_2`, - * `ArrangementClosedRightTraits_2`, and - * `ArrangementIdentifiedVerticalTraits_2`. (An "abstract" concept is a concept - * that is useless on its own.) Only a combination of this concept and one or - * more concepts that handle curves that either reach or approach the remaining - * boundary sides (that is, borrom and top) are purposeful, and can have models. - * - * \cgalRefines `ArrangementBasicTraits_2` - * - * \cgalHasModel `CGAL::Arr_geodesic_arc_on_sphere_traits_2` - * - * \sa `ArrangementVerticalSideTraits_2` - */ -class ArrangementVerticalSideTraits_2 { -public: - - /// \name Categories - /// @{ - /// @} - - /// \name Types - /// @{ - /// @} - - /// \name Functor Types - /// @{ - - /// models the concept `ArrTraits::CompareXOnBoundary_2`. - typedef unspecified_type Compare_y_on_boundary_2; - - /// @} - - /// \name Accessing Functor Objects - /// @{ - Compare_y_on_boundary_2 compare_y_on_boundary_2_object() const; - /// @} - -}; /* end ArrangementHorizontalSideTraits_2 */ diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementClosedLeftTraits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementClosedLeftTraits_2.h index 10a03a61880..67722a077a2 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementClosedLeftTraits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementClosedLeftTraits_2.h @@ -35,7 +35,13 @@ public: /// \name Functor Types /// @{ + /// models the concept `ArrTraits::CompareYOnBoundary_2`. + typedef unspecified_type Compare_y_on_boundary_2; + + /// @} + /// \name Accessing Functor Objects /// @{ + Compare_y_on_boundary_2 compare_y_on_boundary_2_object() const; /// @} -} +}; diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementClosedRightTraits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementClosedRightTraits_2.h index a6f0aa75351..15d25b7c742 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementClosedRightTraits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementClosedRightTraits_2.h @@ -34,7 +34,13 @@ public: /// \name Functor Types /// @{ + /// models the concept `ArrTraits::CompareYOnBoundary_2`. + typedef unspecified_type Compare_y_on_boundary_2; + + /// @} + /// \name Accessing Functor Objects /// @{ + Compare_y_on_boundary_2 compare_y_on_boundary_2_object() const; /// @} -} +}; diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementClosedTopTraits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementClosedTopTraits_2.h index 801af5ec3da..fa56a6a59e4 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementClosedTopTraits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementClosedTopTraits_2.h @@ -34,7 +34,13 @@ public: /// \name Functor Types /// @{ + /// models the concept `ArrTraits::CompareXOnBoundary_2`. + typedef unspecified_type Compare_x_on_boundary_2; + + /// @} + /// \name Accessing Functor Objects /// @{ + Compare_x_on_boundary_2 compare_x_on_boundary_2_object() const; /// @} } diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementHorizontalSideTraits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementHorizontalSideTraits_2.h index cfd24a2d1fb..f6079dc6a6f 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementHorizontalSideTraits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementHorizontalSideTraits_2.h @@ -36,7 +36,7 @@ public: /// models the concept `ArrTraits::ParameterSpaceInY_2`. typedef unspecified_type Parameter_space_in_y_2; - /// models the concept `ArrTraits::CompareXOnBoundary_2`. + /// models the concept `ArrTraits::CompareXOnBoundaryOfCurveEnd_2`. typedef unspecified_type Compare_x_on_boundary_2; /// models the concept `ArrTraits::CompareXNearBoundary_2`. diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementIdentifiedHorizontalTraits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementIdentifiedHorizontalTraits_2.h index 168dbf885ce..e050e9e288e 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementIdentifiedHorizontalTraits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementIdentifiedHorizontalTraits_2.h @@ -34,6 +34,9 @@ public: /// \name Functor Types /// @{ + /// models the concept `ArrTraits::CompareXOnBoundary_2`. + typedef unspecified_type Compare_x_on_boundary_2; + /// models the concept `ArrTraits::IsOnXIdentification_2`. typedef unspecified_type Is_on_x_identification_2; @@ -42,5 +45,6 @@ public: /// \name Accessing Functor Objects /// @{ Is_on_x_identification_2 is_on_x_identification_2_object() const; + Compare_x_on_boundary_2 compare_x_on_boundary_2_object() const; /// @} } diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementIdentifiedVerticalTraits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementIdentifiedVerticalTraits_2.h index ff5d4b8ef31..e5cff1def05 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementIdentifiedVerticalTraits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementIdentifiedVerticalTraits_2.h @@ -34,6 +34,9 @@ public: /// \name Functor Types /// @{ + /// models the concept `ArrTraits::CompareYOnBoundary_2`. + typedef unspecified_type Compare_y_on_boundary_2; + /// models the concept `ArrTraits::IsOnYIdentification_2`. typedef unspecified_type Is_on_y_identification_2; @@ -41,6 +44,7 @@ public: /// \name Accessing Functor Objects /// @{ + Compare_y_on_boundary_2 compare_y_on_boundary_2_object() const; Is_on_y_identification_2 is_on_y_identification_2_object() const; /// @} } diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementOpenBoundaryTraits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementOpenBoundaryTraits_2.h index dafd343b5be..1424516ba10 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementOpenBoundaryTraits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementOpenBoundaryTraits_2.h @@ -96,10 +96,10 @@ public: */ typedef unspecified_type Parameter_space_in_y_2; - /*! models the concept `ArrTraits::CompareXOnBoundary_2`. Required only if - * the traits class supports unbounded curves that approach the bottom or the - * top sides (the `Bottom_side_category` or the `Top_side_category` categories - * are convertible to `CGAL::Arr_open_side_tag`). + /*! models the concept `ArrTraits::CompareXOnBoundaryOfCurveEnd_2`. Required + * only if the traits class supports unbounded curves that approach the bottom + * or the top sides (the `Bottom_side_category` or the `Top_side_category` + * categories are convertible to `CGAL::Arr_open_side_tag`). */ typedef unspecified_type Compare_x_on_boundary_2; diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementSphericalBoundaryTraits_2.h b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementSphericalBoundaryTraits_2.h index 2f70a5a055d..bb81a8eb17f 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementSphericalBoundaryTraits_2.h +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/Concepts/ArrangementSphericalBoundaryTraits_2.h @@ -51,7 +51,7 @@ public: /// models the concept `ArrTraits::ParameterSpaceInX_2`. typedef unspecified_type Parameter_space_in_x_2; - /// models the concept `ArrTraits::CompareXOnBoundary_2`. + /// models the concept `ArrTraits::CompareXOnBoundaryOfCurveEnd_2`. typedef unspecified_type Compare_x_on_boundary_2; /// models the concept `ArrTraits::CompareXNearBoundary_2`. diff --git a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/PackageDescription.txt b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/PackageDescription.txt index 8e5a61aac0a..8d6daf70bd6 100644 --- a/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/PackageDescription.txt +++ b/Arrangement_on_surface_2/doc/Arrangement_on_surface_2/PackageDescription.txt @@ -123,7 +123,6 @@ implemented as peripheral classes or as free (global) functions. - `ArrangementTraits_2` - `ArrangementHorizontalSideTraits_2` - `ArrangementVerticalSideTraits_2` -- `ArrangementClosedIdentifiedVerticalTraits_2` - `ArrangementIdentifiedVerticalTraits_2` - `ArrangementIdentifiedHorizontalTraits_2` - `ArrangementOpenBoundaryTraits_2` @@ -177,6 +176,7 @@ implemented as peripheral classes or as free (global) functions. - `ArrTraits::CompareYOnBoundary_2` - `ArrTraits::CompareXNearBoundary_2` - `ArrTraits::CompareYNearBoundary_2` +- `ArrTraits::CompareXOnBoundaryOfCurveEnd_2` - `ArrTraits::Intersect_2` - `ArrTraits::Split_2` - `ArrTraits::AreMergeable_2` diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_geodesic_arc_on_sphere_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_geodesic_arc_on_sphere_traits_2.h index fad8aabc754..a4d6a537193 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_geodesic_arc_on_sphere_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_geodesic_arc_on_sphere_traits_2.h @@ -1194,11 +1194,10 @@ public: */ Comparison_result operator()(const X_monotone_curve_2& xc1, const X_monotone_curve_2& xc2, - const Point_2& - CGAL_precondition_code(p)) const + const Point_2& p) const { - CGAL_precondition(!xc1.is_degenerate()); - CGAL_precondition(!xc2.is_degenerate()); + CGAL_precondition(! xc1.is_degenerate()); + CGAL_precondition(! xc2.is_degenerate()); CGAL_precondition(p == xc1.right()); CGAL_precondition(p == xc2.right()); @@ -1212,6 +1211,7 @@ public: // Compare the y-coord. at the x-coord of the most right left-endpoint. const Point_2& l1 = xc1.left(); const Point_2& l2 = xc2.left(); + if (!l1.is_no_boundary()) { // use l2 and xc1: Oriented_side os = m_traits.oriented_side(xc1.normal(), l2); @@ -1220,7 +1220,32 @@ public: ((os == ON_NEGATIVE_SIDE) ? LARGER : SMALLER) : ((os == ON_NEGATIVE_SIDE) ? SMALLER : LARGER); } - if (!l2.is_no_boundary()) { + + // if p and r1 are antipodal, compare the plane normals + const Kernel& kernel = m_traits; + auto opposite_3 = kernel.construct_opposite_direction_3_object(); + Direction_3 opposite_p = opposite_3(p); + if (kernel.equal_3_object()(opposite_p, Direction_3(l1)) || + kernel.equal_3_object()(opposite_p, Direction_3(l2))) + { + Sign xsign = Traits::x_sign(p); + Sign ysign = Traits::y_sign(p); + Project project = (xsign == ZERO) ? + ((ysign == POSITIVE) ? Traits::project_minus_xz : Traits::project_xz) : + ((xsign == POSITIVE) ? Traits::project_yz : Traits::project_minus_yz); + + Direction_2 n1 = project(xc1.normal()); + Direction_2 n2 = project(xc2.normal()); + auto opposite_2 = kernel.construct_opposite_direction_2_object(); + if (! xc1.is_directed_right()) n1 = opposite_2(n1); + if (! xc2.is_directed_right()) n2 = opposite_2(n2); + if (kernel.equal_2_object()(n1, n2)) return EQUAL; + const Direction_2 d(1, 0); + return (kernel.counterclockwise_in_between_2_object()(n1, d, n2)) ? + LARGER: SMALLER; + } + + if (! l2.is_no_boundary()) { // use l1 and xc2: Oriented_side os = m_traits.oriented_side(xc2.normal(), l1); return (os == ON_ORIENTED_BOUNDARY) ? EQUAL : @@ -1229,7 +1254,8 @@ public: ((os == ON_NEGATIVE_SIDE) ? LARGER : SMALLER); } - if (m_traits.compare_xy(l1, l2) == SMALLER) { + Comparison_result res = m_traits.compare_xy(l1, l2); + if (res == SMALLER) { // use l2 and xc1: Oriented_side os = m_traits.oriented_side(xc1.normal(), l2); return (os == ON_ORIENTED_BOUNDARY) ? EQUAL : @@ -1237,12 +1263,16 @@ public: ((os == ON_NEGATIVE_SIDE) ? LARGER : SMALLER) : ((os == ON_NEGATIVE_SIDE) ? SMALLER : LARGER); } - // use l1 and xc2: - Oriented_side os = m_traits.oriented_side(xc2.normal(), l1); - return (os == ON_ORIENTED_BOUNDARY) ? EQUAL : - (xc2.is_directed_right()) ? - ((os == ON_NEGATIVE_SIDE) ? SMALLER : LARGER) : - ((os == ON_NEGATIVE_SIDE) ? LARGER : SMALLER); + if (res == LARGER) { + // use l1 and xc2: + Oriented_side os = m_traits.oriented_side(xc2.normal(), l1); + return (os == ON_ORIENTED_BOUNDARY) ? EQUAL : + (xc2.is_directed_right()) ? + ((os == ON_NEGATIVE_SIDE) ? SMALLER : LARGER) : + ((os == ON_NEGATIVE_SIDE) ? LARGER : SMALLER); + } + // res == equal + return EQUAL; } }; @@ -1283,8 +1313,8 @@ public: const X_monotone_curve_2& xc2, const Point_2& p) const { - CGAL_precondition(!xc1.is_degenerate()); - CGAL_precondition(!xc2.is_degenerate()); + CGAL_precondition(! xc1.is_degenerate()); + CGAL_precondition(! xc2.is_degenerate()); // CGAL_precondition(p == xc1.left()); // CGAL_precondition(p == xc2.left()); @@ -1296,10 +1326,35 @@ public: // Non of the arcs is verticel. Thus, non of the endpoints coincide with // a pole. - // Compare the y-coord. at the x-coord of the most left right-endpoint. const Point_2& r1 = xc1.right(); const Point_2& r2 = xc2.right(); - if (!r1.is_no_boundary()) { + + // if p and r1 are antipodal, compare the plane normals + const Kernel& kernel = m_traits; + auto opposite_3 = kernel.construct_opposite_direction_3_object(); + Direction_3 opposite_p = opposite_3(p); + if (kernel.equal_3_object()(opposite_p, Direction_3(r1)) || + kernel.equal_3_object()(opposite_p, Direction_3(r2))) + { + Sign xsign = Traits::x_sign(p); + Sign ysign = Traits::y_sign(p); + Project project = (xsign == ZERO) ? + ((ysign == POSITIVE) ? Traits::project_minus_xz : Traits::project_xz) : + ((xsign == POSITIVE) ? Traits::project_yz : Traits::project_minus_yz); + + Direction_2 n1 = project(xc1.normal()); + Direction_2 n2 = project(xc2.normal()); + auto opposite_2 = kernel.construct_opposite_direction_2_object(); + if (! xc1.is_directed_right()) n1 = opposite_2(n1); + if (! xc2.is_directed_right()) n2 = opposite_2(n2); + if (kernel.equal_2_object()(n1, n2)) return EQUAL; + const Direction_2 d(1, 0); + return (kernel.counterclockwise_in_between_2_object()(n1, d, n2)) ? + SMALLER : LARGER; + } + + // Compare the y-coord. at the x-coord of the most left right-endpoint. + if (! r1.is_no_boundary()) { // use r2 and xc1: Oriented_side os = m_traits.oriented_side(xc1.normal(), r2); return (os == ON_ORIENTED_BOUNDARY) ? EQUAL : @@ -1307,7 +1362,7 @@ public: ((os == ON_NEGATIVE_SIDE) ? LARGER : SMALLER) : ((os == ON_NEGATIVE_SIDE) ? SMALLER : LARGER); } - if (!r2.is_no_boundary()) { + if (! r2.is_no_boundary()) { // use r1 and xc2: Oriented_side os = m_traits.oriented_side(xc2.normal(), r1); return (os == ON_ORIENTED_BOUNDARY) ? EQUAL : @@ -1333,32 +1388,7 @@ public: ((os == ON_NEGATIVE_SIDE) ? LARGER : SMALLER); } // res == equal - // if p and r1 are antipodal, compare the plane normals - const Kernel& kernel = m_traits; - typename Kernel::Construct_opposite_direction_3 opposite_3 = - kernel.construct_opposite_direction_3_object(); - // VC 10 does not like the following: - // if (!kernel.equal_3_object()(opposite_3(p), r1)) return EQUAL; - Direction_3 tmp1 = opposite_3(p); // pacify msvc 10 - if (!kernel.equal_3_object()(tmp1, Direction_3(r1))) - return EQUAL; - - Sign xsign = Traits::x_sign(p); - Sign ysign = Traits::y_sign(p); - Project project = (xsign == ZERO) ? - ((ysign == POSITIVE) ? Traits::project_minus_xz : Traits::project_xz) : - ((xsign == POSITIVE) ? Traits::project_yz : Traits::project_minus_yz); - - Direction_2 n1 = project(xc1.normal()); - Direction_2 n2 = project(xc2.normal()); - typename Kernel::Construct_opposite_direction_2 opposite_2 = - kernel.construct_opposite_direction_2_object(); - if (!xc1.is_directed_right()) n1 = opposite_2(n1); - if (!xc2.is_directed_right()) n2 = opposite_2(n2); - if (kernel.equal_2_object()(n1, n2)) return EQUAL; - const Direction_2 d(1, 0); - return (kernel.counterclockwise_in_between_2_object()(n1, d, n2)) ? - SMALLER : LARGER; + return EQUAL; } }; @@ -1397,8 +1427,7 @@ public: typename Kernel::Equal_3 equal_3 = kernel.equal_3_object(); if (xc1.is_full() || xc2.is_full()) { if (!xc1.is_full() || !xc2.is_full()) return false; - typename Kernel::Construct_opposite_direction_3 opposite_3 = - kernel.construct_opposite_direction_3_object(); + auto opposite_3 = kernel.construct_opposite_direction_3_object(); return (equal_3(xc1.normal(), xc2.normal()) || equal_3(opposite_3(xc1.normal()), xc2.normal())); } @@ -1764,113 +1793,118 @@ public: * \param ce the arc end indicator. * \return the second comparison result. * \pre the ce ends of the arcs xcv1 and xcv2 lie either on the left - * boundary or on the right boundary of the parameter space (implying - * that they cannot be vertical). + * boundary or on the right boundary of the parameter space. + * \pre the curves cannot reach a pole * There is no horizontal identification curve! */ Comparison_result operator()(const X_monotone_curve_2& xcv1, const X_monotone_curve_2& xcv2, Arr_curve_end ce) const { - CGAL_precondition(!xcv1.is_degenerate()); - CGAL_precondition(!xcv2.is_degenerate()); + CGAL_precondition(! xcv1.is_degenerate()); + CGAL_precondition(! xcv2.is_degenerate()); + CGAL_precondition((ce != ARR_MIN_END) || + (xcv1.left().is_mid_boundary() && + xcv2.left().is_mid_boundary())); + CGAL_precondition((ce != ARR_MAX_END) || + (xcv1.right().is_mid_boundary() && + xcv2.right().is_mid_boundary())); + + // If the curves lie on the same plane return EQUAL. + const Kernel& kernel = m_traits; + const Direction_3& n1 = xcv1.normal(); + const Direction_3& n2 = xcv2.normal(); + if (xcv1.is_directed_right() == xcv2.is_directed_right()) { + if (kernel.equal_3_object()(n1, n2)) return EQUAL; + } + else { + auto opposite_3 = kernel.construct_opposite_direction_3_object(); + auto opposite_n2 = opposite_3(n2); + if (kernel.equal_3_object()(n1, opposite_n2)) return EQUAL; + } + + // The curves do not lie on the same plane! const Point_2& l1 = xcv1.left(); - const Point_2& r1 = xcv1.right(); const Point_2& l2 = xcv2.left(); + const Point_2& r1 = xcv1.right(); const Point_2& r2 = xcv2.right(); - // If xcv1 is vertical, xcv1 coincides with the discontinuity arc: - if (xcv1.is_vertical()) { - CGAL_precondition(!l1.is_no_boundary()); - CGAL_precondition(!r1.is_no_boundary()); - } - - // If xcv2 is vertical, xcv2 coincides with the discontinuity arc: - if (xcv2.is_vertical()) { - CGAL_precondition(!l2.is_no_boundary()); - CGAL_precondition(!r2.is_no_boundary()); - } - if (ce == ARR_MIN_END) { - // Handle the south pole. It has the smallest y coords: - if (l1.is_min_boundary()) - return (l2.is_min_boundary()) ? EQUAL : SMALLER; - if (l2.is_min_boundary()) return LARGER; - // None of xcv1 and xcv2 endpoints coincide with a pole: Comparison_result cr = m_traits.compare_y(l1, l2); if (cr != EQUAL) return cr; // If Both arcs are vertical, they overlap: - if (xcv1.is_vertical() && xcv2.is_vertical()) return EQUAL; if (xcv1.is_vertical()) return LARGER; if (xcv2.is_vertical()) return SMALLER; - // Non of the arcs is verticel. Thus, non of the endpoints coincide - // with a pole. - // Compare the y-coord. at the x-coord of the most left right-endpoint. - CGAL_assertion(r1.is_no_boundary()); - CGAL_assertion(r2.is_no_boundary()); + // There are 4 cases based on the sign of the z component of the normals + // Compute the sign of the x-component of the normal cross product. + // There is no point computing the intermediate cross product: + // auto cross_prod = kernel.construct_cross_product_vector_3_object(); + // Vector_3 v = cross_prod(n1.vector(), n2.vector()); + // CGAL::Sign xsign = CGAL::sign(v.x()); + // This predicate is not yet supported; thus, compute directly: + CGAL::Sign xsign = CGAL::sign(n1.dy() * n2.dz() - n1.dz() * n2.dy()); - if (m_traits.compare_xy(r1, r2) == LARGER) { - // use r2 and xcv1: - Oriented_side os = - m_traits.oriented_side(xcv1.normal(), r2); - return (os == ON_ORIENTED_BOUNDARY) ? EQUAL : - (xcv1.is_directed_right()) ? - ((os == ON_NEGATIVE_SIDE) ? LARGER : SMALLER) : - ((os == ON_NEGATIVE_SIDE) ? SMALLER : LARGER); + // std::cout << "sign(n1.z): " << CGAL::sign(n1.dz()) << std::endl; + // std::cout << "sign(n2.z): " << CGAL::sign(n2.dz()) << std::endl; + // std::cout << "x sign: " << xsign << std::endl; + + if (CGAL::sign(n1.dz()) == POSITIVE) { + if (CGAL::sign(n2.dz()) == POSITIVE) { + // pos pos + return (xsign == POSITIVE) ? LARGER : SMALLER; + } + // pos neg + return (xsign == POSITIVE) ? SMALLER : LARGER; } - // use r1 and xcv2: - Oriented_side os = m_traits.oriented_side(xcv2.normal(), r1); - return (os == ON_ORIENTED_BOUNDARY) ? EQUAL : - (xcv2.is_directed_right()) ? - ((os == ON_NEGATIVE_SIDE) ? SMALLER : LARGER) : - ((os == ON_NEGATIVE_SIDE) ? LARGER : SMALLER); + if (CGAL::sign(n2.dz()) == POSITIVE) { + // neg pos + return (xsign == POSITIVE) ? SMALLER : LARGER; + } + // neg neg + return (xsign == POSITIVE) ? LARGER : SMALLER; } // ce == ARR_MAX_END - // Handle the north pole. It has the largest y coords: - if (r1.is_max_boundary()) return (r2.is_max_boundary()) ? EQUAL : LARGER; - if (r2.is_max_boundary()) return SMALLER; - // None of xcv1 and xcv2 endpoints coincide with a pole: - Direction_2 r1_xy = Traits::project_xy(r1); Comparison_result cr = m_traits.compare_y(r1, r2); if (cr != EQUAL) return cr; // If Both arcs are vertical, they overlap: - if (xcv1.is_vertical() && xcv2.is_vertical()) return EQUAL; if (xcv1.is_vertical()) return LARGER; if (xcv2.is_vertical()) return SMALLER; - // Compare to the left: - Direction_2 p_r1 = Traits::project_xy(r1); - cr = m_traits.compare_y(r1, r2); - if (cr != EQUAL) return cr; + // There are 4 cases based on the sign of the z component of the normals + // Compute the sign of the x-component of the normal cross product. + // There is no point computing the intermediate cross product: + // auto cross_prod = kernel.construct_cross_product_vector_3_object(); + // Vector_3 v = cross_prod(n1.vector(), n2.vector()); + // CGAL::Sign xsign = CGAL::sign(v.x()); + // This predicate is not yet supported; thus, compute directly: + CGAL::Sign xsign = CGAL::sign(n1.dy() * n2.dz() - n1.dz() * n2.dy()); - // Non of the arcs is verticel. Thus, non of the endpoints coincide with - // a pole. - // Compare the y-coord. at the x-coord of the most right left-endpoint. - CGAL_assertion(l1.is_no_boundary()); - CGAL_assertion(l2.is_no_boundary()); + // std::cout << "sign(n1.z): " << CGAL::sign(n1.dz()) << std::endl; + // std::cout << "sign(n2.z): " << CGAL::sign(n2.dz()) << std::endl; + // std::cout << "x sign: " << xsign << std::endl; - if (m_traits.compare_xy(l1, l2) == SMALLER) { - // use l2 and xcv1: - Oriented_side os = m_traits.oriented_side(xcv1.normal(), l2); - return (os == ON_ORIENTED_BOUNDARY) ? EQUAL : - (xcv1.is_directed_right()) ? - ((os == ON_NEGATIVE_SIDE) ? LARGER : SMALLER) : - ((os == ON_NEGATIVE_SIDE) ? SMALLER : LARGER); + if (CGAL::sign(n1.dz()) == POSITIVE) { + if (CGAL::sign(n2.dz()) == POSITIVE) { + // pos pos + return (xsign == POSITIVE) ? SMALLER : LARGER; + } + // pos neg + return (xsign == POSITIVE) ? LARGER: SMALLER; } - // use l1 and xcv2: - Oriented_side os = m_traits.oriented_side(xcv2.normal(), l1); - return (os == ON_ORIENTED_BOUNDARY) ? EQUAL : - (xcv2.is_directed_right()) ? - ((os == ON_NEGATIVE_SIDE) ? SMALLER : LARGER) : - ((os == ON_NEGATIVE_SIDE) ? LARGER : SMALLER); + if (CGAL::sign(n2.dz()) == POSITIVE) { + // neg pos + return (xsign == POSITIVE) ? LARGER : SMALLER; + } + // neg neg + return (xsign == POSITIVE) ? SMALLER : LARGER; } }; @@ -2318,31 +2352,22 @@ public: if (equal(l1, r2)) { // 1. l1 = r2 < r1 < l2 < l1 | One intersection // 2. l1 = r2 < r1 = l2 < l1 | Two intersections - // 3. l1 = r2 < l2 < r1 < l1 | One intersection and one overlap + // 3. l1 = r2 < l2 < r1 < l1 | One overlap // 4. l1 = r2 < l2 < r1 = l1 | One overlap (handled above) + // 5. l1 = r2 < r1 < l2 = l1 | One overlap (handled above) if (in_between(r1, r2, l2)) { - // If the intersection point lies on the identification curve, this - // intersection point should be ignored (see below). However, it - // cannot occur. + // Case 1. *oi++ = Intersection_result(Intersection_point(l1_3, 1)); return oi; } if (equal(r1, l2)) { - // Case 2. This can happen only if one of the intersection points - // lies on the identification curve, and this points should be - // ignored. - if (! m_traits.is_on_y_identification_2_object()(l1_3)) { - *oi++ = Intersection_result(Intersection_point(l1_3, 1)); - return oi; - } - CGAL_assertion(! m_traits.is_on_y_identification_2_object()(l2_3)); + // Case 2. + *oi++ = Intersection_result(Intersection_point(l1_3, 1)); *oi++ = Intersection_result(Intersection_point(l2_3, 1)); return oi; } CGAL_assertion(in_between(r1, l2, r2)); - // Case 3. This can happen only the intersection point lies on the - // identification curve; in this case this point should be ignored. - CGAL_assertion(m_traits.is_on_y_identification_2_object()(l1_3)); + // Case 3. X_monotone_curve_2 xc(l2_3, r1_3, normal, vertical, true); *oi++ = Intersection_result(xc); return oi; @@ -2352,19 +2377,15 @@ public: if (equal(r1, l2)) { // 1. l1 < r1 = l2 < r2 < l1 | One intersection // 2. l1 < r1 = l2 < r2 = l1 | Two intersections (handled above) - // 3. l1 < r2 < r1 = l2 < l1 | One intersection and one overlap + // 3. l1 < r2 < r1 = l2 < l1 | One overlap // 4. l1 < r2 = r1 = l2 < l1 | One overlap (handled above) + // 5. l1 < l1 = r1 = l2 < r2 | One overlap (handled above) if (in_between(r2, r1, l1)) { - // If the intersection point lies on the identification curve, this - // intersection point should be ignored (see below). However, it - // cannot occur. + // Case 1. *oi++ = Intersection_result(Intersection_point(l2_3, 1)); return oi; } - // Case 3. This can happen only the intersection point lies on the - // identification curve; in this case this point should be ignored. - CGAL_assertion(in_between(r2, l1, r1)); - CGAL_assertion(m_traits.is_on_y_identification_2_object()(l2_3)); + // Case 3. X_monotone_curve_2 xc(l1_3, r2_3, normal, vertical, true); *oi++ = Intersection_result(xc); return oi; @@ -2552,10 +2573,8 @@ public: if (equal_3(normal1, normal2) || equal_3(opposite_normal1, normal2)) { // The underlying planes are the same - Counterclockwise_in_between_2 ccib = - kernel.counterclockwise_in_between_2_object(); - typename Traits::Clockwise_in_between_2 cib = - m_traits.clockwise_in_between_2_object(); + Counterclockwise_in_between_2 ccib = kernel.counterclockwise_in_between_2_object(); + auto cib = m_traits.clockwise_in_between_2_object(); if (xc1.is_vertical()) { // Both arcs are vertical @@ -2620,23 +2639,19 @@ public: normal, false, ccib, Traits::project_xy, oi); } - Vector_3 v = - kernel.construct_cross_product_vector_3_object()(xc1.normal().vector(), - xc2.normal().vector()); + auto cross_prod = kernel.construct_cross_product_vector_3_object(); + Vector_3 v = cross_prod(xc1.normal().vector(), xc2.normal().vector()); - // Determine which one of the two directions: + // Observe that xc1 and xc2 may share two endpoints. Point_2 ed = m_traits.construct_point_2_object()(v.direction()); - if (is_in_between(ed, xc1) && is_in_between(ed, xc2)) { + if (is_in_between(ed, xc1) && is_in_between(ed, xc2)) *oi++ = Intersection_result(Intersection_point(ed, 1)); - return oi; - } Vector_3 vo(kernel.construct_opposite_vector_3_object()(v)); Point_2 edo = m_traits.construct_point_2_object()(vo.direction()); - if (is_in_between(edo, xc1) && is_in_between(edo, xc2)) { + if (is_in_between(edo, xc1) && is_in_between(edo, xc2)) *oi++ = Intersection_result(Intersection_point(edo, 1)); - return oi; - } + return oi; } }; diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_tracing_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_tracing_traits_2.h index 52deb501c0a..7cd7374f513 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_tracing_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_tracing_traits_2.h @@ -535,12 +535,12 @@ public: size_t i = 0; for (auto it = container.begin(); it != container.end(); ++it) { - if (const auto* xcv = boost::get(*it)) { + if (const auto* xcv = boost::get(&*it)) { std::cout << " result[" << i++ << "]: xcv: " << *xcv << std::endl; continue; } - if (const Point_2* p = boost::get(*it)) { + if (const auto* p = boost::get(&*it)) { std::cout << " result[" << i++ << "]: p: " << *p << std::endl; continue; } diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/data/spherical_arcs/compare_y_at_x b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/data/spherical_arcs/compare_y_at_x index ce71a0ad570..cde8ac2efca 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/data/spherical_arcs/compare_y_at_x +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/data/spherical_arcs/compare_y_at_x @@ -55,3 +55,17 @@ compare_y_at_x_right 33 30 0 LARGER compare_y_at_x_right 32 31 0 LARGER compare_y_at_x_right 33 31 0 LARGER compare_y_at_x_right 35 31 0 LARGER +# +compare_y_at_x_right 36 37 3 LARGER +compare_y_at_x_right 37 36 3 SMALLER +compare_y_at_x_right 38 39 3 SMALLER +compare_y_at_x_right 39 38 3 LARGER +compare_y_at_x_right 36 39 3 EQUAL +compare_y_at_x_right 38 37 3 EQUAL +# +compare_y_at_x_left 40 41 3 LARGER +compare_y_at_x_left 41 40 3 SMALLER +compare_y_at_x_left 42 43 3 SMALLER +compare_y_at_x_left 43 42 3 LARGER +compare_y_at_x_left 40 43 3 EQUAL +compare_y_at_x_left 42 41 3 EQUAL diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/data/spherical_arcs/compare_y_at_x.pt b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/data/spherical_arcs/compare_y_at_x.pt index bd5dd1977ef..8b4855f1f55 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/data/spherical_arcs/compare_y_at_x.pt +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/data/spherical_arcs/compare_y_at_x.pt @@ -1,3 +1,4 @@ -0/1 -1/1 0/1 -1/1 0/1 0/1 -0/1 1/1 0/1 +0 -1 0 +1 0 0 +0 1 0 +-1 0 0 diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/data/spherical_arcs/compare_y_at_x.xcv b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/data/spherical_arcs/compare_y_at_x.xcv index a0271e089ca..f78ce5b85c5 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/data/spherical_arcs/compare_y_at_x.xcv +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/data/spherical_arcs/compare_y_at_x.xcv @@ -36,3 +36,13 @@ 0 1 -1 1 0 -1 0 0 0 0 1 0 -1 0 0 0 -1 1 0 -1 0 +# +1 -1 0 0 1 0 0 0 1 1 +1 -1 0 0 1 0 0 0 -1 1 +1 1 0 0 -1 0 0 0 1 -1 +1 1 0 0 -1 0 0 0 -1 -1 +# +1 -1 0 0 1 0 0 0 1 -1 +1 -1 0 0 1 0 0 0 -1 -1 +1 1 0 0 -1 0 0 0 1 1 +1 1 0 0 -1 0 0 0 -1 1 diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/data/spherical_arcs/compare_y_near_boundary b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/data/spherical_arcs/compare_y_near_boundary index c7ad2f10f08..70623ccb1c1 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/data/spherical_arcs/compare_y_near_boundary +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/data/spherical_arcs/compare_y_near_boundary @@ -1,78 +1,5 @@ -compare_y_near_boundary 0 1 MIN_END EQUAL -compare_y_near_boundary 0 2 MIN_END EQUAL -compare_y_near_boundary 0 3 MIN_END EQUAL -compare_y_near_boundary 0 4 MIN_END EQUAL -compare_y_near_boundary 0 5 MIN_END EQUAL -compare_y_near_boundary 0 6 MIN_END EQUAL -compare_y_near_boundary 0 7 MIN_END EQUAL -compare_y_near_boundary 0 8 MIN_END EQUAL -compare_y_near_boundary 0 9 MIN_END EQUAL -compare_y_near_boundary 0 10 MIN_END EQUAL -compare_y_near_boundary 0 11 MIN_END EQUAL -compare_y_near_boundary 0 14 MIN_END EQUAL -compare_y_near_boundary 0 15 MIN_END EQUAL -compare_y_near_boundary 0 16 MIN_END EQUAL -compare_y_near_boundary 0 17 MIN_END EQUAL -compare_y_near_boundary 0 18 MIN_END EQUAL -compare_y_near_boundary 0 19 MIN_END EQUAL -compare_y_near_boundary 0 20 MIN_END EQUAL -compare_y_near_boundary 0 21 MIN_END EQUAL -compare_y_near_boundary 0 22 MIN_END EQUAL -compare_y_near_boundary 0 23 MIN_END EQUAL -compare_y_near_boundary 0 24 MIN_END EQUAL -compare_y_near_boundary 0 25 MIN_END EQUAL -compare_y_near_boundary 0 26 MIN_END EQUAL -compare_y_near_boundary 0 27 MIN_END EQUAL -compare_y_near_boundary 0 28 MIN_END EQUAL -compare_y_near_boundary 0 29 MIN_END EQUAL -compare_y_near_boundary 0 30 MIN_END EQUAL -compare_y_near_boundary 0 31 MIN_END EQUAL -compare_y_near_boundary 0 48 MIN_END SMALLER -compare_y_near_boundary 0 49 MIN_END SMALLER -compare_y_near_boundary 0 50 MIN_END SMALLER -compare_y_near_boundary 0 51 MIN_END SMALLER -compare_y_near_boundary 0 52 MIN_END LARGER -compare_y_near_boundary 0 53 MIN_END LARGER -compare_y_near_boundary 0 54 MIN_END LARGER -compare_y_near_boundary 0 55 MIN_END LARGER -compare_y_near_boundary 0 56 MIN_END SMALLER -compare_y_near_boundary 0 57 MIN_END SMALLER -compare_y_near_boundary 0 58 MIN_END SMALLER -compare_y_near_boundary 0 59 MIN_END SMALLER -compare_y_near_boundary 0 60 MIN_END LARGER -compare_y_near_boundary 0 61 MIN_END LARGER -compare_y_near_boundary 0 62 MIN_END LARGER -compare_y_near_boundary 0 63 MIN_END LARGER# -compare_y_near_boundary 0 0 MIN_END EQUAL -compare_y_near_boundary 1 1 MIN_END EQUAL -compare_y_near_boundary 2 2 MIN_END EQUAL -compare_y_near_boundary 3 3 MIN_END EQUAL -compare_y_near_boundary 4 4 MIN_END EQUAL -compare_y_near_boundary 5 5 MIN_END EQUAL -compare_y_near_boundary 6 6 MIN_END EQUAL -compare_y_near_boundary 7 7 MIN_END EQUAL compare_y_near_boundary 8 8 MIN_END EQUAL compare_y_near_boundary 9 9 MIN_END EQUAL -compare_y_near_boundary 10 10 MIN_END EQUAL -compare_y_near_boundary 11 11 MIN_END EQUAL -compare_y_near_boundary 14 14 MIN_END EQUAL -compare_y_near_boundary 15 15 MIN_END EQUAL -compare_y_near_boundary 16 16 MIN_END EQUAL -compare_y_near_boundary 17 17 MIN_END EQUAL -compare_y_near_boundary 18 18 MIN_END EQUAL -compare_y_near_boundary 19 19 MIN_END EQUAL -compare_y_near_boundary 20 20 MIN_END EQUAL -compare_y_near_boundary 21 21 MIN_END EQUAL -compare_y_near_boundary 22 22 MIN_END EQUAL -compare_y_near_boundary 23 23 MIN_END EQUAL -compare_y_near_boundary 24 24 MIN_END EQUAL -compare_y_near_boundary 25 25 MIN_END EQUAL -compare_y_near_boundary 26 26 MIN_END EQUAL -compare_y_near_boundary 27 27 MIN_END EQUAL -compare_y_near_boundary 28 28 MIN_END EQUAL -compare_y_near_boundary 29 29 MIN_END EQUAL -compare_y_near_boundary 30 30 MIN_END EQUAL -compare_y_near_boundary 31 31 MIN_END EQUAL compare_y_near_boundary 48 48 MIN_END EQUAL compare_y_near_boundary 49 49 MIN_END EQUAL compare_y_near_boundary 50 50 MIN_END EQUAL @@ -85,42 +12,11 @@ compare_y_near_boundary 56 56 MIN_END EQUAL compare_y_near_boundary 57 57 MIN_END EQUAL compare_y_near_boundary 58 58 MIN_END EQUAL compare_y_near_boundary 59 59 MIN_END EQUAL -compare_y_near_boundary 60 60 MIN_END EQUAL -compare_y_near_boundary 61 61 MIN_END EQUAL compare_y_near_boundary 62 62 MIN_END EQUAL -compare_y_near_boundary 63 63 MIN_END EQUAL# -compare_y_near_boundary 0 0 MAX_END EQUAL -compare_y_near_boundary 1 1 MAX_END EQUAL -compare_y_near_boundary 2 2 MAX_END EQUAL -compare_y_near_boundary 3 3 MAX_END EQUAL -compare_y_near_boundary 4 4 MAX_END EQUAL -compare_y_near_boundary 5 5 MAX_END EQUAL -compare_y_near_boundary 6 6 MAX_END EQUAL -compare_y_near_boundary 7 7 MAX_END EQUAL -compare_y_near_boundary 10 10 MAX_END EQUAL -compare_y_near_boundary 11 11 MAX_END EQUAL +compare_y_near_boundary 63 63 MIN_END EQUAL +# compare_y_near_boundary 12 12 MAX_END EQUAL compare_y_near_boundary 13 13 MAX_END EQUAL -compare_y_near_boundary 14 14 MAX_END EQUAL -compare_y_near_boundary 15 15 MAX_END EQUAL -compare_y_near_boundary 16 16 MAX_END EQUAL -compare_y_near_boundary 17 17 MAX_END EQUAL -compare_y_near_boundary 18 18 MAX_END EQUAL -compare_y_near_boundary 19 19 MAX_END EQUAL -compare_y_near_boundary 20 20 MAX_END EQUAL -compare_y_near_boundary 21 21 MAX_END EQUAL -compare_y_near_boundary 22 22 MAX_END EQUAL -compare_y_near_boundary 23 23 MAX_END EQUAL -compare_y_near_boundary 24 24 MAX_END EQUAL -compare_y_near_boundary 25 25 MAX_END EQUAL -compare_y_near_boundary 26 26 MAX_END EQUAL -compare_y_near_boundary 27 27 MAX_END EQUAL -compare_y_near_boundary 28 28 MAX_END EQUAL -compare_y_near_boundary 29 29 MAX_END EQUAL -compare_y_near_boundary 30 30 MAX_END EQUAL -compare_y_near_boundary 31 31 MAX_END EQUAL -compare_y_near_boundary 48 48 MAX_END EQUAL -compare_y_near_boundary 49 49 MAX_END EQUAL compare_y_near_boundary 50 50 MAX_END EQUAL compare_y_near_boundary 51 51 MAX_END EQUAL compare_y_near_boundary 52 52 MAX_END EQUAL @@ -135,3 +31,23 @@ compare_y_near_boundary 60 60 MAX_END EQUAL compare_y_near_boundary 61 61 MAX_END EQUAL compare_y_near_boundary 62 62 MAX_END EQUAL compare_y_near_boundary 63 63 MAX_END EQUAL +# +compare_y_near_boundary 96 102 MIN_END EQUAL +compare_y_near_boundary 97 103 MIN_END EQUAL +compare_y_near_boundary 98 100 MAX_END EQUAL +compare_y_near_boundary 99 101 MAX_END EQUAL +# +compare_y_near_boundary 96 97 MIN_END LARGER +compare_y_near_boundary 97 96 MIN_END SMALLER +compare_y_near_boundary 98 99 MAX_END SMALLER +compare_y_near_boundary 99 98 MAX_END LARGER +# +compare_y_near_boundary 100 101 MAX_END SMALLER +compare_y_near_boundary 101 100 MAX_END LARGER +compare_y_near_boundary 102 103 MIN_END LARGER +compare_y_near_boundary 103 102 MIN_END SMALLER +# +compare_y_near_boundary 104 105 MIN_END LARGER +compare_y_near_boundary 105 104 MIN_END SMALLER +compare_y_near_boundary 106 107 MAX_END LARGER +compare_y_near_boundary 107 106 MAX_END SMALLER diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/data/spherical_arcs/intersect b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/data/spherical_arcs/intersect index 1b200da79cf..d53f243555f 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/data/spherical_arcs/intersect +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/data/spherical_arcs/intersect @@ -287,4 +287,23 @@ intersect 86 85 1 0 21 1 intersect 89 90 1 0 22 1 intersect 90 89 1 0 22 1 intersect 93 94 1 0 23 1 -intersect 94 93 1 0 23 1 \ No newline at end of file +intersect 94 93 1 0 23 1 +# +intersect 96 96 1 1 96 +intersect 97 97 1 1 97 +intersect 98 98 1 1 98 +intersect 99 99 1 1 99 +# +intersect 96 97 2 0 24 1 0 25 1 +intersect 96 98 2 0 25 1 0 24 1 +intersect 96 99 2 0 24 1 0 25 1 +intersect 97 98 2 0 25 1 0 24 1 +intersect 97 99 2 0 25 1 0 24 1 +intersect 98 99 2 0 24 1 0 25 1 +# +intersect 97 96 2 0 25 1 0 24 1 +intersect 98 96 2 0 24 1 0 25 1 +intersect 99 96 2 0 25 1 0 24 1 +intersect 98 97 2 0 24 1 0 25 1 +intersect 99 97 2 0 24 1 0 25 1 +intersect 99 98 2 0 25 1 0 24 1 diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/data/spherical_arcs/points b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/data/spherical_arcs/points index 4173fe1341a..199f4d135d5 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/data/spherical_arcs/points +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/data/spherical_arcs/points @@ -1,26 +1,29 @@ -1/4 -3/4 0/1 --1/4 -3/4 0/1 --3/4 -1/4 0/1 --3/4 1/4 0/1 -1/4 3/4 0/1 --1/4 3/4 0/1 -3/4 -1/4 0/1 -3/4 1/4 0/1 +1/4 -3/4 0 +-1/4 -3/4 0 +-3/4 -1/4 0 +-3/4 1/4 0 +1/4 3/4 0 +-1/4 3/4 0 +3/4 -1/4 0 +3/4 1/4 0 ############## -1/4 0/1 -3/4 -3/4 0/1 -1/4 -3/4 0/1 1/4 -1/4 0/1 3/4 --1/4 0/1 3/4 --3/4 0/1 -1/4 --3/4 0/1 1/4 --1/4 0/1 -3/4 +1/4 0 -3/4 +3/4 0 -1/4 +3/4 0 1/4 +1/4 0 3/4 +-1/4 0 3/4 +-3/4 0 -1/4 +-3/4 0 1/4 +-1/4 0 -3/4 ############## -0/1 1/4 -3/4 -0/1 3/4 -1/4 -0/1 3/4 1/4 -0/1 1/4 3/4 -0/1 -1/4 3/4 -0/1 -3/4 -1/4 -0/1 -3/4 1/4 -0/1 -1/4 -3/4 +0 1/4 -3/4 +0 3/4 -1/4 +0 3/4 1/4 +0 1/4 3/4 +0 -1/4 3/4 +0 -3/4 -1/4 +0 -3/4 1/4 +0 -1/4 -3/4 +# +1 0 0 +-1 0 0 diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/data/spherical_arcs/xcurves b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/data/spherical_arcs/xcurves index 6309229ab89..12886bf512e 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/data/spherical_arcs/xcurves +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/data/spherical_arcs/xcurves @@ -1,99 +1,114 @@ # xy plane -0 0/1 -1/1 0/1 1/2 -1/2 0/1 -0 0/1 -1/1 0/1 1/4 -3/4 0/1 -0 1/4 -3/4 0/1 1/2 -1/2 0/1 -0 1/8 -7/8 0/1 3/8 -5/8 0/1 -0 0/1 -1/1 0/1 -1/2 -1/2 0/1 -0 0/1 -1/1 0/1 -1/4 -3/4 0/1 -0 -1/4 -3/4 0/1 -1/2 -1/2 0/1 -0 -1/8 -7/8 0/1 -3/8 -5/8 0/1 -0 -1/1 0/1 0/1 -1/2 -1/2 0/1 -0 -1/1 0/1 0/1 -3/4 -1/4 0/1 -0 -3/4 -1/4 0/1 -1/2 -1/2 0/1 -0 -7/8 -1/8 0/1 -5/8 -3/8 0/1 -0 -1/1 0/1 0/1 -1/2 1/2 0/1 -0 -1/1 0/1 0/1 -3/4 1/4 0/1 -0 -3/4 1/4 0/1 -1/2 1/2 0/1 -0 -7/8 1/8 0/1 -5/8 3/8 0/1 -0 0/1 1/1 0/1 1/2 1/2 0/1 -0 0/1 1/1 0/1 1/4 3/4 0/1 -0 1/4 3/4 0/1 1/2 1/2 0/1 -0 1/8 7/8 0/1 3/8 5/8 0/1 -0 0/1 1/1 0/1 -1/2 1/2 0/1 -0 0/1 1/1 0/1 -1/4 3/4 0/1 -0 -1/4 3/4 0/1 -1/2 1/2 0/1 -0 -1/8 7/8 0/1 -3/8 5/8 0/1 -0 1/1 0/1 0/1 1/2 -1/2 0/1 -0 1/1 0/1 0/1 3/4 -1/4 0/1 -0 3/4 -1/4 0/1 1/2 -1/2 0/1 -0 7/8 -1/8 0/1 5/8 -3/8 0/1 -0 1/1 0/1 0/1 1/2 1/2 0/1 -0 1/1 0/1 0/1 3/4 1/4 0/1 -0 3/4 1/4 0/1 1/2 1/2 0/1 -0 7/8 1/8 0/1 5/8 3/8 0/1 +0 0 -1 0 1/2 -1/2 0 +0 0 -1 0 1/4 -3/4 0 +0 1/4 -3/4 0 1/2 -1/2 0 +0 1/8 -7/8 0 3/8 -5/8 0 +0 0 -1 0 -1/2 -1/2 0 +0 0 -1 0 -1/4 -3/4 0 +0 -1/4 -3/4 0 -1/2 -1/2 0 +0 -1/8 -7/8 0 -3/8 -5/8 0 +0 -1 0 0 -1 -1 0 +0 -1 0 0 -3 -1 0 +0 -3/4 -1/4 0 -1/2 -1/2 0 +0 -7/8 -1/8 0 -5/8 -3/8 0 +0 -1 0 0 -1 1 0 +0 -1 0 0 -3 1 0 +0 -3/4 1/4 0 -1/2 1/2 0 +0 -7/8 1/8 0 -5/8 3/8 0 +0 0 1 0 1/2 1/2 0 +0 0 1 0 1/4 3/4 0 +0 1/4 3/4 0 1/2 1/2 0 +0 1/8 7/8 0 3/8 5/8 0 +0 0 1 0 -1/2 1/2 0 +0 0 1 0 -1/4 3/4 0 +0 -1/4 3/4 0 -1/2 1/2 0 +0 -1/8 7/8 0 -3/8 5/8 0 +0 1 0 0 1/2 -1/2 0 +0 1 0 0 3/4 -1/4 0 +0 3/4 -1/4 0 1/2 -1/2 0 +0 7/8 -1/8 0 5/8 -3/8 0 +0 1 0 0 1/2 1/2 0 +0 1 0 0 3/4 1/4 0 +0 3/4 1/4 0 1/2 1/2 0 +0 7/8 1/8 0 5/8 3/8 0 # xz plane -0 0/1 0/1 -1/1 1/2 0/1 -1/2 -0 0/1 0/1 -1/1 1/4 0/1 -3/4 -0 1/4 0/1 -3/4 1/2 0/1 -1/2 -0 1/8 0/1 -7/8 3/8 0/1 -5/8 -0 1/1 0/1 0/1 1/2 0/1 -1/2 -0 1/1 0/1 0/1 3/4 0/1 -1/4 -0 3/4 0/1 -1/4 1/2 0/1 -1/2 -0 5/8 0/1 -1/8 7/8 0/1 -3/8 -0 1/1 0/1 0/1 1/2 0/1 1/2 -0 1/1 0/1 0/1 3/4 0/1 1/4 -0 3/4 0/1 1/4 1/2 0/1 1/2 -0 5/8 0/1 1/8 7/8 0/1 3/8 -0 0/1 0/1 1/1 1/2 0/1 1/2 -0 0/1 0/1 1/1 1/4 0/1 3/4 -0 1/4 0/1 3/4 1/2 0/1 1/2 -0 1/8 0/1 7/8 3/8 0/1 5/8 -0 0/1 0/1 1/1 -1/2 0/1 1/2 -0 0/1 0/1 1/1 -1/4 0/1 3/4 -0 -1/4 0/1 3/4 -1/2 0/1 1/2 -0 -1/8 0/1 7/8 -3/8 0/1 5/8 -0 -1/1 0/1 0/1 -1/2 0/1 -1/2 -0 -1/1 0/1 0/1 -3/4 0/1 -1/4 -0 -3/4 0/1 -1/4 -1/2 0/1 -1/2 -0 -5/8 0/1 -1/8 -7/8 0/1 -3/8 -0 -1/1 0/1 0/1 -1/2 0/1 1/2 -0 -1/1 0/1 0/1 -3/4 0/1 1/4 -0 -3/4 0/1 1/4 -1/2 0/1 1/2 -0 -5/8 0/1 1/8 -7/8 0/1 3/8 -0 0/1 0/1 -1/1 -1/2 0/1 -1/2 -0 0/1 0/1 -1/1 -1/4 0/1 -3/4 -0 -1/4 0/1 -3/4 -1/2 0/1 -1/2 -0 -1/8 0/1 -7/8 -1/8 0/1 -5/8 +0 0 0 -1 1/2 0 -1/2 +0 0 0 -1 1/4 0 -3/4 +0 1/4 0 -3/4 1/2 0 -1/2 +0 1/8 0 -7/8 3/8 0 -5/8 +0 1 0 0 1/2 0 -1/2 +0 1 0 0 3/4 0 -1/4 +0 3/4 0 -1/4 1/2 0 -1/2 +0 5/8 0 -1/8 7/8 0 -3/8 +0 1 0 0 1/2 0 1/2 +0 1 0 0 3/4 0 1/4 +0 3/4 0 1/4 1/2 0 1/2 +0 5/8 0 1/8 7/8 0 3/8 +0 0 0 1 1/2 0 1/2 +0 0 0 1 1/4 0 3/4 +0 1/4 0 3/4 1/2 0 1/2 +0 1/8 0 7/8 3/8 0 5/8 +0 0 0 1 -1/2 0 1/2 +0 0 0 1 -1/4 0 3/4 +0 -1/4 0 3/4 -1/2 0 1/2 +0 -1/8 0 7/8 -3/8 0 5/8 +0 -1 0 0 -1 0 -1 +0 -1 0 0 -3 0 -1 +0 -3/4 0 -1/4 -1/2 0 -1/2 +0 -5/8 0 -1/8 -7/8 0 -3/8 +0 -1 0 0 -1 0 1 +0 -1 0 0 -3 0 1 +0 -3/4 0 1/4 -1/2 0 1/2 +0 -5/8 0 1/8 -7/8 0 3/8 +0 0 0 -1 -1/2 0 -1/2 +0 0 0 -1 -1/4 0 -3/4 +0 -1/4 0 -3/4 -1/2 0 -1/2 +0 -1/8 0 -7/8 -1/8 0 -5/8 # yz plane -0 0/1 0/1 -1/1 0/1 1/2 -1/2 -0 0/1 0/1 -1/1 0/1 1/4 -3/4 -0 0/1 1/4 -3/4 0/1 1/2 -1/2 -0 0/1 1/8 -7/8 0/1 3/8 -5/8 -0 0/1 1/1 0/1 0/1 1/2 -1/2 -0 0/1 1/1 0/1 0/1 3/4 -1/4 -0 0/1 3/4 -1/4 0/1 1/2 -1/2 -0 0/1 5/8 -1/8 0/1 7/8 -3/8 -0 0/1 1/1 0/1 0/1 1/2 1/2 -0 0/1 1/1 0/1 0/1 3/4 1/4 -0 0/1 3/4 1/4 0/1 1/2 1/2 -0 0/1 5/8 1/8 0/1 7/8 3/8 -0 0/1 0/1 1/1 0/1 1/2 1/2 -0 0/1 0/1 1/1 0/1 1/4 3/4 -0 0/1 1/4 3/4 0/1 1/2 1/2 -0 0/1 1/8 7/8 0/1 3/8 5/8 -0 0/1 0/1 1/1 0/1 -1/2 1/2 -0 0/1 0/1 1/1 0/1 -1/4 3/4 -0 0/1 -1/4 3/4 0/1 -1/2 1/2 -0 0/1 -1/8 7/8 0/1 -3/8 5/8 -0 0/1 -1/1 0/1 0/1 -1/2 -1/2 -0 0/1 -1/1 0/1 0/1 -3/4 -1/4 -0 0/1 -3/4 -1/4 0/1 -1/2 -1/2 -0 0/1 -5/8 -1/8 0/1 -7/8 -3/8 -0 0/1 -1/1 0/1 0/1 -1/2 1/2 -0 0/1 -1/1 0/1 0/1 -3/4 1/4 -0 0/1 -3/4 1/4 0/1 -1/2 1/2 -0 0/1 -5/8 1/8 0/1 -7/8 3/8 -0 0/1 0/1 -1/1 0/1 -1/2 -1/2 -0 0/1 0/1 -1/1 0/1 -1/4 -3/4 -0 0/1 -1/4 -3/4 0/1 -1/2 -1/2 -0 0/1 -1/8 -7/8 0/1 -1/8 -5/8 +0 0 0 -1 0 1/2 -1/2 +0 0 0 -1 0 1/4 -3/4 +0 0 1/4 -3/4 0 1/2 -1/2 +0 0 1/8 -7/8 0 3/8 -5/8 +0 0 1 0 0 1/2 -1/2 +0 0 1 0 0 3/4 -1/4 +0 0 3/4 -1/4 0 1/2 -1/2 +0 0 5/8 -1/8 0 7/8 -3/8 +0 0 1 0 0 1/2 1/2 +0 0 1 0 0 3/4 1/4 +0 0 3/4 1/4 0 1/2 1/2 +0 0 5/8 1/8 0 7/8 3/8 +0 0 0 1 0 1/2 1/2 +0 0 0 1 0 1/4 3/4 +0 0 1/4 3/4 0 1/2 1/2 +0 0 1/8 7/8 0 3/8 5/8 +0 0 0 1 0 -1/2 1/2 +0 0 0 1 0 -1/4 3/4 +0 0 -1/4 3/4 0 -1/2 1/2 +0 0 -1/8 7/8 0 -3/8 5/8 +0 0 -1 0 0 -1/2 -1/2 +0 0 -1 0 0 -3/4 -1/4 +0 0 -3/4 -1/4 0 -1/2 -1/2 +0 0 -5/8 -1/8 0 -7/8 -3/8 +0 0 -1 0 0 -1/2 1/2 +0 0 -1 0 0 -3/4 1/4 +0 0 -3/4 1/4 0 -1/2 1/2 +0 0 -5/8 1/8 0 -7/8 3/8 +0 0 0 -1 0 -1/2 -1/2 +0 0 0 -1 0 -1/4 -3/4 +0 0 -1/4 -3/4 0 -1/2 -1/2 +0 0 -1/8 -7/8 0 -1/8 -5/8 +# +1 -1 0 0 1 0 0 0 1 1 +1 -1 0 0 1 0 0 0 -1 1 +1 1 0 0 -1 0 0 0 1 1 +1 1 0 0 -1 0 0 0 -1 1 +# +1 -1 0 0 1 0 0 0 -1 -1 +1 -1 0 0 1 0 0 0 1 -1 +1 1 0 0 -1 0 0 0 -1 -1 +1 1 0 0 -1 0 0 0 1 -1 +# +0 -1 0 0 0 -1 1 +0 -1 0 0 0 -1 -1 +0 -1 0 0 0 1 1 +0 -1 0 0 0 1 -1 diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/data/test_construction/geodesic_arcs_on_sphere/test39.txt b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/data/test_construction/geodesic_arcs_on_sphere/test39.txt new file mode 100644 index 00000000000..ac38fac01c7 --- /dev/null +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/data/test_construction/geodesic_arcs_on_sphere/test39.txt @@ -0,0 +1,10 @@ +3 +1 2 0 0 -2 0 0 0 2 2 +1 2 0 0 -2 0 0 0 -2 2 +1 2 0 0 -2 0 0 0 2 2 +0 +2 2 2 +-2 0 0 +2 0 0 +1 2 0 0 -2 0 0 0 2 2 2 +1 2 0 0 -2 0 0 0 -2 2 1 diff --git a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_construction.geodesic_arcs_on_sphere.cmd b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_construction.geodesic_arcs_on_sphere.cmd index 7c0148e58a4..547aa518864 100644 --- a/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_construction.geodesic_arcs_on_sphere.cmd +++ b/Arrangement_on_surface_2/test/Arrangement_on_surface_2/test_construction.geodesic_arcs_on_sphere.cmd @@ -36,4 +36,4 @@ data/test_construction/geodesic_arcs_on_sphere/test35.txt data/test_construction/geodesic_arcs_on_sphere/test36.txt data/test_construction/geodesic_arcs_on_sphere/test37.txt data/test_construction/geodesic_arcs_on_sphere/test38.txt - +data/test_construction/geodesic_arcs_on_sphere/test39.txt diff --git a/Installation/CHANGES.md b/Installation/CHANGES.md index dc990f34b68..38ffa08528f 100644 --- a/Installation/CHANGES.md +++ b/Installation/CHANGES.md @@ -48,6 +48,10 @@ Release date: June 2022 ### [2D Regularized Boolean Set-Operations](https://doc.cgal.org/5.5/Manual/packages.html#PkgBooleanSetOperations2) - The concept `GeneralPolygonSetTraits_2` now requires the nested type `Construct_polygon_with_holes_2` instead of `Construct_general_polygon_with_holes_2`. +### [2D Arrangements](https://doc.cgal.org/5.5/Manual/packages.html#PkgArrangementOnSurface2) +- Fixed the intersect_2, compare_y_at_x_right, and compare_y_at_x_left function objects of the traits class template that handles geodesic arcs on sphere and applied a small syntactical fix to the tracing traits. + + [Release 5.4](https://github.com/CGAL/cgal/releases/tag/v5.4) -----------