diff --git a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/algebraic_segments.cpp b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/algebraic_segments.cpp index 8610d32793b..adb6052d86c 100644 --- a/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/algebraic_segments.cpp +++ b/Arrangement_on_surface_2/examples/Arrangement_on_surface_2/algebraic_segments.cpp @@ -99,10 +99,9 @@ int main() { std::back_inserter(segs)); // Construct a vertical segment - Curve_2 cv4 = construct_curve(x); - Point_2 v1 = construct_point(Algebraic_real_1(0),cv2,0); + Point_2 v1 = construct_point(0,0); Point_2 v2 = construct_point(Algebraic_real_1(0),cv1,1); - construct_x_monotone_segment(cv4,v1,v2,std::back_inserter(segs)); + construct_x_monotone_segment(v1,v2,std::back_inserter(segs)); CGAL::insert(arr,segs.begin(),segs.end()); diff --git a/Arrangement_on_surface_2/include/CGAL/Arr_algebraic_segment_traits_2.h b/Arrangement_on_surface_2/include/CGAL/Arr_algebraic_segment_traits_2.h index dbe541028e6..700869efd13 100644 --- a/Arrangement_on_surface_2/include/CGAL/Arr_algebraic_segment_traits_2.h +++ b/Arrangement_on_surface_2/include/CGAL/Arr_algebraic_segment_traits_2.h @@ -478,6 +478,60 @@ public: out); } } + + template OutputIterator + operator() (Point_2 p, Point_2 q, OutputIterator out) { + bool same_x=(this->_ckva()->compare_x_2_object()(p,q)==CGAL::EQUAL); + if(same_x) { + Algebraic_real_1 x = p.x(); + Polynomial_2 f = Polynomial_2(x.polynomial()); + Curve_2 cv + = this->_ckva()->kernel().construct_curve_2_object() (f); + *out++=typename CKvA_2::Arc_2(p,q,cv); + return out; + } + Algebraic_real_1 px + =this->_ckva()->kernel().compute_x_2_object()(p.xy()), + py=this->_ckva()->kernel().compute_y_2_object()(p.xy()), + qx=this->_ckva()->kernel().compute_x_2_object()(q.xy()), + qy=this->_ckva()->kernel().compute_y_2_object()(q.xy()); + bool p_rat=px.is_rational() && py.is_rational(); + bool q_rat=qx.is_rational() && qy.is_rational(); + if(p_rat && q_rat) { + typedef typename Algebraic_real_1::Rational Rational; + Rational pxr=px.rational(), pyr=py.rational(), + qxr=qx.rational(), qyr=qy.rational(); + typedef CGAL::Fraction_traits FT; + typename FT::Decompose decompose; + typedef typename FT::Numerator_type Numerator; + typedef typename FT::Denominator_type Denominator; + Rational term_at_y=qxr-pxr, term_at_x=-qyr+pyr, + term_at_1=pxr*qyr-pyr*qxr; + Denominator denom_curr; + Numerator term_at_y_int, term_at_x_int, term_at_1_int; + decompose(term_at_y, term_at_y_int, denom_curr); + term_at_x=term_at_x*denom_curr; + term_at_1=term_at_1*denom_curr; + decompose(term_at_x,term_at_x_int,denom_curr); + term_at_y_int=term_at_y_int*denom_curr; + term_at_1=term_at_1*denom_curr; + decompose(term_at_1,term_at_1_int,denom_curr); + term_at_y_int=term_at_y_int*denom_curr; + term_at_x_int=term_at_x_int*denom_curr; + typedef typename CGAL::Polynomial_traits_d + ::Coefficient_type Polynomial_1; + Polynomial_2 pol(Polynomial_1(term_at_1_int,term_at_x_int), + Polynomial_1(term_at_y_int)); + Curve_2 curve=this->_ckva()->kernel().construct_curve_2_object() + (pol); + std::cout << curve << std::endl; + CGAL_assertion(this->_ckva()->is_on_2_object()(p,curve)); + CGAL_assertion(this->_ckva()->is_on_2_object()(q,curve)); + return this->operator()(curve,p,q,out); + } + CGAL_precondition(same_x || (p_rat && q_rat)); + return out; + } }; Construct_x_monotone_segment_2 construct_x_monotone_segment_2_object()