dust3d/thirdparty/cgal/CGAL-5.1/include/CGAL/Boolean_set_operations_2.h

1256 lines
42 KiB
C++

// 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 <baruchzu@post.tau.ac.il>
// Ron Wein <wein@post.tau.ac.il>
// Efi Fogel <efif@post.tau.ac.il>
#ifndef CGAL_BOOLEAN_SET_OPERATIONS_H
#define CGAL_BOOLEAN_SET_OPERATIONS_H
#include <CGAL/license/Boolean_set_operations_2.h>
#include <CGAL/disable_warnings.h>
#include <CGAL/Polygon_2.h>
#include <CGAL/Polygon_with_holes_2.h>
#include <CGAL/Gps_segment_traits_2.h>
#include <CGAL/General_polygon_set_2.h>
#include <CGAL/General_polygon_2.h>
#include <CGAL/General_polygon_with_holes_2.h>
#include <CGAL/Gps_traits_2.h>
#include <CGAL/iterator.h>
#include <CGAL/Boolean_set_operations_2/Bso_internal_functions.h>
#include <CGAL/is_iterator.h>
#include <boost/utility/enable_if.hpp>
namespace CGAL {
/// \name do_intersect() functions.
//@{
template <class Kernel, class Container>
inline bool do_intersect(const Polygon_2<Kernel, Container>& pgn1,
const Polygon_2<Kernel, Container>& pgn2)
{
return (_do_intersect(pgn1, pgn2));
}
template <class Kernel, class Container, class Traits>
inline bool do_intersect(const Polygon_2<Kernel, Container>& pgn1,
const Polygon_2<Kernel, Container>& pgn2,
Traits& tr)
{
return (_do_intersect(pgn1, pgn2, tr));
}
template <class Kernel, class Container>
inline bool do_intersect(const Polygon_2<Kernel, Container>& pgn1,
const Polygon_with_holes_2<Kernel, Container>& pgn2)
{
return (_do_intersect(pgn1, pgn2));
}
template <class Kernel, class Container, class Traits>
inline bool do_intersect(const Polygon_2<Kernel, Container>& pgn1,
const Polygon_with_holes_2<Kernel, Container>& pgn2,
Traits& tr)
{
return (_do_intersect(pgn1, pgn2, tr));
}
template <class Kernel, class Container>
inline bool do_intersect(const Polygon_with_holes_2<Kernel, Container>& pgn1,
const Polygon_2<Kernel, Container>& pgn2)
{
return (_do_intersect(pgn1, pgn2));
}
template <class Kernel, class Container, class Traits>
inline bool do_intersect(const Polygon_with_holes_2<Kernel, Container>& pgn1,
const Polygon_2<Kernel, Container>& pgn2,
Traits& tr)
{
return (_do_intersect(pgn1, pgn2, tr));
}
template <class Kernel, class Container>
inline bool do_intersect(const Polygon_with_holes_2<Kernel, Container>& pgn1,
const Polygon_with_holes_2<Kernel, Container>& pgn2)
{
return (_do_intersect(pgn1, pgn2));
}
template <class Kernel, class Container, class Traits>
inline bool do_intersect(const Polygon_with_holes_2<Kernel, Container>& pgn1,
const Polygon_with_holes_2<Kernel, Container>& pgn2,
Traits& tr)
{
return (_do_intersect(pgn1, pgn2, tr));
}
template <class Arr_traits>
inline bool do_intersect(const General_polygon_2<Arr_traits>& pgn1,
const General_polygon_2<Arr_traits>& pgn2)
{
return (_do_intersect(pgn1, pgn2));
}
template <class Arr_traits, class Gps_traits>
inline bool do_intersect(const General_polygon_2<Arr_traits>& pgn1,
const General_polygon_2<Arr_traits>& pgn2,
Gps_traits& tr)
{
return (_do_intersect(pgn1, pgn2, tr));
}
template <class Arr_traits>
inline bool do_intersect(const General_polygon_2<Arr_traits>& pgn1,
const General_polygon_with_holes_2
<General_polygon_2<Arr_traits> >& pgn2)
{
return (_do_intersect(pgn1, pgn2));
}
template <class Arr_traits, class Gps_traits>
inline bool do_intersect(const General_polygon_2<Arr_traits>& pgn1,
const General_polygon_with_holes_2
<General_polygon_2<Arr_traits> >& pgn2,
Gps_traits& tr)
{
return (_do_intersect(pgn1, pgn2, tr));
}
template <class Arr_traits>
inline bool do_intersect(const General_polygon_with_holes_2
<General_polygon_2<Arr_traits> >& pgn1,
const General_polygon_2<Arr_traits>& pgn2)
{
return (_do_intersect(pgn1, pgn2));
}
template <class Arr_traits, class Gps_traits>
inline bool do_intersect(const General_polygon_with_holes_2
<General_polygon_2<Arr_traits> >& pgn1,
const General_polygon_2<Arr_traits>& pgn2,
Gps_traits& tr)
{
return (_do_intersect(pgn1, pgn2, tr));
}
template <class Polygon_>
inline bool do_intersect(const General_polygon_with_holes_2<Polygon_>& pgn1,
const General_polygon_with_holes_2<Polygon_>& pgn2)
{
return (_do_intersect(pgn1, pgn2));
}
template <class Polygon_, class Traits>
inline bool do_intersect(const General_polygon_with_holes_2<Polygon_>& pgn1,
const General_polygon_with_holes_2<Polygon_>& pgn2,
Traits& tr)
{
return (_do_intersect(pgn1, pgn2, tr));
}
//@}
/// \name intersection() functions.
//@{
template <class Kernel, class Container, typename OutputIterator>
inline OutputIterator intersection(const Polygon_2<Kernel, Container>& pgn1,
const Polygon_2<Kernel, Container>& pgn2,
OutputIterator out)
{
return (_intersection(pgn1, pgn2, out));
}
template <class Kernel, class Container, typename OutputIterator, class Traits>
inline OutputIterator intersection(const Polygon_2<Kernel, Container>& pgn1,
const Polygon_2<Kernel, Container>& pgn2,
OutputIterator out,
Traits& tr)
{
return (_intersection(pgn1, pgn2, out, tr));
}
template <class Kernel, class Container, typename OutputIterator>
inline OutputIterator intersection(const Polygon_2<Kernel, Container>& pgn1,
const Polygon_with_holes_2<Kernel, Container>& pgn2,
OutputIterator out)
{
return (_intersection(pgn1, pgn2, out));
}
template <class Kernel, class Container, typename OutputIterator, class Traits>
inline OutputIterator
intersection (const Polygon_2<Kernel, Container>& pgn1,
const Polygon_with_holes_2<Kernel, Container>& pgn2,
OutputIterator out, Traits& tr)
{
return (_intersection(pgn1, pgn2, out, tr));
}
template <class Kernel, class Container, typename OutputIterator>
inline OutputIterator
intersection (const Polygon_with_holes_2<Kernel, Container>& pgn1,
const Polygon_2<Kernel, Container>& pgn2,
OutputIterator out)
{
return (_intersection(pgn1, pgn2, out));
}
template <class Kernel, class Container, typename OutputIterator, class Traits>
inline OutputIterator
intersection (const Polygon_with_holes_2<Kernel, Container>& pgn1,
const Polygon_2<Kernel, Container>& pgn2,
OutputIterator out, Traits& tr)
{
return (_intersection(pgn1, pgn2, out, tr));
}
template <class Kernel, class Container, typename OutputIterator>
inline OutputIterator
intersection (const Polygon_with_holes_2<Kernel, Container>& pgn1,
const Polygon_with_holes_2<Kernel, Container>& pgn2,
OutputIterator out)
{
return (_intersection(pgn1, pgn2, out));
}
template <class Kernel, class Container, typename OutputIterator, class Traits>
inline OutputIterator
intersection (const Polygon_with_holes_2<Kernel, Container>& pgn1,
const Polygon_with_holes_2<Kernel, Container>& pgn2,
OutputIterator out,
Traits& tr)
{
return (_intersection(pgn1, pgn2, out, tr));
}
template <class Arr_traits, typename OutputIterator>
inline OutputIterator intersection (const General_polygon_2<Arr_traits>& pgn1,
const General_polygon_2<Arr_traits>& pgn2,
OutputIterator out)
{
return (_intersection(pgn1, pgn2, out));
}
template <class Arr_traits, typename OutputIterator, class Traits>
inline OutputIterator intersection (const General_polygon_2<Arr_traits>& pgn1,
const General_polygon_2<Arr_traits>& pgn2,
OutputIterator out,
Traits& tr)
{
return (_intersection(pgn1, pgn2, out, tr));
}
template <class Arr_traits, typename OutputIterator>
inline OutputIterator
intersection (const General_polygon_2<Arr_traits>& pgn1,
const General_polygon_with_holes_2
<General_polygon_2<Arr_traits> >& pgn2,
OutputIterator out)
{
return (_intersection(pgn1, pgn2, out));
}
template <class Arr_traits, typename OutputIterator, class Traits>
inline OutputIterator
intersection (const General_polygon_2<Arr_traits>& pgn1,
const General_polygon_with_holes_2
<General_polygon_2<Arr_traits> >& pgn2,
OutputIterator out, Traits& tr)
{
return (_intersection(pgn1, pgn2, out, tr));
}
template <class Arr_traits, typename OutputIterator>
inline OutputIterator
intersection (const General_polygon_with_holes_2
<General_polygon_2<Arr_traits> >& pgn1,
const General_polygon_2<Arr_traits>& pgn2,
OutputIterator out)
{
return (_intersection(pgn1, pgn2, out));
}
template <class Arr_traits, typename OutputIterator, class Traits>
inline OutputIterator
intersection (const General_polygon_with_holes_2
<General_polygon_2<Arr_traits> >& pgn1,
const General_polygon_2<Arr_traits>& pgn2,
OutputIterator out, Traits& tr)
{
return (_intersection(pgn1, pgn2, out, tr));
}
template <class Polygon_, typename OutputIterator>
inline OutputIterator
intersection (const General_polygon_with_holes_2<Polygon_>& pgn1,
const General_polygon_with_holes_2<Polygon_>& pgn2,
OutputIterator out)
{
return (_intersection(pgn1, pgn2, out));
}
template <class Polygon_, typename OutputIterator, class Traits>
inline OutputIterator
intersection (const General_polygon_with_holes_2<Polygon_>& pgn1,
const General_polygon_with_holes_2<Polygon_>& pgn2,
OutputIterator out, Traits& tr)
{
return (_intersection(pgn1, pgn2, out, tr));
}
//@}
/// \name _join() functions.
//@{
template <class Kernel, class Container>
inline bool join (const Polygon_2<Kernel, Container>& pgn1,
const Polygon_2<Kernel, Container>& pgn2,
Polygon_with_holes_2<Kernel, Container>& res)
{
return (_join(pgn1, pgn2, res));
}
template <class Kernel, class Container, class Traits>
inline bool join (const Polygon_2<Kernel, Container>& pgn1,
const Polygon_2<Kernel, Container>& pgn2,
Polygon_with_holes_2<Kernel, Container>& res, Traits& tr)
{
return (_join(pgn1, pgn2, res, tr));
}
template <class Kernel, class Container>
inline bool join (const Polygon_2<Kernel, Container>& pgn1,
const Polygon_with_holes_2<Kernel, Container>& pgn2,
Polygon_with_holes_2<Kernel, Container>& res)
{
return (_join(pgn1, pgn2, res));
}
template <class Kernel, class Container, class Traits>
inline bool join (const Polygon_2<Kernel, Container>& pgn1,
const Polygon_with_holes_2<Kernel, Container>& pgn2,
Polygon_with_holes_2<Kernel, Container>& res, Traits& tr)
{
return (_join(pgn1, pgn2, res, tr));
}
template <class Kernel, class Container>
inline bool join (const Polygon_with_holes_2<Kernel, Container>& pgn1,
const Polygon_2<Kernel, Container>& pgn2,
Polygon_with_holes_2<Kernel, Container>& res )
{
return (_join(pgn1, pgn2, res));
}
template <class Kernel, class Container, class Traits>
inline bool join (const Polygon_with_holes_2<Kernel, Container>& pgn1,
const Polygon_2<Kernel, Container>& pgn2,
Polygon_with_holes_2<Kernel, Container>& res, Traits& tr)
{
return (_join(pgn1, pgn2, res, tr));
}
template <class Kernel, class Container>
inline bool join (const Polygon_with_holes_2<Kernel, Container>& pgn1,
const Polygon_with_holes_2<Kernel, Container>& pgn2,
Polygon_with_holes_2<Kernel, Container>& res )
{
return (_join(pgn1, pgn2, res));
}
template <class Kernel, class Container, class Traits>
inline bool join (const Polygon_with_holes_2<Kernel, Container>& pgn1,
const Polygon_with_holes_2<Kernel, Container>& pgn2,
Polygon_with_holes_2<Kernel, Container>& res, Traits& tr)
{
return (_join(pgn1, pgn2, res, tr));
}
template <class Arr_traits>
inline bool
join (const General_polygon_2<Arr_traits>& pgn1,
const General_polygon_2<Arr_traits>& pgn2,
General_polygon_with_holes_2<General_polygon_2<Arr_traits> >& res)
{
return (_join(pgn1, pgn2, res));
}
template <class Arr_traits, class Traits>
inline bool
join (const General_polygon_2<Arr_traits>& pgn1,
const General_polygon_2<Arr_traits>& pgn2,
General_polygon_with_holes_2<General_polygon_2<Arr_traits> >& res,
Traits& tr)
{
return (_join(pgn1, pgn2, res, tr));
}
template <class Arr_traits>
inline bool
join (const General_polygon_2<Arr_traits>& pgn1,
const General_polygon_with_holes_2<General_polygon_2<Arr_traits> >& pgn2,
General_polygon_with_holes_2<General_polygon_2<Arr_traits> >& res)
{
return (_join(pgn1, pgn2, res));
}
template <class Arr_traits, class Traits>
inline bool
join (const General_polygon_2<Arr_traits>& pgn1,
const General_polygon_with_holes_2<General_polygon_2<Arr_traits> >& pgn2,
General_polygon_with_holes_2<General_polygon_2<Arr_traits> >& res,
Traits& tr)
{
return (_join(pgn1, pgn2, res, tr));
}
template <class Arr_traits>
inline bool
join (const General_polygon_with_holes_2<General_polygon_2<Arr_traits> >& pgn1,
const General_polygon_2<Arr_traits>& pgn2,
General_polygon_with_holes_2<General_polygon_2<Arr_traits> >& res)
{
return (_join(pgn1, pgn2, res));
}
template <class Arr_traits, class Traits>
inline bool
join (const General_polygon_with_holes_2<General_polygon_2<Arr_traits> >& pgn1,
const General_polygon_2<Arr_traits>& pgn2,
General_polygon_with_holes_2<General_polygon_2<Arr_traits> >& res,
Traits& tr)
{
return (_join(pgn1, pgn2, res, tr));
}
template <class Polygon_>
inline bool join (const General_polygon_with_holes_2<Polygon_>& pgn1,
const General_polygon_with_holes_2<Polygon_>& pgn2,
General_polygon_with_holes_2<Polygon_>& res)
{
return (_join(pgn1, pgn2, res));
}
template <class Polygon_, class Traits>
inline bool join (const General_polygon_with_holes_2<Polygon_>& pgn1,
const General_polygon_with_holes_2<Polygon_>& pgn2,
General_polygon_with_holes_2<Polygon_>& res, Traits& tr)
{
return (_join(pgn1, pgn2, res, tr));
}
//@}
/// \name difference() functions.
//@{
template <class Kernel, class Container, typename OutputIterator>
inline OutputIterator difference (const Polygon_2<Kernel, Container>& pgn1,
const Polygon_2<Kernel, Container>& pgn2,
OutputIterator oi)
{
return(_difference(pgn1, pgn2, oi));
}
template <class Kernel, class Container, typename OutputIterator, class Traits>
inline OutputIterator difference (const Polygon_2<Kernel, Container>& pgn1,
const Polygon_2<Kernel, Container>& pgn2,
OutputIterator oi, Traits& tr)
{
return(_difference(pgn1, pgn2, oi, tr));
}
template <class Kernel, class Container, typename OutputIterator>
inline OutputIterator
difference (const Polygon_2<Kernel, Container>& pgn1,
const Polygon_with_holes_2<Kernel, Container>& pgn2,
OutputIterator oi)
{
return(_difference(pgn1, pgn2, oi));
}
template <class Kernel, class Container, typename OutputIterator, class Traits>
inline OutputIterator
difference (const Polygon_2<Kernel, Container>& pgn1,
const Polygon_with_holes_2<Kernel, Container>& pgn2,
OutputIterator oi, Traits& tr)
{
return(_difference(pgn1, pgn2, oi, tr));
}
template <class Kernel, class Container, typename OutputIterator>
inline OutputIterator
difference (const Polygon_with_holes_2<Kernel, Container>& pgn1,
const Polygon_2<Kernel, Container>& pgn2,
OutputIterator oi)
{
return (_difference(pgn1, pgn2, oi));
}
template <class Kernel, class Container, typename OutputIterator, class Traits>
inline OutputIterator
difference (const Polygon_with_holes_2<Kernel, Container>& pgn1,
const Polygon_2<Kernel, Container>& pgn2,
OutputIterator oi,
Traits& tr)
{
return (_difference(pgn1, pgn2, oi, tr));
}
template <class Kernel, class Container, typename OutputIterator>
inline OutputIterator
difference (const Polygon_with_holes_2<Kernel, Container>& pgn1,
const Polygon_with_holes_2<Kernel, Container>& pgn2,
OutputIterator oi)
{
return (_difference(pgn1, pgn2, oi));
}
template <class Kernel, class Container, typename OutputIterator, class Traits>
inline OutputIterator
difference (const Polygon_with_holes_2<Kernel, Container>& pgn1,
const Polygon_with_holes_2<Kernel, Container>& pgn2,
OutputIterator oi, Traits& tr)
{
return (_difference(pgn1, pgn2, oi, tr));
}
template <class Arr_traits, typename OutputIterator>
inline OutputIterator difference (const General_polygon_2<Arr_traits>& pgn1,
const General_polygon_2<Arr_traits>& pgn2,
OutputIterator oi)
{
return (_difference(pgn1, pgn2, oi));
}
template <class Arr_traits, typename OutputIterator, class Traits>
inline OutputIterator difference (const General_polygon_2<Arr_traits>& pgn1,
const General_polygon_2<Arr_traits>& pgn2,
OutputIterator oi,
Traits& tr)
{
return (_difference(pgn1, pgn2, oi, tr));
}
template <class Arr_traits, typename OutputIterator>
inline OutputIterator difference (const General_polygon_2<Arr_traits>& pgn1,
const General_polygon_with_holes_2
<General_polygon_2<Arr_traits> >& pgn2,
OutputIterator oi)
{
return (_difference(pgn1, pgn2, oi));
}
template <class Arr_traits, typename OutputIterator, class Traits>
inline OutputIterator difference (const General_polygon_2<Arr_traits>& pgn1,
const General_polygon_with_holes_2
<General_polygon_2<Arr_traits> >& pgn2,
OutputIterator oi, Traits& tr)
{
return (_difference(pgn1, pgn2, oi, tr));
}
template <class Arr_traits, typename OutputIterator>
inline OutputIterator difference (const General_polygon_with_holes_2
<General_polygon_2<Arr_traits> >& pgn1,
const General_polygon_2<Arr_traits>& pgn2,
OutputIterator oi)
{
return (_difference(pgn1, pgn2, oi));
}
template <class Arr_traits, typename OutputIterator, class Traits>
inline OutputIterator difference (const General_polygon_with_holes_2
<General_polygon_2<Arr_traits> >& pgn1,
const General_polygon_2<Arr_traits>& pgn2,
OutputIterator oi, Traits& tr)
{
return (_difference(pgn1, pgn2, oi, tr));
}
template <class Polygon_, typename OutputIterator>
inline OutputIterator
difference (const General_polygon_with_holes_2<Polygon_>& pgn1,
const General_polygon_with_holes_2<Polygon_>& pgn2,
OutputIterator oi)
{
return (_difference(pgn1, pgn2, oi));
}
template <class Polygon_, typename OutputIterator, class Traits>
inline OutputIterator
difference (const General_polygon_with_holes_2<Polygon_>& pgn1,
const General_polygon_with_holes_2<Polygon_>& pgn2,
OutputIterator oi, Traits& tr)
{
return (_difference(pgn1, pgn2, oi, tr));
}
//@}
/// \name symmetric_difference() functions.
//@{
template <class Kernel, class Container, typename OutputIterator, class Traits>
inline OutputIterator
symmetric_difference (const Polygon_2<Kernel, Container>& pgn1,
const Polygon_2<Kernel, Container>& pgn2,
OutputIterator oi, Traits& tr)
{
return (_symmetric_difference(pgn1, pgn2, oi, tr));
}
template <class Kernel, class Container, typename OutputIterator>
inline OutputIterator
symmetric_difference (const Polygon_2<Kernel, Container>& pgn1,
const Polygon_2<Kernel, Container>& pgn2,
OutputIterator oi)
{
return (_symmetric_difference(pgn1, pgn2, oi));
}
template <class Kernel, class Container, typename OutputIterator, class Traits>
inline OutputIterator
symmetric_difference (const Polygon_2<Kernel, Container>& pgn1,
const Polygon_with_holes_2<Kernel, Container>& pgn2,
OutputIterator oi, Traits& tr)
{
return (_symmetric_difference(pgn1, pgn2, oi, tr));
}
template <class Kernel, class Container, typename OutputIterator>
inline OutputIterator
symmetric_difference (const Polygon_2<Kernel, Container>& pgn1,
const Polygon_with_holes_2<Kernel, Container>& pgn2,
OutputIterator oi)
{
return (_symmetric_difference(pgn1, pgn2, oi));
}
template <class Kernel, class Container, typename OutputIterator, class Traits>
inline OutputIterator
symmetric_difference (const Polygon_with_holes_2<Kernel, Container>& pgn1,
const Polygon_2<Kernel, Container>& pgn2,
OutputIterator oi, Traits& tr)
{
return (_symmetric_difference(pgn1, pgn2, oi, tr));
}
template <class Kernel, class Container, typename OutputIterator>
inline OutputIterator
symmetric_difference (const Polygon_with_holes_2<Kernel, Container>& pgn1,
const Polygon_2<Kernel, Container>& pgn2,
OutputIterator oi)
{
return (_symmetric_difference(pgn1, pgn2, oi));
}
template <class Kernel, class Container, typename OutputIterator, class Traits>
inline OutputIterator
symmetric_difference (const Polygon_with_holes_2<Kernel, Container>& pgn1,
const Polygon_with_holes_2<Kernel, Container>& pgn2,
OutputIterator oi, Traits& tr)
{
return (_symmetric_difference(pgn1, pgn2, oi, tr));
}
template <class Kernel, class Container, typename OutputIterator>
inline OutputIterator
symmetric_difference (const Polygon_with_holes_2<Kernel, Container>& pgn1,
const Polygon_with_holes_2<Kernel, Container>& pgn2,
OutputIterator oi)
{
return (_symmetric_difference(pgn1, pgn2, oi));
}
template <class Arr_traits, typename OutputIterator, class Traits>
inline OutputIterator
symmetric_difference (const General_polygon_2<Arr_traits>& pgn1,
const General_polygon_2<Arr_traits>& pgn2,
OutputIterator oi,
Traits& tr)
{
return (_symmetric_difference(pgn1, pgn2, oi, tr));
}
template <class Arr_traits, typename OutputIterator>
inline OutputIterator
symmetric_difference (const General_polygon_2<Arr_traits>& pgn1,
const General_polygon_2<Arr_traits>& pgn2,
OutputIterator oi)
{
return (_symmetric_difference(pgn1, pgn2, oi));
}
template <class Arr_traits, typename OutputIterator, class Traits>
inline OutputIterator
symmetric_difference (const General_polygon_2<Arr_traits>& pgn1,
const General_polygon_with_holes_2
<General_polygon_2<Arr_traits> >& pgn2,
OutputIterator oi, Traits& tr)
{
return (_symmetric_difference(pgn1, pgn2, oi, tr));
}
template <class Arr_traits, typename OutputIterator>
inline OutputIterator
symmetric_difference(const General_polygon_2<Arr_traits>& pgn1,
const General_polygon_with_holes_2
<General_polygon_2<Arr_traits> >& pgn2,
OutputIterator oi)
{
return (_symmetric_difference(pgn1, pgn2, oi));
}
template <class Arr_traits, typename OutputIterator, class Traits>
inline OutputIterator
symmetric_difference (const General_polygon_with_holes_2
<General_polygon_2<Arr_traits> >& pgn1,
const General_polygon_2<Arr_traits>& pgn2,
OutputIterator oi, Traits& tr)
{
return (_symmetric_difference(pgn1, pgn2, oi, tr));
}
template <class Arr_traits, typename OutputIterator>
inline OutputIterator
symmetric_difference (const General_polygon_with_holes_2
<General_polygon_2<Arr_traits> >& pgn1,
const General_polygon_2<Arr_traits>& pgn2,
OutputIterator oi)
{
return (_symmetric_difference(pgn1, pgn2, oi));
}
template <class Polygon_, typename OutputIterator, class Traits>
inline OutputIterator
symmetric_difference (const General_polygon_with_holes_2<Polygon_>& pgn1,
const General_polygon_with_holes_2<Polygon_>& pgn2,
OutputIterator oi,
Traits& tr)
{
return (_symmetric_difference(pgn1, pgn2, oi, tr));
}
template <class Polygon_, typename OutputIterator>
inline OutputIterator
symmetric_difference (const General_polygon_with_holes_2<Polygon_>& pgn1,
const General_polygon_with_holes_2<Polygon_>& pgn2,
OutputIterator oi)
{
return (_symmetric_difference(pgn1, pgn2, oi));
}
//@}
/// \name complement() functions.
//@{
template <class Kernel, class Container>
void complement (const Polygon_2<Kernel, Container>& pgn,
Polygon_with_holes_2<Kernel, Container>& res)
{
_complement(pgn, res);
}
template <class Kernel, class Container, class Traits>
void complement (const Polygon_2<Kernel, Container>& pgn,
Polygon_with_holes_2<Kernel, Container>& res,
Traits& tr)
{
_complement(pgn, res, tr);
}
template <class Arr_traits>
void complement (const General_polygon_2<Arr_traits>& pgn,
General_polygon_with_holes_2
<General_polygon_2<Arr_traits> >& res)
{
_complement(pgn, res);
}
template <class Arr_traits, class Traits>
void complement (const General_polygon_2<Arr_traits>& pgn,
General_polygon_with_holes_2
<General_polygon_2<Arr_traits> >& res,
Traits& tr)
{
_complement(pgn, res, tr);
}
template <class Kernel, class Container, typename OutputIterator, class Traits>
OutputIterator complement (const Polygon_with_holes_2<Kernel, Container>& pgn,
OutputIterator oi, Traits& tr)
{
General_polygon_set_2<Traits> gps(tr);
gps.insert(pgn);
gps.complement();
return (gps.polygons_with_holes(oi));
}
template <class Kernel, class Container, typename OutputIterator>
OutputIterator complement (const Polygon_with_holes_2<Kernel, Container>& pgn,
OutputIterator oi)
{
typename Gps_default_traits<Polygon_2<Kernel, Container> >::Traits tr;
return (complement(pgn, oi, tr));
}
template <class Arr_traits, typename OutputIterator, class Traits>
OutputIterator complement (const General_polygon_with_holes_2<Arr_traits>& pgn,
OutputIterator oi, Traits& tr)
{
General_polygon_set_2<Traits> gps(tr);
gps.insert(pgn);
gps.complement();
return (gps.polygons_with_holes(oi));
}
template <class Arr_traits, typename OutputIterator>
OutputIterator complement (General_polygon_with_holes_2
<General_polygon_2<Arr_traits> >& pgn,
OutputIterator oi)
{
typename Gps_default_traits<General_polygon_2<Arr_traits> >::Traits tr;
return (complement(pgn, oi, tr));
}
//@}
/// \name Aggregated join() functions.
//@{
template <typename InputIterator>
struct map_iterator_to_traits
{
typedef typename std::iterator_traits<InputIterator>::value_type InputPolygon;
typedef typename Gps_default_traits<InputPolygon>::Traits Traits;
};
template <typename InputIterator, typename OutputIterator, class Traits>
inline OutputIterator join(InputIterator begin, InputIterator end,
OutputIterator oi, Traits&, unsigned int k=5)
{
if (begin == end)
return (oi);
General_polygon_set_2<Traits> gps(*begin);
gps.join(++begin, end, k);
return (gps.polygons_with_holes(oi));
}
template <typename InputIterator, typename OutputIterator>
inline OutputIterator join(InputIterator begin, InputIterator end,
OutputIterator oi, unsigned int k=5)
{
typename map_iterator_to_traits<InputIterator>::Traits tr;
return join(begin, end, oi, tr, k);
}
// Join two ranges of simple polygons and polygons with holes.
template <typename InputIterator1, typename InputIterator2,
typename OutputIterator, class Traits>
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<Traits> gps(*begin1);
gps.join(++begin1, end1, begin2, end2, k);
return (gps.polygons_with_holes(oi));
}
template <typename InputIterator1, typename InputIterator2,
typename OutputIterator>
inline OutputIterator join(InputIterator1 begin1, InputIterator1 end1,
InputIterator2 begin2, InputIterator2 end2,
OutputIterator oi, unsigned int k=5)
{
typename map_iterator_to_traits<InputIterator1>::Traits tr;
return join(begin1, end1, begin2, end2, oi, tr, k);
}
//@}
/// \name Aggregated intersection() functions.
//@{
template <typename InputIterator, typename OutputIterator, class Traits>
inline OutputIterator intersection (InputIterator begin, InputIterator end,
OutputIterator oi, Traits&, unsigned int k=5)
{
if (begin == end)
return (oi);
General_polygon_set_2<Traits> gps(*begin);
gps.intersection(++begin, end, k);
return (gps.polygons_with_holes(oi));
}
template <typename InputIterator, typename OutputIterator>
inline OutputIterator intersection (InputIterator begin, InputIterator end,
OutputIterator oi, unsigned int k=5,
typename boost::enable_if<
typename CGAL::is_iterator<InputIterator>
>::type* =0 // workaround to avoid ambiguous calls with kernel functions
)
{
typename map_iterator_to_traits<InputIterator>::Traits tr;
return intersection(begin, end, oi, tr, k);
}
// Inersect two ranges of simple polygons and polygons with holes.
template <typename InputIterator1, typename InputIterator2,
typename OutputIterator, class Traits>
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<Traits> gps(*begin1);
gps.intersection(++begin1, end1, begin2, end2, k);
return (gps.polygons_with_holes(oi));
}
template <typename InputIterator1, typename InputIterator2,
typename OutputIterator>
inline OutputIterator intersection(InputIterator1 begin1, InputIterator1 end1,
InputIterator2 begin2, InputIterator2 end2,
OutputIterator oi, unsigned int k=5)
{
typename map_iterator_to_traits<InputIterator1>::Traits tr;
return intersection(begin1, end1, begin2, end2, oi, tr, k);
}
//@}
/// \name Aggregated symmetric_difference() functions.
//@{
template <typename InputIterator, typename OutputIterator, class Traits>
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<Traits> gps(tr);
gps.insert(*begin);
gps.symmetric_difference(++begin, end, k);
return (gps.polygons_with_holes(oi));
}
template <typename InputIterator, typename OutputIterator>
inline
OutputIterator symmetric_difference (InputIterator begin, InputIterator end,
OutputIterator oi, unsigned int k=5)
{
typename map_iterator_to_traits<InputIterator>::Traits tr;
return symmetric_difference(begin, end, oi, tr, k);
}
// Xor two ranges of simple polygons and polygons with holes.
template <typename InputIterator1, typename InputIterator2,
typename OutputIterator, class Traits>
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<Traits> gps(tr);
gps.insert(*begin1);
gps.symmetric_difference(++begin1, end1, begin2, end2, k);
return (gps.polygons_with_holes(oi));
}
template <typename InputIterator1, typename InputIterator2,
typename OutputIterator>
inline
OutputIterator symmetric_difference (InputIterator1 begin1, InputIterator1 end1,
InputIterator2 begin2, InputIterator2 end2,
OutputIterator oi, unsigned int k=5)
{
typename map_iterator_to_traits<InputIterator1>::Traits tr;
return symmetric_difference(begin1, end1, begin2, end2, oi, tr, k);
}
//@}
/// \name Aggregated do_intersect() functions.
//@{
template <typename InputIterator, class Traits>
inline bool do_intersect(InputIterator begin, InputIterator end, Traits& tr,
unsigned int k=5)
{
if (begin == end)
return false;
General_polygon_set_2<Traits> gps(tr);
gps.insert(*begin);
return gps.do_intersect(++begin, end, k);
}
template <typename InputIterator>
inline bool do_intersect(InputIterator begin, InputIterator end,
unsigned int k=5)
{
typename map_iterator_to_traits<InputIterator>::Traits tr;
return do_intersect(begin, end, tr, k);
}
template <typename InputIterator1, typename InputIterator2, class Traits>
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<Traits> gps(tr);
gps.insert(*begin1);
return gps.do_intersect(++begin1, end1, begin2, end2, k);
}
template <typename InputIterator1, typename InputIterator2>
inline bool do_intersect (InputIterator1 begin1, InputIterator1 end1,
InputIterator2 begin2, InputIterator2 end2,
unsigned int k=5)
{
typename map_iterator_to_traits<InputIterator1>::Traits tr;
return do_intersect(begin1, end1, begin2, end2, tr, k);
}
//@}
/// \name oriented_side() functions.
//@{
template <class Kernel, class Container>
inline Oriented_side oriented_side(const Polygon_2<Kernel, Container>& pgn1,
const Polygon_2<Kernel, Container>& pgn2)
{
return (_oriented_side(pgn1, pgn2));
}
template <class Kernel, class Container, class Traits>
inline Oriented_side oriented_side(const Polygon_2<Kernel, Container>& pgn1,
const Polygon_2<Kernel, Container>& pgn2,
Traits& tr)
{
return (_oriented_side(pgn1, pgn2, tr));
}
template <class Kernel, class Container>
inline
Oriented_side oriented_side(const Polygon_2<Kernel, Container>& pgn1,
const Polygon_with_holes_2<Kernel, Container>& pgn2)
{
return (_oriented_side(pgn1, pgn2));
}
template <class Kernel, class Container, class Traits>
inline
Oriented_side oriented_side(const Polygon_2<Kernel, Container>& pgn1,
const Polygon_with_holes_2<Kernel, Container>& pgn2,
Traits& tr)
{
return (_oriented_side(pgn1, pgn2, tr));
}
template <class Kernel, class Container>
inline
Oriented_side oriented_side(const Polygon_with_holes_2<Kernel, Container>& pgn1,
const Polygon_2<Kernel, Container>& pgn2)
{
return (_oriented_side(pgn1, pgn2));
}
template <class Kernel, class Container, class Traits>
inline
Oriented_side oriented_side(const Polygon_with_holes_2<Kernel, Container>& pgn1,
const Polygon_2<Kernel, Container>& pgn2,
Traits& tr)
{
return (_oriented_side(pgn1, pgn2, tr));
}
template <class Kernel, class Container>
inline
Oriented_side oriented_side(const Polygon_with_holes_2<Kernel, Container>& pgn1,
const Polygon_with_holes_2<Kernel, Container>& pgn2)
{
return (_oriented_side(pgn1, pgn2));
}
template <class Kernel, class Container, class Traits>
inline
Oriented_side oriented_side(const Polygon_with_holes_2<Kernel, Container>& pgn1,
const Polygon_with_holes_2<Kernel, Container>& pgn2,
Traits& tr)
{
return (_oriented_side(pgn1, pgn2, tr));
}
template <class Arr_traits>
inline Oriented_side oriented_side(const General_polygon_2<Arr_traits>& pgn1,
const General_polygon_2<Arr_traits>& pgn2)
{
return (_oriented_side(pgn1, pgn2));
}
template <class Arr_traits, class Gps_traits>
inline Oriented_side oriented_side(const General_polygon_2<Arr_traits>& pgn1,
const General_polygon_2<Arr_traits>& pgn2,
Gps_traits& tr)
{
return (_oriented_side(pgn1, pgn2, tr));
}
template <class Arr_traits>
inline Oriented_side oriented_side(const General_polygon_2<Arr_traits>& pgn1,
const General_polygon_with_holes_2
<General_polygon_2<Arr_traits> >& pgn2)
{
return (_oriented_side(pgn1, pgn2));
}
template <class Arr_traits, class Gps_traits>
inline Oriented_side oriented_side(const General_polygon_2<Arr_traits>& pgn1,
const General_polygon_with_holes_2
<General_polygon_2<Arr_traits> >& pgn2,
Gps_traits& tr)
{
return (_oriented_side(pgn1, pgn2, tr));
}
template <class Arr_traits>
inline Oriented_side oriented_side(const General_polygon_with_holes_2
<General_polygon_2<Arr_traits> >& pgn1,
const General_polygon_2<Arr_traits>& pgn2)
{
return (_oriented_side(pgn1, pgn2));
}
template <class Arr_traits, class Gps_traits>
inline Oriented_side oriented_side(const General_polygon_with_holes_2
<General_polygon_2<Arr_traits> >& pgn1,
const General_polygon_2<Arr_traits>& pgn2,
Gps_traits& tr)
{
return (_oriented_side(pgn1, pgn2, tr));
}
template <class Polygon_>
inline
Oriented_side oriented_side(const General_polygon_with_holes_2<Polygon_>& pgn1,
const General_polygon_with_holes_2<Polygon_>& pgn2)
{
return (_oriented_side(pgn1, pgn2));
}
template <class Polygon_, class Traits>
inline
Oriented_side oriented_side(const General_polygon_with_holes_2<Polygon_>& pgn1,
const General_polygon_with_holes_2<Polygon_>& pgn2,
Traits& tr)
{
return (_oriented_side(pgn1, pgn2, tr));
}
// Point Query:
template <class Kernel, class Container>
inline Oriented_side oriented_side(const typename Kernel::Point_2& p,
const Polygon_2<Kernel, Container>& pgn)
{
return (_oriented_side(p, pgn));
}
template <class Kernel, class Container, class Traits>
inline Oriented_side oriented_side(const typename Kernel::Point_2& p,
const Polygon_2<Kernel, Container>& pgn,
Traits& tr)
{
return (_oriented_side(p, pgn, tr));
}
template <class Kernel, class Container>
inline
Oriented_side oriented_side(const typename Kernel::Point_2& p,
const Polygon_with_holes_2<Kernel, Container>& pgn)
{
return (_oriented_side(p, pgn));
}
template <class Kernel, class Container, class Traits>
inline
Oriented_side oriented_side(const typename Kernel::Point_2& p,
const Polygon_with_holes_2<Kernel, Container>& pgn,
Traits& tr)
{
return (_oriented_side(p, pgn, tr));
}
template <class Arr_traits>
inline Oriented_side oriented_side(const typename Arr_traits::Point_2& p,
const General_polygon_2<Arr_traits>& pgn)
{
return (_oriented_side(p, pgn));
}
template <class Arr_traits, class Gps_traits>
inline Oriented_side oriented_side(const typename Arr_traits::Point_2& p,
const General_polygon_2<Arr_traits>& pgn,
Gps_traits& tr)
{
return (_oriented_side(p, pgn, tr));
}
template <class Polygon_>
inline
Oriented_side oriented_side(const typename Polygon_::Point_2& p,
const General_polygon_with_holes_2<Polygon_>& pgn)
{
return (_oriented_side(p, pgn));
}
template <class Polygon_, class Traits>
inline
Oriented_side oriented_side(const typename Polygon_::Point_2& p,
const General_polygon_with_holes_2<Polygon_>& pgn,
Traits& tr)
{
return (_oriented_side(p, pgn, tr));
}
//@}
} //namespace CGAL
#include <CGAL/enable_warnings.h>
#endif