diff --git a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/ConstructBoundingBox.cpp b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/ConstructBoundingBox.cpp index 7644372bfe6..480780d91fa 100644 --- a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/ConstructBoundingBox.cpp +++ b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/ConstructBoundingBox.cpp @@ -24,7 +24,35 @@ struct ConstructBoundingBox_impl CGAL::Bbox_2 operator()(const X_monotone_curve_2& curve) { - return curve.bbox(); + using Zero_resultant_exception = CGAL::internal::Zero_resultant_exception< + typename demo_types::Alg_seg_traits::Polynomial_2>; + + CGAL::Bbox_2 bbox; + try + { + bbox= curve.bbox(); + } + // algebraic traits sometimes when calling bbox + // example: xy=0 + catch (std::exception& ex) + { + std::cerr << ex.what() << '\n'; + std::cerr << __FILE__ << ':' << __LINE__ << '\n'; + bbox = inf_bbox; + } + catch (Zero_resultant_exception& ex) + { + std::cerr << "Exception thrown of type \"Zero_resultant_exception\"\n"; + std::cerr << __FILE__ << ':' << __LINE__ << '\n'; + bbox = inf_bbox; + } + catch (...) + { + std::cerr << "Exception thrown of unknown type!\n"; + std::cerr << __FILE__ << ':' << __LINE__ << '\n'; + bbox = inf_bbox; + } + return bbox; } CGAL::Bbox_2 diff --git a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/EnvelopeCallback.cpp b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/EnvelopeCallback.cpp index 10806249f35..25e6c602852 100644 --- a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/EnvelopeCallback.cpp +++ b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/EnvelopeCallback.cpp @@ -136,12 +136,13 @@ void EnvelopeCallback< Arr_>::updateEnvelope( bool lower ) } catch (const std::exception& ex) { - std::cerr << ex.what() << '\n'; - if (lower) - this->showLowerEnvelope(false); - else - this->showUpperEnvelope(false); - return; + std::cerr << ex.what() << '\n'; + std::cerr << __FILE__ << ':' << __LINE__ << '\n'; + if (lower) + this->showLowerEnvelope(false); + else + this->showUpperEnvelope(false); + return; } envelopeToUpdate->clear( ); diff --git a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/SplitEdgeCallback.cpp b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/SplitEdgeCallback.cpp index 409befd82d1..8cec2d258c8 100644 --- a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/SplitEdgeCallback.cpp +++ b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/SplitEdgeCallback.cpp @@ -80,6 +80,7 @@ void SplitEdgeCallback::curveInputDoneEvent( catch (const std::exception& ex) { std::cerr << ex.what() << '\n'; + std::cerr << __FILE__ << ':' << __LINE__ << '\n'; return; } } diff --git a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/Utils.cpp b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/Utils.cpp index b01f9fec43d..fc61ccc5b26 100644 --- a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/Utils.cpp +++ b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/Utils.cpp @@ -384,7 +384,8 @@ Construct_x_monotone_subcurve_2::Construct_x_monotone_subcurve_2( compare_x_2(this->traits->compare_x_2_object()), compute_y_at_x(this->traits), construct_min_vertex_2(this->traits->construct_min_vertex_2_object()), - construct_max_vertex_2(this->traits->construct_max_vertex_2_object()) + construct_max_vertex_2(this->traits->construct_max_vertex_2_object()), + parameter_space_in_x_2(this->traits) { } @@ -396,10 +397,16 @@ auto Construct_x_monotone_subcurve_2::operator()( Point_2 pMin, pMax; bool unbounded_min = false; bool unbounded_max = false; - try { pMin = this->construct_min_vertex_2(curve); } - catch (...) { unbounded_min = true; } - try { pMax = this->construct_max_vertex_2(curve); } - catch (...) { unbounded_max = true; } + + if (this->parameter_space_in_x_2(curve, CGAL::ARR_MIN_END) != CGAL::INTERIOR) + unbounded_min = true; + else + pMin = this->construct_min_vertex_2(curve); + + if (this->parameter_space_in_x_2(curve, CGAL::ARR_MAX_END) != CGAL::INTERIOR) + unbounded_max = true; + else + pMax = this->construct_max_vertex_2(curve); X_monotone_curve_2 subcurve; X_monotone_curve_2 unusedTrimmings; diff --git a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/Utils.h b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/Utils.h index c09df74100b..a2f31717e28 100644 --- a/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/Utils.h +++ b/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/Utils.h @@ -14,6 +14,10 @@ #include "GraphicsSceneMixin.h" #include "ArrTraitsAdaptor.h" +#include +#include +#include + class QGraphicsScene; template @@ -276,23 +280,73 @@ public: double operator()(const Point_2& p, const X_monotone_curve_2& c) const; }; +// chcek if arrangement is a model of the concept ArrangementOpenBoundaryTraits_2 +template +struct IsOpenBoundaryArrangement : + public CGAL::Boolean_tag< + std::is_convertible< + typename ArrTraits::Left_side_category, + CGAL::Arr_open_side_tag>::value && + std::is_convertible< + typename ArrTraits::Bottom_side_category, + CGAL::Arr_open_side_tag>::value && + std::is_convertible< + typename ArrTraits::Top_side_category, + CGAL::Arr_open_side_tag>::value && + std::is_convertible< + typename ArrTraits::Right_side_category, + CGAL::Arr_open_side_tag>::value> +{ +}; + +template +class Param_space_in_x_2 +{ +public: + typedef typename ArrTraits::X_monotone_curve_2 X_monotone_curve_2; + + Param_space_in_x_2(const ArrTraits*) {} + CGAL::Arr_parameter_space + operator()(const X_monotone_curve_2&, CGAL::Arr_curve_end) + { + return CGAL::INTERIOR; + } +}; + +template +class Param_space_in_x_2< + ArrTraits, std::enable_if_t::value>> +{ +public: + typedef typename ArrTraits::X_monotone_curve_2 X_monotone_curve_2; + typedef typename ArrTraits::Parameter_space_in_x_2 Parameter_space_in_x_2; + + Param_space_in_x_2(const ArrTraits* traits) : + parameter_space_in_x_2(traits->parameter_space_in_x_2_object()) + { + } + + CGAL::Arr_parameter_space + operator()(const X_monotone_curve_2& curve, CGAL::Arr_curve_end curve_end) + { + return this->parameter_space_in_x_2(curve, curve_end); + } + +private: + Parameter_space_in_x_2 parameter_space_in_x_2; +}; + template class Construct_x_monotone_subcurve_2 { public: - typedef typename ArrTraitsAdaptor::Kernel Kernel; typedef typename ArrTraits::X_monotone_curve_2 X_monotone_curve_2; typedef typename ArrTraits::Split_2 Split_2; - typedef typename ArrTraits::Intersect_2 Intersect_2; - typedef typename ArrTraits::Multiplicity Multiplicity; typedef typename ArrTraits::Construct_min_vertex_2 Construct_min_vertex_2; typedef typename ArrTraits::Construct_max_vertex_2 Construct_max_vertex_2; typedef typename ArrTraits::Compare_x_2 Compare_x_2; - typedef typename Kernel::FT FT; - typedef typename ArrTraitsAdaptor< ArrTraits >::CoordinateType - CoordinateType; + typedef Param_space_in_x_2 Parameter_space_in_x_2; typedef typename ArrTraits::Point_2 Point_2; - typedef typename Kernel::Point_2 Kernel_point_2; Construct_x_monotone_subcurve_2( const ArrTraits* traits_ ); @@ -313,6 +367,7 @@ protected: Arr_compute_y_at_x_2< ArrTraits > compute_y_at_x; Construct_min_vertex_2 construct_min_vertex_2; Construct_max_vertex_2 construct_max_vertex_2; + Parameter_space_in_x_2 parameter_space_in_x_2; }; // class Construct_x_monotone_subcurve_2