Added missing constructors (from polygon + traits) and used them

This commit is contained in:
Efi Fogel 2021-03-03 11:29:12 +02:00
parent 514f123a75
commit 76f44656eb
3 changed files with 74 additions and 82 deletions

View File

@ -35,8 +35,7 @@ namespace CGAL {
// With Traits // With Traits
template <typename Pgn1, class Pgn2, typename Traits> template <typename Pgn1, class Pgn2, typename Traits>
inline bool s_do_intersect(const Pgn1& pgn1, const Pgn2& pgn2, Traits& traits) { inline bool s_do_intersect(const Pgn1& pgn1, const Pgn2& pgn2, Traits& traits) {
General_polygon_set_2<Traits> gps(traits); General_polygon_set_2<Traits> gps(pgn1, traits);
gps.insert(pgn1);
return gps.do_intersect(pgn2); return gps.do_intersect(pgn2);
} }
@ -55,9 +54,8 @@ template <typename InputIterator, typename Traits>
inline bool r_do_intersect(InputIterator begin, InputIterator end, inline bool r_do_intersect(InputIterator begin, InputIterator end,
Traits& traits, unsigned int k=5) { Traits& traits, unsigned int k=5) {
if (begin == end) return false; if (begin == end) return false;
General_polygon_set_2<Traits> gps(traits); General_polygon_set_2<Traits> gps(*begin, traits);
gps.insert(*begin); return gps.do_intersect(std::next(begin), end, k);
return gps.do_intersect(++begin, end, k);
} }
// Without Traits // Without Traits
@ -78,9 +76,8 @@ inline bool r_do_intersect(InputIterator1 begin1, InputIterator1 end1,
InputIterator2 begin2, InputIterator2 end2, InputIterator2 begin2, InputIterator2 end2,
Traits& traits, unsigned int k=5) { Traits& traits, unsigned int k=5) {
if (begin1 == end1) return do_intersect(begin2, end2, traits, k); if (begin1 == end1) return do_intersect(begin2, end2, traits, k);
General_polygon_set_2<Traits> gps(traits); General_polygon_set_2<Traits> gps(*begin1, traits);
gps.insert(*begin1); return gps.do_intersect(std::next(begin1), end1, begin2, end2, k);
return gps.do_intersect(++begin1, end1, begin2, end2, k);
} }
// Without Traits // Without Traits
@ -106,8 +103,7 @@ inline bool r_do_intersect (InputIterator1 begin1, InputIterator1 end1,
template <typename Obj, typename Pgn, typename Traits> template <typename Obj, typename Pgn, typename Traits>
inline Oriented_side _oriented_side(const Obj& obj, const Pgn& pgn, inline Oriented_side _oriented_side(const Obj& obj, const Pgn& pgn,
Traits& traits) { Traits& traits) {
General_polygon_set_2<Traits> gps(traits); General_polygon_set_2<Traits> gps(pgn, traits);
gps.insert(pgn);
return gps.oriented_side(obj); return gps.oriented_side(obj);
} }
@ -142,8 +138,7 @@ inline Oriented_side _oriented_side(const Pgn1& pgn1, const Pgn2& pgn2)
template <typename Pgn1, typename Pgn2, typename OutputIterator, typename Traits> template <typename Pgn1, typename Pgn2, typename OutputIterator, typename Traits>
inline OutputIterator s_intersection(const Pgn1& pgn1, const Pgn2& pgn2, inline OutputIterator s_intersection(const Pgn1& pgn1, const Pgn2& pgn2,
OutputIterator oi, Traits& traits) { OutputIterator oi, Traits& traits) {
General_polygon_set_2<Traits> gps(traits); General_polygon_set_2<Traits> gps(pgn1, traits);
gps.insert(pgn1);
gps.intersection(pgn2); gps.intersection(pgn2);
return gps.polygons_with_holes(oi); return gps.polygons_with_holes(oi);
} }
@ -169,11 +164,11 @@ inline OutputIterator s_intersection(const Pgn1& pgn1, const Pgn2& pgn2,
// With Traits // With Traits
template <typename InputIterator, typename OutputIterator, typename Traits> template <typename InputIterator, typename OutputIterator, typename Traits>
inline OutputIterator r_intersection(InputIterator begin, InputIterator end, inline OutputIterator r_intersection(InputIterator begin, InputIterator end,
OutputIterator oi, Traits&, OutputIterator oi, Traits& traits,
unsigned int k=5) { unsigned int k=5) {
if (begin == end) return (oi); if (begin == end) return (oi);
General_polygon_set_2<Traits> gps(*begin); General_polygon_set_2<Traits> gps(*begin, traits);
gps.intersection(++begin, end, k); gps.intersection(std::next(begin), end, k);
return gps.polygons_with_holes(oi); return gps.polygons_with_holes(oi);
} }
@ -198,8 +193,8 @@ inline OutputIterator r_intersection(InputIterator1 begin1, InputIterator1 end1,
OutputIterator oi, Traits& traits, OutputIterator oi, Traits& traits,
unsigned int k=5) { unsigned int k=5) {
if (begin1 == end1) return r_intersection(begin2, end2, oi, traits, k); if (begin1 == end1) return r_intersection(begin2, end2, oi, traits, k);
General_polygon_set_2<Traits> gps(*begin1); General_polygon_set_2<Traits> gps(*begin1, traits);
gps.intersection(++begin1, end1, begin2, end2, k); gps.intersection(std::next(begin1), end1, begin2, end2, k);
return gps.polygons_with_holes(oi); return gps.polygons_with_holes(oi);
} }
@ -251,8 +246,7 @@ inline bool s_join(const Pgn1& pgn1, const Pgn2& pgn2,
typename Traits::Polygon_with_holes_2& res, Traits& traits) { typename Traits::Polygon_with_holes_2& res, Traits& traits) {
if (_is_empty(pgn1, traits) || _is_empty(pgn2, traits)) return false; if (_is_empty(pgn1, traits) || _is_empty(pgn2, traits)) return false;
General_polygon_set_2<Traits> gps(traits); General_polygon_set_2<Traits> gps(pgn1, traits);
gps.insert(pgn1);
gps.join(pgn2); gps.join(pgn2);
if (gps.number_of_polygons_with_holes() == 1) { if (gps.number_of_polygons_with_holes() == 1) {
Oneset_iterator<typename Traits::Polygon_with_holes_2> oi(res); Oneset_iterator<typename Traits::Polygon_with_holes_2> oi(res);
@ -287,10 +281,11 @@ inline bool s_join(const Pgn1& pgn1, const Pgn2& pgn2, Pwh& pwh) {
// With traits // With traits
template <typename InputIterator, typename OutputIterator, typename Traits> template <typename InputIterator, typename OutputIterator, typename Traits>
inline OutputIterator r_join(InputIterator begin, InputIterator end, inline OutputIterator r_join(InputIterator begin, InputIterator end,
OutputIterator oi, Traits&, unsigned int k=5) { OutputIterator oi, Traits& traits,
unsigned int k=5) {
if (begin == end) return oi; if (begin == end) return oi;
General_polygon_set_2<Traits> gps(*begin); General_polygon_set_2<Traits> gps(*begin, traits);
gps.join(++begin, end, k); gps.join(std::next(begin), end, k);
return gps.polygons_with_holes(oi); return gps.polygons_with_holes(oi);
} }
@ -315,8 +310,8 @@ inline OutputIterator r_join(InputIterator1 begin1, InputIterator1 end1,
OutputIterator oi, Traits& traits, OutputIterator oi, Traits& traits,
unsigned int k=5) { unsigned int k=5) {
if (begin1 == end1) return r_join(begin2, end2, oi, traits, k); if (begin1 == end1) return r_join(begin2, end2, oi, traits, k);
General_polygon_set_2<Traits> gps(*begin1); General_polygon_set_2<Traits> gps(*begin1, traits);
gps.join(++begin1, end1, begin2, end2, k); gps.join(std::next(begin1), end1, begin2, end2, k);
return gps.polygons_with_holes(oi); return gps.polygons_with_holes(oi);
} }
@ -344,8 +339,7 @@ inline OutputIterator r_join(InputIterator1 begin1, InputIterator1 end1,
template <typename Pgn1, typename Pgn2, typename OutputIterator, typename Traits> template <typename Pgn1, typename Pgn2, typename OutputIterator, typename Traits>
inline OutputIterator _difference(const Pgn1& pgn1, const Pgn2& pgn2, inline OutputIterator _difference(const Pgn1& pgn1, const Pgn2& pgn2,
OutputIterator oi, Traits& traits) { OutputIterator oi, Traits& traits) {
General_polygon_set_2<Traits> gps(traits); General_polygon_set_2<Traits> gps(pgn1, traits);
gps.insert(pgn1);
gps.difference(pgn2); gps.difference(pgn2);
return gps.polygons_with_holes(oi); return gps.polygons_with_holes(oi);
} }
@ -377,8 +371,7 @@ template <typename Pgn1, typename Pgn2, typename OutputIterator, typename Traits
inline OutputIterator s_symmetric_difference(const Pgn1& pgn1, const Pgn2& pgn2, inline OutputIterator s_symmetric_difference(const Pgn1& pgn1, const Pgn2& pgn2,
OutputIterator oi, OutputIterator oi,
Traits& traits) { Traits& traits) {
General_polygon_set_2<Traits> gps(traits); General_polygon_set_2<Traits> gps(pgn1, traits);
gps.insert(pgn1);
gps.symmetric_difference(pgn2); gps.symmetric_difference(pgn2);
return gps.polygons_with_holes(oi); return gps.polygons_with_holes(oi);
} }
@ -408,9 +401,8 @@ OutputIterator r_symmetric_difference(InputIterator begin, InputIterator end,
OutputIterator oi, Traits& traits, OutputIterator oi, Traits& traits,
unsigned int k=5) { unsigned int k=5) {
if (begin == end) return (oi); if (begin == end) return (oi);
General_polygon_set_2<Traits> gps(traits); General_polygon_set_2<Traits> gps(*begin, traits);
gps.insert(*begin); gps.symmetric_difference(std::next(begin), end, k);
gps.symmetric_difference(++begin, end, k);
return gps.polygons_with_holes(oi); return gps.polygons_with_holes(oi);
} }
@ -441,9 +433,8 @@ inline OutputIterator r_symmetric_difference(InputIterator1 begin1,
unsigned int k=5) unsigned int k=5)
{ {
if (begin1 == end1) return r_symmetric_difference(begin2, end2, oi, traits, k); if (begin1 == end1) return r_symmetric_difference(begin2, end2, oi, traits, k);
General_polygon_set_2<Traits> gps(traits); General_polygon_set_2<Traits> gps(*begin1, traits);
gps.insert(*begin1); gps.symmetric_difference(std::next(begin1), end1, begin2, end2, k);
gps.symmetric_difference(++begin1, end1, begin2, end2, k);
return gps.polygons_with_holes(oi); return gps.polygons_with_holes(oi);
} }
@ -475,8 +466,7 @@ inline OutputIterator r_symmetric_difference(InputIterator1 begin1,
template <typename Kernel, typename Container, typename Traits> template <typename Kernel, typename Container, typename Traits>
void _complement(const Polygon_2<Kernel, Container>& pgn, void _complement(const Polygon_2<Kernel, Container>& pgn,
typename Traits::Polygon_with_holes_2& res, Traits& traits) { typename Traits::Polygon_with_holes_2& res, Traits& traits) {
General_polygon_set_2<Traits> gps(traits); General_polygon_set_2<Traits> gps(pgn, traits);
gps.insert(pgn);
gps.complement(); gps.complement();
Oneset_iterator<typename Traits::Polygon_with_holes_2> oi(res); Oneset_iterator<typename Traits::Polygon_with_holes_2> oi(res);
gps.polygons_with_holes(oi); gps.polygons_with_holes(oi);
@ -486,8 +476,7 @@ void _complement(const Polygon_2<Kernel, Container>& pgn,
template <typename ArrTraits, typename Traits> template <typename ArrTraits, typename Traits>
void _complement(const General_polygon_2<ArrTraits>& pgn, void _complement(const General_polygon_2<ArrTraits>& pgn,
typename Traits::Polygon_with_holes_2& res, Traits& traits) { typename Traits::Polygon_with_holes_2& res, Traits& traits) {
General_polygon_set_2<Traits> gps(traits); General_polygon_set_2<Traits> gps(pgn, traits);
gps.insert(pgn);
gps.complement(); gps.complement();
Oneset_iterator<typename Traits::Polygon_with_holes_2> oi(res); Oneset_iterator<typename Traits::Polygon_with_holes_2> oi(res);
gps.polygons_with_holes(oi); gps.polygons_with_holes(oi);
@ -498,8 +487,7 @@ template <typename Kernel, typename Container, typename OutputIterator,
typename Traits> typename Traits>
OutputIterator _complement(const Polygon_with_holes_2<Kernel, Container>& pgn, OutputIterator _complement(const Polygon_with_holes_2<Kernel, Container>& pgn,
OutputIterator oi, Traits& traits) { OutputIterator oi, Traits& traits) {
General_polygon_set_2<Traits> gps(traits); General_polygon_set_2<Traits> gps(pgn, traits);
gps.insert(pgn);
gps.complement(); gps.complement();
return gps.polygons_with_holes(oi); return gps.polygons_with_holes(oi);
} }
@ -508,8 +496,7 @@ OutputIterator _complement(const Polygon_with_holes_2<Kernel, Container>& pgn,
template <typename Pgn, typename OutputIterator, typename Traits> template <typename Pgn, typename OutputIterator, typename Traits>
OutputIterator _complement(const General_polygon_with_holes_2<Pgn>& pgn, OutputIterator _complement(const General_polygon_with_holes_2<Pgn>& pgn,
OutputIterator oi, Traits& traits) { OutputIterator oi, Traits& traits) {
General_polygon_set_2<Traits> gps(traits); General_polygon_set_2<Traits> gps(pgn, traits);
gps.insert(pgn);
gps.complement(); gps.complement();
return gps.polygons_with_holes(oi); return gps.polygons_with_holes(oi);
} }

View File

@ -50,13 +50,24 @@ public:
// default costructor // default costructor
General_polygon_set_2() : Base() {} General_polygon_set_2() : Base() {}
// constructor with traits object // constructor from a traits object
General_polygon_set_2(const Traits_2& tr) : Base(tr) {} General_polygon_set_2(const Traits_2& traits) : Base(traits) {}
// constructor from a polygon
explicit General_polygon_set_2(const Polygon_2& pgn) : Base(pgn) {} explicit General_polygon_set_2(const Polygon_2& pgn) : Base(pgn) {}
explicit General_polygon_set_2(const Polygon_with_holes_2& pgn_with_holes): // constructor from a polygon with holes
Base(pgn_with_holes) explicit General_polygon_set_2(const Polygon_with_holes_2& pwh) : Base(pwh) {}
// constructor from a polygon and a traits object
explicit General_polygon_set_2(const Polygon_2& pgn, const Traits_2& traits) :
Base(pgn, traits)
{}
// constructor from a polygon with holes and a traits object
explicit General_polygon_set_2(const Polygon_with_holes_2& pwh,
const Traits_2& traits) :
Base(pwh, traits)
{} {}
// For some reason the below functions (the ones that we call "using" for) // For some reason the below functions (the ones that we call "using" for)
@ -92,17 +103,13 @@ public:
* \return the underlying arrangement. * \return the underlying arrangement.
*/ */
const Arrangement_2& arrangement() const const Arrangement_2& arrangement() const
{ { return *(static_cast<const Arrangement_2*>(this->m_arr)); }
return *(static_cast<const Arrangement_2*>(this->m_arr));
}
/*! Obtain a reference to the underlying arrangement /*! Obtain a reference to the underlying arrangement
* \return the underlying arrangement. * \return the underlying arrangement.
*/ */
Arrangement_2& arrangement() Arrangement_2& arrangement()
{ { return *(static_cast<Arrangement_2*>(this->m_arr)); }
return *(static_cast<Arrangement_2*>(this->m_arr));
}
//@} //@}
}; };

View File

@ -23,7 +23,6 @@
namespace CGAL { namespace CGAL {
namespace Boolean_set_operation_2_internal namespace Boolean_set_operation_2_internal
{ {
struct PreconditionValidationPolicy struct PreconditionValidationPolicy
@ -43,7 +42,6 @@ namespace Boolean_set_operation_2_internal
}; };
} }
// General_polygon_set_on_surface_2 // General_polygon_set_on_surface_2
/* /*
This class is derived from Gps_on_surface_base_2. This class is derived from Gps_on_surface_base_2.
@ -74,48 +72,55 @@ public:
General_polygon_set_on_surface_2() : Base() General_polygon_set_on_surface_2() : Base()
{} {}
// constructor with traits object // constructor from a traits object
General_polygon_set_on_surface_2(const Traits_2& tr) : Base(tr) {} General_polygon_set_on_surface_2(const Traits_2& traits) : Base(traits) {}
// copy constructor
General_polygon_set_on_surface_2(const Self& ps) : Base(ps) {} General_polygon_set_on_surface_2(const Self& ps) : Base(ps) {}
// assignment operator
General_polygon_set_on_surface_2& operator=(const Self& ps) General_polygon_set_on_surface_2& operator=(const Self& ps)
{ {
Base::operator=(ps); Base::operator=(ps);
return (*this); return (*this);
} }
// constructor from a polygon
explicit General_polygon_set_on_surface_2(const Polygon_2& pgn) : Base(pgn) {} explicit General_polygon_set_on_surface_2(const Polygon_2& pgn) : Base(pgn) {}
// constructor from a polygon with holes
explicit explicit
General_polygon_set_on_surface_2(const Polygon_with_holes_2& pgn_with_holes) : General_polygon_set_on_surface_2(const Polygon_with_holes_2& pwh) :
Base(pgn_with_holes) Base(pwh)
{}
// constructor from a polygon and a traits object
explicit General_polygon_set_on_surface_2(const Polygon_2& pgn,
const Traits_2& traits) :
Base(pgn, traits) {}
// constructor from a polygon with holes and a traits object
explicit
General_polygon_set_on_surface_2(const Polygon_with_holes_2& pwh,
const Traits_2& traits) :
Base(pwh, traits)
{} {}
protected: protected:
General_polygon_set_on_surface_2(Arrangement_on_surface_2* arr) : Base(arr) General_polygon_set_on_surface_2(Arrangement_on_surface_2* arr) : Base(arr) {}
{}
public: public:
//destructor // destructor
virtual ~General_polygon_set_on_surface_2() virtual ~General_polygon_set_on_surface_2() {}
{}
void intersection(const Self& gps1, const Self& gps2) void intersection(const Self& gps1, const Self& gps2)
{ { Base::intersection(gps1.base(), gps2.base()); }
Base::intersection(gps1.base(), gps2.base());
}
void join(const Self& gps1, const Self& gps2) void join(const Self& gps1, const Self& gps2)
{ { Base::join(gps1.base(), gps2.base()); }
Base::join(gps1.base(), gps2.base());
}
void symmetric_difference(const Self& gps1, const Self& gps2) void symmetric_difference(const Self& gps1, const Self& gps2)
{ { Base::symmetric_difference(gps1.base(), gps2.base()); }
Base::symmetric_difference(gps1.base(), gps2.base());
}
// For some reason the below functions (the ones that we call "using" for) // For some reason the below functions (the ones that we call "using" for)
// are hidden by the function in this class and are not found in the parent's // are hidden by the function in this class and are not found in the parent's
@ -128,16 +133,9 @@ public:
using Base::symmetric_difference; using Base::symmetric_difference;
private: private:
const Base& base() const const Base& base() const { return static_cast<const Base&> (*this); }
{
return static_cast<const Base&> (*this);
}
Base& base()
{
return static_cast<Base&> (*this);
}
Base& base() { return static_cast<Base&> (*this); }
}; };
} //namespace CGAL } //namespace CGAL