// Copyright (c) 2005 Tel-Aviv University (Israel). // All rights reserved. // // This file is part of CGAL (www.cgal.org). // // $URL: https://github.com/CGAL/cgal/blob/v5.1/Boolean_set_operations_2/include/CGAL/Boolean_set_operations_2.h $ // $Id: Boolean_set_operations_2.h 0779373 2020-03-26T13:31:46+01:00 Sébastien Loriot // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial // // // Author(s) : Baruch Zukerman // Ron Wein // Efi Fogel #ifndef CGAL_BOOLEAN_SET_OPERATIONS_H #define CGAL_BOOLEAN_SET_OPERATIONS_H #include #include #include #include #include #include #include #include #include #include #include #include #include namespace CGAL { /// \name do_intersect() functions. //@{ template inline bool do_intersect(const Polygon_2& pgn1, const Polygon_2& pgn2) { return (_do_intersect(pgn1, pgn2)); } template inline bool do_intersect(const Polygon_2& pgn1, const Polygon_2& pgn2, Traits& tr) { return (_do_intersect(pgn1, pgn2, tr)); } template inline bool do_intersect(const Polygon_2& pgn1, const Polygon_with_holes_2& pgn2) { return (_do_intersect(pgn1, pgn2)); } template inline bool do_intersect(const Polygon_2& pgn1, const Polygon_with_holes_2& pgn2, Traits& tr) { return (_do_intersect(pgn1, pgn2, tr)); } template inline bool do_intersect(const Polygon_with_holes_2& pgn1, const Polygon_2& pgn2) { return (_do_intersect(pgn1, pgn2)); } template inline bool do_intersect(const Polygon_with_holes_2& pgn1, const Polygon_2& pgn2, Traits& tr) { return (_do_intersect(pgn1, pgn2, tr)); } template inline bool do_intersect(const Polygon_with_holes_2& pgn1, const Polygon_with_holes_2& pgn2) { return (_do_intersect(pgn1, pgn2)); } template inline bool do_intersect(const Polygon_with_holes_2& pgn1, const Polygon_with_holes_2& pgn2, Traits& tr) { return (_do_intersect(pgn1, pgn2, tr)); } template inline bool do_intersect(const General_polygon_2& pgn1, const General_polygon_2& pgn2) { return (_do_intersect(pgn1, pgn2)); } template inline bool do_intersect(const General_polygon_2& pgn1, const General_polygon_2& pgn2, Gps_traits& tr) { return (_do_intersect(pgn1, pgn2, tr)); } template inline bool do_intersect(const General_polygon_2& pgn1, const General_polygon_with_holes_2 >& pgn2) { return (_do_intersect(pgn1, pgn2)); } template inline bool do_intersect(const General_polygon_2& pgn1, const General_polygon_with_holes_2 >& pgn2, Gps_traits& tr) { return (_do_intersect(pgn1, pgn2, tr)); } template inline bool do_intersect(const General_polygon_with_holes_2 >& pgn1, const General_polygon_2& pgn2) { return (_do_intersect(pgn1, pgn2)); } template inline bool do_intersect(const General_polygon_with_holes_2 >& pgn1, const General_polygon_2& pgn2, Gps_traits& tr) { return (_do_intersect(pgn1, pgn2, tr)); } template inline bool do_intersect(const General_polygon_with_holes_2& pgn1, const General_polygon_with_holes_2& pgn2) { return (_do_intersect(pgn1, pgn2)); } template inline bool do_intersect(const General_polygon_with_holes_2& pgn1, const General_polygon_with_holes_2& pgn2, Traits& tr) { return (_do_intersect(pgn1, pgn2, tr)); } //@} /// \name intersection() functions. //@{ template inline OutputIterator intersection(const Polygon_2& pgn1, const Polygon_2& pgn2, OutputIterator out) { return (_intersection(pgn1, pgn2, out)); } template inline OutputIterator intersection(const Polygon_2& pgn1, const Polygon_2& pgn2, OutputIterator out, Traits& tr) { return (_intersection(pgn1, pgn2, out, tr)); } template inline OutputIterator intersection(const Polygon_2& pgn1, const Polygon_with_holes_2& pgn2, OutputIterator out) { return (_intersection(pgn1, pgn2, out)); } template inline OutputIterator intersection (const Polygon_2& pgn1, const Polygon_with_holes_2& pgn2, OutputIterator out, Traits& tr) { return (_intersection(pgn1, pgn2, out, tr)); } template inline OutputIterator intersection (const Polygon_with_holes_2& pgn1, const Polygon_2& pgn2, OutputIterator out) { return (_intersection(pgn1, pgn2, out)); } template inline OutputIterator intersection (const Polygon_with_holes_2& pgn1, const Polygon_2& pgn2, OutputIterator out, Traits& tr) { return (_intersection(pgn1, pgn2, out, tr)); } template inline OutputIterator intersection (const Polygon_with_holes_2& pgn1, const Polygon_with_holes_2& pgn2, OutputIterator out) { return (_intersection(pgn1, pgn2, out)); } template inline OutputIterator intersection (const Polygon_with_holes_2& pgn1, const Polygon_with_holes_2& pgn2, OutputIterator out, Traits& tr) { return (_intersection(pgn1, pgn2, out, tr)); } template inline OutputIterator intersection (const General_polygon_2& pgn1, const General_polygon_2& pgn2, OutputIterator out) { return (_intersection(pgn1, pgn2, out)); } template inline OutputIterator intersection (const General_polygon_2& pgn1, const General_polygon_2& pgn2, OutputIterator out, Traits& tr) { return (_intersection(pgn1, pgn2, out, tr)); } template inline OutputIterator intersection (const General_polygon_2& pgn1, const General_polygon_with_holes_2 >& pgn2, OutputIterator out) { return (_intersection(pgn1, pgn2, out)); } template inline OutputIterator intersection (const General_polygon_2& pgn1, const General_polygon_with_holes_2 >& pgn2, OutputIterator out, Traits& tr) { return (_intersection(pgn1, pgn2, out, tr)); } template inline OutputIterator intersection (const General_polygon_with_holes_2 >& pgn1, const General_polygon_2& pgn2, OutputIterator out) { return (_intersection(pgn1, pgn2, out)); } template inline OutputIterator intersection (const General_polygon_with_holes_2 >& pgn1, const General_polygon_2& pgn2, OutputIterator out, Traits& tr) { return (_intersection(pgn1, pgn2, out, tr)); } template inline OutputIterator intersection (const General_polygon_with_holes_2& pgn1, const General_polygon_with_holes_2& pgn2, OutputIterator out) { return (_intersection(pgn1, pgn2, out)); } template inline OutputIterator intersection (const General_polygon_with_holes_2& pgn1, const General_polygon_with_holes_2& pgn2, OutputIterator out, Traits& tr) { return (_intersection(pgn1, pgn2, out, tr)); } //@} /// \name _join() functions. //@{ template inline bool join (const Polygon_2& pgn1, const Polygon_2& pgn2, Polygon_with_holes_2& res) { return (_join(pgn1, pgn2, res)); } template inline bool join (const Polygon_2& pgn1, const Polygon_2& pgn2, Polygon_with_holes_2& res, Traits& tr) { return (_join(pgn1, pgn2, res, tr)); } template inline bool join (const Polygon_2& pgn1, const Polygon_with_holes_2& pgn2, Polygon_with_holes_2& res) { return (_join(pgn1, pgn2, res)); } template inline bool join (const Polygon_2& pgn1, const Polygon_with_holes_2& pgn2, Polygon_with_holes_2& res, Traits& tr) { return (_join(pgn1, pgn2, res, tr)); } template inline bool join (const Polygon_with_holes_2& pgn1, const Polygon_2& pgn2, Polygon_with_holes_2& res ) { return (_join(pgn1, pgn2, res)); } template inline bool join (const Polygon_with_holes_2& pgn1, const Polygon_2& pgn2, Polygon_with_holes_2& res, Traits& tr) { return (_join(pgn1, pgn2, res, tr)); } template inline bool join (const Polygon_with_holes_2& pgn1, const Polygon_with_holes_2& pgn2, Polygon_with_holes_2& res ) { return (_join(pgn1, pgn2, res)); } template inline bool join (const Polygon_with_holes_2& pgn1, const Polygon_with_holes_2& pgn2, Polygon_with_holes_2& res, Traits& tr) { return (_join(pgn1, pgn2, res, tr)); } template inline bool join (const General_polygon_2& pgn1, const General_polygon_2& pgn2, General_polygon_with_holes_2 >& res) { return (_join(pgn1, pgn2, res)); } template inline bool join (const General_polygon_2& pgn1, const General_polygon_2& pgn2, General_polygon_with_holes_2 >& res, Traits& tr) { return (_join(pgn1, pgn2, res, tr)); } template inline bool join (const General_polygon_2& pgn1, const General_polygon_with_holes_2 >& pgn2, General_polygon_with_holes_2 >& res) { return (_join(pgn1, pgn2, res)); } template inline bool join (const General_polygon_2& pgn1, const General_polygon_with_holes_2 >& pgn2, General_polygon_with_holes_2 >& res, Traits& tr) { return (_join(pgn1, pgn2, res, tr)); } template inline bool join (const General_polygon_with_holes_2 >& pgn1, const General_polygon_2& pgn2, General_polygon_with_holes_2 >& res) { return (_join(pgn1, pgn2, res)); } template inline bool join (const General_polygon_with_holes_2 >& pgn1, const General_polygon_2& pgn2, General_polygon_with_holes_2 >& res, Traits& tr) { return (_join(pgn1, pgn2, res, tr)); } template inline bool join (const General_polygon_with_holes_2& pgn1, const General_polygon_with_holes_2& pgn2, General_polygon_with_holes_2& res) { return (_join(pgn1, pgn2, res)); } template inline bool join (const General_polygon_with_holes_2& pgn1, const General_polygon_with_holes_2& pgn2, General_polygon_with_holes_2& res, Traits& tr) { return (_join(pgn1, pgn2, res, tr)); } //@} /// \name difference() functions. //@{ template inline OutputIterator difference (const Polygon_2& pgn1, const Polygon_2& pgn2, OutputIterator oi) { return(_difference(pgn1, pgn2, oi)); } template inline OutputIterator difference (const Polygon_2& pgn1, const Polygon_2& pgn2, OutputIterator oi, Traits& tr) { return(_difference(pgn1, pgn2, oi, tr)); } template inline OutputIterator difference (const Polygon_2& pgn1, const Polygon_with_holes_2& pgn2, OutputIterator oi) { return(_difference(pgn1, pgn2, oi)); } template inline OutputIterator difference (const Polygon_2& pgn1, const Polygon_with_holes_2& pgn2, OutputIterator oi, Traits& tr) { return(_difference(pgn1, pgn2, oi, tr)); } template inline OutputIterator difference (const Polygon_with_holes_2& pgn1, const Polygon_2& pgn2, OutputIterator oi) { return (_difference(pgn1, pgn2, oi)); } template inline OutputIterator difference (const Polygon_with_holes_2& pgn1, const Polygon_2& pgn2, OutputIterator oi, Traits& tr) { return (_difference(pgn1, pgn2, oi, tr)); } template inline OutputIterator difference (const Polygon_with_holes_2& pgn1, const Polygon_with_holes_2& pgn2, OutputIterator oi) { return (_difference(pgn1, pgn2, oi)); } template inline OutputIterator difference (const Polygon_with_holes_2& pgn1, const Polygon_with_holes_2& pgn2, OutputIterator oi, Traits& tr) { return (_difference(pgn1, pgn2, oi, tr)); } template inline OutputIterator difference (const General_polygon_2& pgn1, const General_polygon_2& pgn2, OutputIterator oi) { return (_difference(pgn1, pgn2, oi)); } template inline OutputIterator difference (const General_polygon_2& pgn1, const General_polygon_2& pgn2, OutputIterator oi, Traits& tr) { return (_difference(pgn1, pgn2, oi, tr)); } template inline OutputIterator difference (const General_polygon_2& pgn1, const General_polygon_with_holes_2 >& pgn2, OutputIterator oi) { return (_difference(pgn1, pgn2, oi)); } template inline OutputIterator difference (const General_polygon_2& pgn1, const General_polygon_with_holes_2 >& pgn2, OutputIterator oi, Traits& tr) { return (_difference(pgn1, pgn2, oi, tr)); } template inline OutputIterator difference (const General_polygon_with_holes_2 >& pgn1, const General_polygon_2& pgn2, OutputIterator oi) { return (_difference(pgn1, pgn2, oi)); } template inline OutputIterator difference (const General_polygon_with_holes_2 >& pgn1, const General_polygon_2& pgn2, OutputIterator oi, Traits& tr) { return (_difference(pgn1, pgn2, oi, tr)); } template inline OutputIterator difference (const General_polygon_with_holes_2& pgn1, const General_polygon_with_holes_2& pgn2, OutputIterator oi) { return (_difference(pgn1, pgn2, oi)); } template inline OutputIterator difference (const General_polygon_with_holes_2& pgn1, const General_polygon_with_holes_2& pgn2, OutputIterator oi, Traits& tr) { return (_difference(pgn1, pgn2, oi, tr)); } //@} /// \name symmetric_difference() functions. //@{ template inline OutputIterator symmetric_difference (const Polygon_2& pgn1, const Polygon_2& pgn2, OutputIterator oi, Traits& tr) { return (_symmetric_difference(pgn1, pgn2, oi, tr)); } template inline OutputIterator symmetric_difference (const Polygon_2& pgn1, const Polygon_2& pgn2, OutputIterator oi) { return (_symmetric_difference(pgn1, pgn2, oi)); } template inline OutputIterator symmetric_difference (const Polygon_2& pgn1, const Polygon_with_holes_2& pgn2, OutputIterator oi, Traits& tr) { return (_symmetric_difference(pgn1, pgn2, oi, tr)); } template inline OutputIterator symmetric_difference (const Polygon_2& pgn1, const Polygon_with_holes_2& pgn2, OutputIterator oi) { return (_symmetric_difference(pgn1, pgn2, oi)); } template inline OutputIterator symmetric_difference (const Polygon_with_holes_2& pgn1, const Polygon_2& pgn2, OutputIterator oi, Traits& tr) { return (_symmetric_difference(pgn1, pgn2, oi, tr)); } template inline OutputIterator symmetric_difference (const Polygon_with_holes_2& pgn1, const Polygon_2& pgn2, OutputIterator oi) { return (_symmetric_difference(pgn1, pgn2, oi)); } template inline OutputIterator symmetric_difference (const Polygon_with_holes_2& pgn1, const Polygon_with_holes_2& pgn2, OutputIterator oi, Traits& tr) { return (_symmetric_difference(pgn1, pgn2, oi, tr)); } template inline OutputIterator symmetric_difference (const Polygon_with_holes_2& pgn1, const Polygon_with_holes_2& pgn2, OutputIterator oi) { return (_symmetric_difference(pgn1, pgn2, oi)); } template inline OutputIterator symmetric_difference (const General_polygon_2& pgn1, const General_polygon_2& pgn2, OutputIterator oi, Traits& tr) { return (_symmetric_difference(pgn1, pgn2, oi, tr)); } template inline OutputIterator symmetric_difference (const General_polygon_2& pgn1, const General_polygon_2& pgn2, OutputIterator oi) { return (_symmetric_difference(pgn1, pgn2, oi)); } template inline OutputIterator symmetric_difference (const General_polygon_2& pgn1, const General_polygon_with_holes_2 >& pgn2, OutputIterator oi, Traits& tr) { return (_symmetric_difference(pgn1, pgn2, oi, tr)); } template inline OutputIterator symmetric_difference(const General_polygon_2& pgn1, const General_polygon_with_holes_2 >& pgn2, OutputIterator oi) { return (_symmetric_difference(pgn1, pgn2, oi)); } template inline OutputIterator symmetric_difference (const General_polygon_with_holes_2 >& pgn1, const General_polygon_2& pgn2, OutputIterator oi, Traits& tr) { return (_symmetric_difference(pgn1, pgn2, oi, tr)); } template inline OutputIterator symmetric_difference (const General_polygon_with_holes_2 >& pgn1, const General_polygon_2& pgn2, OutputIterator oi) { return (_symmetric_difference(pgn1, pgn2, oi)); } template inline OutputIterator symmetric_difference (const General_polygon_with_holes_2& pgn1, const General_polygon_with_holes_2& pgn2, OutputIterator oi, Traits& tr) { return (_symmetric_difference(pgn1, pgn2, oi, tr)); } template inline OutputIterator symmetric_difference (const General_polygon_with_holes_2& pgn1, const General_polygon_with_holes_2& pgn2, OutputIterator oi) { return (_symmetric_difference(pgn1, pgn2, oi)); } //@} /// \name complement() functions. //@{ template void complement (const Polygon_2& pgn, Polygon_with_holes_2& res) { _complement(pgn, res); } template void complement (const Polygon_2& pgn, Polygon_with_holes_2& res, Traits& tr) { _complement(pgn, res, tr); } template void complement (const General_polygon_2& pgn, General_polygon_with_holes_2 >& res) { _complement(pgn, res); } template void complement (const General_polygon_2& pgn, General_polygon_with_holes_2 >& res, Traits& tr) { _complement(pgn, res, tr); } template OutputIterator complement (const Polygon_with_holes_2& pgn, OutputIterator oi, Traits& tr) { General_polygon_set_2 gps(tr); gps.insert(pgn); gps.complement(); return (gps.polygons_with_holes(oi)); } template OutputIterator complement (const Polygon_with_holes_2& pgn, OutputIterator oi) { typename Gps_default_traits >::Traits tr; return (complement(pgn, oi, tr)); } template OutputIterator complement (const General_polygon_with_holes_2& pgn, OutputIterator oi, Traits& tr) { General_polygon_set_2 gps(tr); gps.insert(pgn); gps.complement(); return (gps.polygons_with_holes(oi)); } template OutputIterator complement (General_polygon_with_holes_2 >& pgn, OutputIterator oi) { typename Gps_default_traits >::Traits tr; return (complement(pgn, oi, tr)); } //@} /// \name Aggregated join() functions. //@{ template struct map_iterator_to_traits { typedef typename std::iterator_traits::value_type InputPolygon; typedef typename Gps_default_traits::Traits Traits; }; template inline OutputIterator join(InputIterator begin, InputIterator end, OutputIterator oi, Traits&, unsigned int k=5) { if (begin == end) return (oi); General_polygon_set_2 gps(*begin); gps.join(++begin, end, k); return (gps.polygons_with_holes(oi)); } template inline OutputIterator join(InputIterator begin, InputIterator end, OutputIterator oi, unsigned int k=5) { typename map_iterator_to_traits::Traits tr; return join(begin, end, oi, tr, k); } // Join two ranges of simple polygons and polygons with holes. template inline OutputIterator join(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2, InputIterator2 end2, OutputIterator oi, Traits& tr, unsigned int k=5) { if (begin1 == end1) return (join(begin2, end2, oi, tr, k)); General_polygon_set_2 gps(*begin1); gps.join(++begin1, end1, begin2, end2, k); return (gps.polygons_with_holes(oi)); } template inline OutputIterator join(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2, InputIterator2 end2, OutputIterator oi, unsigned int k=5) { typename map_iterator_to_traits::Traits tr; return join(begin1, end1, begin2, end2, oi, tr, k); } //@} /// \name Aggregated intersection() functions. //@{ template inline OutputIterator intersection (InputIterator begin, InputIterator end, OutputIterator oi, Traits&, unsigned int k=5) { if (begin == end) return (oi); General_polygon_set_2 gps(*begin); gps.intersection(++begin, end, k); return (gps.polygons_with_holes(oi)); } template inline OutputIterator intersection (InputIterator begin, InputIterator end, OutputIterator oi, unsigned int k=5, typename boost::enable_if< typename CGAL::is_iterator >::type* =0 // workaround to avoid ambiguous calls with kernel functions ) { typename map_iterator_to_traits::Traits tr; return intersection(begin, end, oi, tr, k); } // Inersect two ranges of simple polygons and polygons with holes. template inline OutputIterator intersection(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2, InputIterator2 end2, OutputIterator oi, Traits& tr, unsigned int k=5) { if (begin1 == end1) return (intersection(begin2, end2, oi, tr, k)); General_polygon_set_2 gps(*begin1); gps.intersection(++begin1, end1, begin2, end2, k); return (gps.polygons_with_holes(oi)); } template inline OutputIterator intersection(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2, InputIterator2 end2, OutputIterator oi, unsigned int k=5) { typename map_iterator_to_traits::Traits tr; return intersection(begin1, end1, begin2, end2, oi, tr, k); } //@} /// \name Aggregated symmetric_difference() functions. //@{ template inline OutputIterator symmetric_difference(InputIterator begin, InputIterator end, OutputIterator oi, Traits& tr, unsigned int k=5) { if (begin == end) return (oi); General_polygon_set_2 gps(tr); gps.insert(*begin); gps.symmetric_difference(++begin, end, k); return (gps.polygons_with_holes(oi)); } template inline OutputIterator symmetric_difference (InputIterator begin, InputIterator end, OutputIterator oi, unsigned int k=5) { typename map_iterator_to_traits::Traits tr; return symmetric_difference(begin, end, oi, tr, k); } // Xor two ranges of simple polygons and polygons with holes. template inline OutputIterator symmetric_difference (InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2, InputIterator2 end2, OutputIterator oi, Traits& tr, unsigned int k=5) { if (begin1 == end1) return (symmetric_difference(begin2, end2, oi, tr, k)); General_polygon_set_2 gps(tr); gps.insert(*begin1); gps.symmetric_difference(++begin1, end1, begin2, end2, k); return (gps.polygons_with_holes(oi)); } template inline OutputIterator symmetric_difference (InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2, InputIterator2 end2, OutputIterator oi, unsigned int k=5) { typename map_iterator_to_traits::Traits tr; return symmetric_difference(begin1, end1, begin2, end2, oi, tr, k); } //@} /// \name Aggregated do_intersect() functions. //@{ template inline bool do_intersect(InputIterator begin, InputIterator end, Traits& tr, unsigned int k=5) { if (begin == end) return false; General_polygon_set_2 gps(tr); gps.insert(*begin); return gps.do_intersect(++begin, end, k); } template inline bool do_intersect(InputIterator begin, InputIterator end, unsigned int k=5) { typename map_iterator_to_traits::Traits tr; return do_intersect(begin, end, tr, k); } template inline bool do_intersect (InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2, InputIterator2 end2, Traits& tr, unsigned int k=5) { if (begin1 == end1) return (do_intersect(begin2, end2, tr, k)); General_polygon_set_2 gps(tr); gps.insert(*begin1); return gps.do_intersect(++begin1, end1, begin2, end2, k); } template inline bool do_intersect (InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2, InputIterator2 end2, unsigned int k=5) { typename map_iterator_to_traits::Traits tr; return do_intersect(begin1, end1, begin2, end2, tr, k); } //@} /// \name oriented_side() functions. //@{ template inline Oriented_side oriented_side(const Polygon_2& pgn1, const Polygon_2& pgn2) { return (_oriented_side(pgn1, pgn2)); } template inline Oriented_side oriented_side(const Polygon_2& pgn1, const Polygon_2& pgn2, Traits& tr) { return (_oriented_side(pgn1, pgn2, tr)); } template inline Oriented_side oriented_side(const Polygon_2& pgn1, const Polygon_with_holes_2& pgn2) { return (_oriented_side(pgn1, pgn2)); } template inline Oriented_side oriented_side(const Polygon_2& pgn1, const Polygon_with_holes_2& pgn2, Traits& tr) { return (_oriented_side(pgn1, pgn2, tr)); } template inline Oriented_side oriented_side(const Polygon_with_holes_2& pgn1, const Polygon_2& pgn2) { return (_oriented_side(pgn1, pgn2)); } template inline Oriented_side oriented_side(const Polygon_with_holes_2& pgn1, const Polygon_2& pgn2, Traits& tr) { return (_oriented_side(pgn1, pgn2, tr)); } template inline Oriented_side oriented_side(const Polygon_with_holes_2& pgn1, const Polygon_with_holes_2& pgn2) { return (_oriented_side(pgn1, pgn2)); } template inline Oriented_side oriented_side(const Polygon_with_holes_2& pgn1, const Polygon_with_holes_2& pgn2, Traits& tr) { return (_oriented_side(pgn1, pgn2, tr)); } template inline Oriented_side oriented_side(const General_polygon_2& pgn1, const General_polygon_2& pgn2) { return (_oriented_side(pgn1, pgn2)); } template inline Oriented_side oriented_side(const General_polygon_2& pgn1, const General_polygon_2& pgn2, Gps_traits& tr) { return (_oriented_side(pgn1, pgn2, tr)); } template inline Oriented_side oriented_side(const General_polygon_2& pgn1, const General_polygon_with_holes_2 >& pgn2) { return (_oriented_side(pgn1, pgn2)); } template inline Oriented_side oriented_side(const General_polygon_2& pgn1, const General_polygon_with_holes_2 >& pgn2, Gps_traits& tr) { return (_oriented_side(pgn1, pgn2, tr)); } template inline Oriented_side oriented_side(const General_polygon_with_holes_2 >& pgn1, const General_polygon_2& pgn2) { return (_oriented_side(pgn1, pgn2)); } template inline Oriented_side oriented_side(const General_polygon_with_holes_2 >& pgn1, const General_polygon_2& pgn2, Gps_traits& tr) { return (_oriented_side(pgn1, pgn2, tr)); } template inline Oriented_side oriented_side(const General_polygon_with_holes_2& pgn1, const General_polygon_with_holes_2& pgn2) { return (_oriented_side(pgn1, pgn2)); } template inline Oriented_side oriented_side(const General_polygon_with_holes_2& pgn1, const General_polygon_with_holes_2& pgn2, Traits& tr) { return (_oriented_side(pgn1, pgn2, tr)); } // Point Query: template inline Oriented_side oriented_side(const typename Kernel::Point_2& p, const Polygon_2& pgn) { return (_oriented_side(p, pgn)); } template inline Oriented_side oriented_side(const typename Kernel::Point_2& p, const Polygon_2& pgn, Traits& tr) { return (_oriented_side(p, pgn, tr)); } template inline Oriented_side oriented_side(const typename Kernel::Point_2& p, const Polygon_with_holes_2& pgn) { return (_oriented_side(p, pgn)); } template inline Oriented_side oriented_side(const typename Kernel::Point_2& p, const Polygon_with_holes_2& pgn, Traits& tr) { return (_oriented_side(p, pgn, tr)); } template inline Oriented_side oriented_side(const typename Arr_traits::Point_2& p, const General_polygon_2& pgn) { return (_oriented_side(p, pgn)); } template inline Oriented_side oriented_side(const typename Arr_traits::Point_2& p, const General_polygon_2& pgn, Gps_traits& tr) { return (_oriented_side(p, pgn, tr)); } template inline Oriented_side oriented_side(const typename Polygon_::Point_2& p, const General_polygon_with_holes_2& pgn) { return (_oriented_side(p, pgn)); } template inline Oriented_side oriented_side(const typename Polygon_::Point_2& p, const General_polygon_with_holes_2& pgn, Traits& tr) { return (_oriented_side(p, pgn, tr)); } //@} } //namespace CGAL #include #endif