Construction method for segments added

This commit is contained in:
Michael Kerber 2010-07-28 10:48:33 +00:00
parent 4030bc9fa9
commit 87aa6f8a01
2 changed files with 56 additions and 3 deletions

View File

@ -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());

View File

@ -478,6 +478,60 @@ public:
out);
}
}
template<typename OutputIterator> 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<Rational> 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<Polynomial_2>
::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()