Separated the internal functions from the public global functions.

This commit is contained in:
Ron Wein 2006-02-09 09:59:33 +00:00
parent d2ac2bc0de
commit c683797c3b
2 changed files with 609 additions and 505 deletions

View File

@ -0,0 +1,210 @@
// Copyright (c) 2005 Tel-Aviv University (Israel).
// All rights reserved.
//
// This file is part of CGAL (www.cgal.org); you may redistribute it under
// the terms of the Q Public License version 1.0.
// See the file LICENSE.QPL distributed with CGAL.
//
// Licensees holding a valid commercial license may use this file in
// accordance with the commercial license agreement provided with the software.
//
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
//
// $Source$
// $Revision$ $Date$
// $Name$
//
// Author(s) : Baruch Zukerman <baruchzu@post.tau.ac.il>
// Ron Wein <wein@post.tau.ac.il>
#ifndef CGAL_BSO_INTERNAL_FUCNTIONS_H
#define CGAL_BSO_INTERNAL_FUNCTIONS_H
#include <CGAL/Boolean_set_operations_2/Gps_default_traits.h>
#include <iterator>
CGAL_BEGIN_NAMESPACE
/// \name _do_intersect() functions.
//@{
template <class Pgn1, class Pgn2, class Traits>
inline bool _do_intersect(const Pgn1& pgn1,
const Pgn2& pgn2,
Traits& tr)
{
General_polygon_set_2<Traits> gps(tr);
gps.insert(pgn1);
return (gps.do_intersect(pgn2));
}
template <class Pgn1, class Pgn2>
inline bool _do_intersect(const Pgn1& pgn1,
const Pgn2& pgn2)
{
typename Gps_default_traits<Pgn1>::Traits tr;
return (_do_intersect(pgn1, pgn2, tr));
}
//@}
/// \name _intersection() functions.
//@{
template <class Pgn1, class Pgn2, class OutputIterator, class Traits>
inline OutputIterator _intersection(const Pgn1& pgn1,
const Pgn2& pgn2,
OutputIterator out,
Traits& tr)
{
General_polygon_set_2<Traits> gps(tr);
gps.insert(pgn1);
gps.intersection(pgn2);
return (gps.polygons_with_holes(out));
}
template <class Pgn1, class Pgn2, class OutputIterator>
inline OutputIterator _intersection(const Pgn1& pgn1,
const Pgn2& pgn2,
OutputIterator out)
{
typedef typename Gps_default_traits<Pgn1>::Traits Traits;
Traits tr;
return (_intersection(pgn1, pgn2, out, tr));
}
//@}
/// \name _join() functions.
//@{
template <class Traits>
inline bool _is_empty (const typename Traits:: Polygon_2& pgn,
Traits& tr)
{
typedef typename Traits::Curve_const_iterator Curve_const_iterator;
const std::pair<Curve_const_iterator, Curve_const_iterator>& itr_pair =
tr.construct_curves_2_object()(pgn);
return (itr_pair.first == itr_pair.second);
}
template <class Traits>
inline bool _is_empty (const typename Traits::Polygon_with_holes_2& pgn,
Traits& tr)
{
return (false);
}
template <class Pgn1, class Pgn2, class Traits>
inline bool _join(const Pgn1& pgn1,
const Pgn2& pgn2,
typename Traits::Polygon_with_holes_2& res,
Traits& tr)
{
if (_is_empty(pgn1, tr) || _is_empty(pgn2, tr))
return (false);
General_polygon_set_2<Traits> gps(tr);
gps.insert(pgn1);
gps.join(pgn2);
if (gps.number_of_polygons_with_holes() == 1)
{
Oneset_iterator<typename Traits::Polygon_with_holes_2> oi (res);
gps.polygons_with_holes(oi);
return (true);
}
// the polygon doesnt intersect, the original pgn1, pgn2 contain the union
return (false);
}
template <class Pgn1, class Pgn2>
inline bool
_join(const Pgn1& pgn1,
const Pgn2& pgn2,
typename Gps_default_traits<Pgn1>::Traits::Polygon_with_holes_2& res)
{
typename Gps_default_traits<Pgn1>::Traits tr;
return (_join(pgn1, pgn2, res, tr));
}
//@}
/// \name _difference() functions.
//@{
template <class Pgn1, class Pgn2, class OutputIterator, class Traits>
inline OutputIterator _difference(const Pgn1& pgn1,
const Pgn2& pgn2,
OutputIterator oi,
Traits& tr)
{
General_polygon_set_2<Traits> gps(tr);
gps.insert(pgn1);
gps.difference(pgn2);
return (gps.polygons_with_holes(oi));
}
template <class Pgn1, class Pgn2, class OutputIterator>
inline OutputIterator _difference(const Pgn1& pgn1,
const Pgn2& pgn2,
OutputIterator oi)
{
typename Gps_default_traits<Pgn1>::Traits tr;
return(_difference(pgn1, pgn2, oi, tr));
}
//@}
/// \name _symmetric_difference() functions.
//@{
template <class Pgn1, class Pgn2, class OutputIterator, class Traits>
inline OutputIterator _symmetric_difference(const Pgn1& pgn1,
const Pgn2& pgn2,
OutputIterator oi,
Traits& tr)
{
General_polygon_set_2<Traits> gps(tr);
gps.insert(pgn1);
gps.symmetric_difference(pgn2);
return (gps.polygons_with_holes(oi));
}
template <class Pgn1, class Pgn2, class OutputIterator>
inline OutputIterator _symmetric_difference(const Pgn1& pgn1,
const Pgn2& pgn2,
OutputIterator oi)
{
typename Gps_default_traits<Pgn1>::Traits tr;
return (_symmetric_difference(pgn1, pgn2, oi, tr));
}
//@}
/// \name _complement() functions.
//@{
template <class Pgn, class Traits>
void _complement(const Pgn& pgn,
typename Traits::Polygon_with_holes_2& res,
Traits& tr)
{
General_polygon_set_2<Traits> gps(tr);
gps.insert(pgn);
gps.complement();
Oneset_iterator<typename Traits::Polygon_with_holes_2> oi(res);
gps.polygons_with_holes(oi);
}
template <class Pgn>
void _complement(const Pgn& pgn,
typename Gps_default_traits<Pgn>::Traits::
Polygon_with_holes_2& res)
{
typename Gps_default_traits<Pgn>::Traits tr;
_complement(pgn, res, tr);
}
//@}
CGAL_END_NAMESPACE
#endif