Added oriented_side()

This commit is contained in:
Efi Fogel 2010-03-01 15:57:02 +00:00
parent f8b36b92b8
commit 963381cbe7
2 changed files with 321 additions and 159 deletions

View File

@ -17,6 +17,7 @@
// //
// Author(s) : Baruch Zukerman <baruchzu@post.tau.ac.il> // Author(s) : Baruch Zukerman <baruchzu@post.tau.ac.il>
// Ron Wein <wein@post.tau.ac.il> // Ron Wein <wein@post.tau.ac.il>
// Efi Fogel <efif@post.tau.ac.il>
#ifndef CGAL_BOOLEAN_SET_OPERATIONS_H #ifndef CGAL_BOOLEAN_SET_OPERATIONS_H
#define CGAL_BOOLEAN_SET_OPERATIONS_H #define CGAL_BOOLEAN_SET_OPERATIONS_H
@ -195,8 +196,7 @@ template <class Kernel, class Container, class OutputIterator, class Traits>
inline OutputIterator inline OutputIterator
intersection (const Polygon_2<Kernel, Container>& pgn1, intersection (const Polygon_2<Kernel, Container>& pgn1,
const Polygon_with_holes_2<Kernel, Container>& pgn2, const Polygon_with_holes_2<Kernel, Container>& pgn2,
OutputIterator out, OutputIterator out, Traits& tr)
Traits& tr)
{ {
return (_intersection(pgn1, pgn2, out, tr)); return (_intersection(pgn1, pgn2, out, tr));
} }
@ -214,8 +214,7 @@ template <class Kernel, class Container, class OutputIterator, class Traits>
inline OutputIterator inline OutputIterator
intersection (const Polygon_with_holes_2<Kernel, Container>& pgn1, intersection (const Polygon_with_holes_2<Kernel, Container>& pgn1,
const Polygon_2<Kernel, Container>& pgn2, const Polygon_2<Kernel, Container>& pgn2,
OutputIterator out, OutputIterator out, Traits& tr)
Traits& tr)
{ {
return (_intersection(pgn1, pgn2, out, tr)); return (_intersection(pgn1, pgn2, out, tr));
} }
@ -271,8 +270,7 @@ inline OutputIterator
intersection (const General_polygon_2<Arr_traits>& pgn1, intersection (const General_polygon_2<Arr_traits>& pgn1,
const General_polygon_with_holes_2 const General_polygon_with_holes_2
<General_polygon_2<Arr_traits> >& pgn2, <General_polygon_2<Arr_traits> >& pgn2,
OutputIterator out, OutputIterator out, Traits& tr)
Traits& tr)
{ {
return (_intersection(pgn1, pgn2, out, tr)); return (_intersection(pgn1, pgn2, out, tr));
} }
@ -292,8 +290,7 @@ inline OutputIterator
intersection (const General_polygon_with_holes_2 intersection (const General_polygon_with_holes_2
<General_polygon_2<Arr_traits> >& pgn1, <General_polygon_2<Arr_traits> >& pgn1,
const General_polygon_2<Arr_traits>& pgn2, const General_polygon_2<Arr_traits>& pgn2,
OutputIterator out, OutputIterator out, Traits& tr)
Traits& tr)
{ {
return (_intersection(pgn1, pgn2, out, tr)); return (_intersection(pgn1, pgn2, out, tr));
} }
@ -311,8 +308,7 @@ template <class Polygon_, class OutputIterator, class Traits>
inline OutputIterator inline OutputIterator
intersection (const General_polygon_with_holes_2<Polygon_>& pgn1, intersection (const General_polygon_with_holes_2<Polygon_>& pgn1,
const General_polygon_with_holes_2<Polygon_>& pgn2, const General_polygon_with_holes_2<Polygon_>& pgn2,
OutputIterator out, OutputIterator out, Traits& tr)
Traits& tr)
{ {
return (_intersection(pgn1, pgn2, out, tr)); return (_intersection(pgn1, pgn2, out, tr));
} }
@ -332,8 +328,7 @@ inline bool join (const Polygon_2<Kernel, Container>& pgn1,
template <class Kernel, class Container, class Traits> template <class Kernel, class Container, class Traits>
inline bool join (const Polygon_2<Kernel, Container>& pgn1, inline bool join (const Polygon_2<Kernel, Container>& pgn1,
const Polygon_2<Kernel, Container>& pgn2, const Polygon_2<Kernel, Container>& pgn2,
Polygon_with_holes_2<Kernel, Container>& res, Polygon_with_holes_2<Kernel, Container>& res, Traits& tr)
Traits& tr)
{ {
return (_join(pgn1, pgn2, res, tr)); return (_join(pgn1, pgn2, res, tr));
} }
@ -341,7 +336,7 @@ inline bool join (const Polygon_2<Kernel, Container>& pgn1,
template <class Kernel, class Container> template <class Kernel, class Container>
inline bool join (const Polygon_2<Kernel, Container>& pgn1, inline bool join (const Polygon_2<Kernel, Container>& pgn1,
const Polygon_with_holes_2<Kernel, Container>& pgn2, const Polygon_with_holes_2<Kernel, Container>& pgn2,
Polygon_with_holes_2<Kernel, Container>& res ) Polygon_with_holes_2<Kernel, Container>& res)
{ {
return (_join(pgn1, pgn2, res)); return (_join(pgn1, pgn2, res));
} }
@ -349,8 +344,7 @@ inline bool join (const Polygon_2<Kernel, Container>& pgn1,
template <class Kernel, class Container, class Traits> template <class Kernel, class Container, class Traits>
inline bool join (const Polygon_2<Kernel, Container>& pgn1, inline bool join (const Polygon_2<Kernel, Container>& pgn1,
const Polygon_with_holes_2<Kernel, Container>& pgn2, const Polygon_with_holes_2<Kernel, Container>& pgn2,
Polygon_with_holes_2<Kernel, Container>& res, Polygon_with_holes_2<Kernel, Container>& res, Traits& tr)
Traits& tr)
{ {
return (_join(pgn1, pgn2, res, tr)); return (_join(pgn1, pgn2, res, tr));
} }
@ -366,8 +360,7 @@ inline bool join (const Polygon_with_holes_2<Kernel, Container>& pgn1,
template <class Kernel, class Container, class Traits> template <class Kernel, class Container, class Traits>
inline bool join (const Polygon_with_holes_2<Kernel, Container>& pgn1, inline bool join (const Polygon_with_holes_2<Kernel, Container>& pgn1,
const Polygon_2<Kernel, Container>& pgn2, const Polygon_2<Kernel, Container>& pgn2,
Polygon_with_holes_2<Kernel, Container>& res, Polygon_with_holes_2<Kernel, Container>& res, Traits& tr)
Traits& tr)
{ {
return (_join(pgn1, pgn2, res, tr)); return (_join(pgn1, pgn2, res, tr));
} }
@ -383,8 +376,7 @@ inline bool join (const Polygon_with_holes_2<Kernel, Container>& pgn1,
template <class Kernel, class Container, class Traits> template <class Kernel, class Container, class Traits>
inline bool join (const Polygon_with_holes_2<Kernel, Container>& pgn1, inline bool join (const Polygon_with_holes_2<Kernel, Container>& pgn1,
const Polygon_with_holes_2<Kernel, Container>& pgn2, const Polygon_with_holes_2<Kernel, Container>& pgn2,
Polygon_with_holes_2<Kernel, Container>& res, Polygon_with_holes_2<Kernel, Container>& res, Traits& tr)
Traits& tr)
{ {
return (_join(pgn1, pgn2, res, tr)); return (_join(pgn1, pgn2, res, tr));
} }
@ -403,7 +395,7 @@ inline bool
join (const General_polygon_2<Arr_traits>& pgn1, join (const General_polygon_2<Arr_traits>& pgn1,
const General_polygon_2<Arr_traits>& pgn2, const General_polygon_2<Arr_traits>& pgn2,
General_polygon_with_holes_2<General_polygon_2<Arr_traits> >& res, General_polygon_with_holes_2<General_polygon_2<Arr_traits> >& res,
Traits& tr) Traits& tr)
{ {
return (_join(pgn1, pgn2, res, tr)); return (_join(pgn1, pgn2, res, tr));
} }
@ -457,8 +449,7 @@ inline bool join (const General_polygon_with_holes_2<Polygon_>& pgn1,
template <class Polygon_, class Traits> template <class Polygon_, class Traits>
inline bool join (const General_polygon_with_holes_2<Polygon_>& pgn1, inline bool join (const General_polygon_with_holes_2<Polygon_>& pgn1,
const General_polygon_with_holes_2<Polygon_>& pgn2, const General_polygon_with_holes_2<Polygon_>& pgn2,
General_polygon_with_holes_2<Polygon_>& res, General_polygon_with_holes_2<Polygon_>& res, Traits& tr)
Traits& tr)
{ {
return (_join(pgn1, pgn2, res, tr)); return (_join(pgn1, pgn2, res, tr));
} }
@ -478,8 +469,7 @@ inline OutputIterator difference (const Polygon_2<Kernel, Container>& pgn1,
template <class Kernel, class Container, class OutputIterator, class Traits> template <class Kernel, class Container, class OutputIterator, class Traits>
inline OutputIterator difference (const Polygon_2<Kernel, Container>& pgn1, inline OutputIterator difference (const Polygon_2<Kernel, Container>& pgn1,
const Polygon_2<Kernel, Container>& pgn2, const Polygon_2<Kernel, Container>& pgn2,
OutputIterator oi, OutputIterator oi, Traits& tr)
Traits& tr)
{ {
return(_difference(pgn1, pgn2, oi, tr)); return(_difference(pgn1, pgn2, oi, tr));
} }
@ -497,8 +487,7 @@ template <class Kernel, class Container, class OutputIterator, class Traits>
inline OutputIterator inline OutputIterator
difference (const Polygon_2<Kernel, Container>& pgn1, difference (const Polygon_2<Kernel, Container>& pgn1,
const Polygon_with_holes_2<Kernel, Container>& pgn2, const Polygon_with_holes_2<Kernel, Container>& pgn2,
OutputIterator oi, OutputIterator oi, Traits& tr)
Traits& tr)
{ {
return(_difference(pgn1, pgn2, oi, tr)); return(_difference(pgn1, pgn2, oi, tr));
} }
@ -535,8 +524,7 @@ template <class Kernel, class Container, class OutputIterator, class Traits>
inline OutputIterator inline OutputIterator
difference (const Polygon_with_holes_2<Kernel, Container>& pgn1, difference (const Polygon_with_holes_2<Kernel, Container>& pgn1,
const Polygon_with_holes_2<Kernel, Container>& pgn2, const Polygon_with_holes_2<Kernel, Container>& pgn2,
OutputIterator oi, OutputIterator oi, Traits& tr)
Traits& tr)
{ {
return (_difference(pgn1, pgn2, oi, tr)); return (_difference(pgn1, pgn2, oi, tr));
} }
@ -571,8 +559,7 @@ template <class Arr_traits, class OutputIterator, class Traits>
inline OutputIterator difference (const General_polygon_2<Arr_traits>& pgn1, inline OutputIterator difference (const General_polygon_2<Arr_traits>& pgn1,
const General_polygon_with_holes_2 const General_polygon_with_holes_2
<General_polygon_2<Arr_traits> >& pgn2, <General_polygon_2<Arr_traits> >& pgn2,
OutputIterator oi, OutputIterator oi, Traits& tr)
Traits& tr)
{ {
return (_difference(pgn1, pgn2, oi, tr)); return (_difference(pgn1, pgn2, oi, tr));
} }
@ -590,8 +577,7 @@ template <class Arr_traits, class OutputIterator, class Traits>
inline OutputIterator difference (const General_polygon_with_holes_2 inline OutputIterator difference (const General_polygon_with_holes_2
<General_polygon_2<Arr_traits> >& pgn1, <General_polygon_2<Arr_traits> >& pgn1,
const General_polygon_2<Arr_traits>& pgn2, const General_polygon_2<Arr_traits>& pgn2,
OutputIterator oi, OutputIterator oi, Traits& tr)
Traits& tr)
{ {
return (_difference(pgn1, pgn2, oi, tr)); return (_difference(pgn1, pgn2, oi, tr));
} }
@ -609,8 +595,7 @@ template <class Polygon_, class OutputIterator, class Traits>
inline OutputIterator inline OutputIterator
difference (const General_polygon_with_holes_2<Polygon_>& pgn1, difference (const General_polygon_with_holes_2<Polygon_>& pgn1,
const General_polygon_with_holes_2<Polygon_>& pgn2, const General_polygon_with_holes_2<Polygon_>& pgn2,
OutputIterator oi, OutputIterator oi, Traits& tr)
Traits& tr)
{ {
return (_difference(pgn1, pgn2, oi, tr)); return (_difference(pgn1, pgn2, oi, tr));
} }
@ -623,8 +608,7 @@ template <class Kernel, class Container, class OutputIterator, class Traits>
inline OutputIterator inline OutputIterator
symmetric_difference (const Polygon_2<Kernel, Container>& pgn1, symmetric_difference (const Polygon_2<Kernel, Container>& pgn1,
const Polygon_2<Kernel, Container>& pgn2, const Polygon_2<Kernel, Container>& pgn2,
OutputIterator oi, OutputIterator oi, Traits& tr)
Traits& tr)
{ {
return (_symmetric_difference(pgn1, pgn2, oi, tr)); return (_symmetric_difference(pgn1, pgn2, oi, tr));
} }
@ -642,8 +626,7 @@ template <class Kernel, class Container, class OutputIterator, class Traits>
inline OutputIterator inline OutputIterator
symmetric_difference (const Polygon_2<Kernel, Container>& pgn1, symmetric_difference (const Polygon_2<Kernel, Container>& pgn1,
const Polygon_with_holes_2<Kernel, Container>& pgn2, const Polygon_with_holes_2<Kernel, Container>& pgn2,
OutputIterator oi, OutputIterator oi, Traits& tr)
Traits& tr)
{ {
return (_symmetric_difference(pgn1, pgn2, oi, tr)); return (_symmetric_difference(pgn1, pgn2, oi, tr));
} }
@ -662,8 +645,7 @@ template <class Kernel, class Container, class OutputIterator, class Traits>
inline OutputIterator inline OutputIterator
symmetric_difference (const Polygon_with_holes_2<Kernel, Container>& pgn1, symmetric_difference (const Polygon_with_holes_2<Kernel, Container>& pgn1,
const Polygon_2<Kernel, Container>& pgn2, const Polygon_2<Kernel, Container>& pgn2,
OutputIterator oi, OutputIterator oi, Traits& tr)
Traits& tr)
{ {
return (_symmetric_difference(pgn1, pgn2, oi, tr)); return (_symmetric_difference(pgn1, pgn2, oi, tr));
} }
@ -681,8 +663,7 @@ template <class Kernel, class Container, class OutputIterator, class Traits>
inline OutputIterator inline OutputIterator
symmetric_difference (const Polygon_with_holes_2<Kernel, Container>& pgn1, symmetric_difference (const Polygon_with_holes_2<Kernel, Container>& pgn1,
const Polygon_with_holes_2<Kernel, Container>& pgn2, const Polygon_with_holes_2<Kernel, Container>& pgn2,
OutputIterator oi, OutputIterator oi, Traits& tr)
Traits& tr)
{ {
return (_symmetric_difference(pgn1, pgn2, oi, tr)); return (_symmetric_difference(pgn1, pgn2, oi, tr));
} }
@ -720,8 +701,7 @@ inline OutputIterator
symmetric_difference (const General_polygon_2<Arr_traits>& pgn1, symmetric_difference (const General_polygon_2<Arr_traits>& pgn1,
const General_polygon_with_holes_2 const General_polygon_with_holes_2
<General_polygon_2<Arr_traits> >& pgn2, <General_polygon_2<Arr_traits> >& pgn2,
OutputIterator oi, OutputIterator oi, Traits& tr)
Traits& tr)
{ {
return (_symmetric_difference(pgn1, pgn2, oi, tr)); return (_symmetric_difference(pgn1, pgn2, oi, tr));
} }
@ -739,10 +719,9 @@ symmetric_difference(const General_polygon_2<Arr_traits>& pgn1,
template <class Arr_traits, class OutputIterator, class Traits> template <class Arr_traits, class OutputIterator, class Traits>
inline OutputIterator inline OutputIterator
symmetric_difference (const General_polygon_with_holes_2 symmetric_difference (const General_polygon_with_holes_2
<General_polygon_2<Arr_traits> >& pgn1, <General_polygon_2<Arr_traits> >& pgn1,
const General_polygon_2<Arr_traits>& pgn2, const General_polygon_2<Arr_traits>& pgn2,
OutputIterator oi, OutputIterator oi, Traits& tr)
Traits& tr)
{ {
return (_symmetric_difference(pgn1, pgn2, oi, tr)); return (_symmetric_difference(pgn1, pgn2, oi, tr));
} }
@ -814,8 +793,7 @@ void complement (const General_polygon_2<Arr_traits>& pgn,
template <class Kernel, class Container, class OutputIterator, class Traits> template <class Kernel, class Container, class OutputIterator, class Traits>
OutputIterator complement (const Polygon_with_holes_2<Kernel, Container>& pgn, OutputIterator complement (const Polygon_with_holes_2<Kernel, Container>& pgn,
OutputIterator oi, OutputIterator oi, Traits& tr)
Traits& tr)
{ {
General_polygon_set_2<Traits> gps(tr); General_polygon_set_2<Traits> gps(tr);
gps.insert(pgn); gps.insert(pgn);
@ -833,8 +811,7 @@ OutputIterator complement (const Polygon_with_holes_2<Kernel, Container>& pgn,
template <class Arr_traits, class OutputIterator, class Traits> template <class Arr_traits, class OutputIterator, class Traits>
OutputIterator complement (const General_polygon_with_holes_2<Arr_traits>& pgn, OutputIterator complement (const General_polygon_with_holes_2<Arr_traits>& pgn,
OutputIterator oi, OutputIterator oi, Traits& tr)
Traits& tr)
{ {
General_polygon_set_2<Traits> gps(tr); General_polygon_set_2<Traits> gps(tr);
gps.insert(pgn); gps.insert(pgn);
@ -863,12 +840,10 @@ struct map_iterator_to_traits
}; };
template <class InputIterator, class OutputIterator, class Traits> template <class InputIterator, class OutputIterator, class Traits>
inline OutputIterator join(InputIterator begin, inline OutputIterator join(InputIterator begin, InputIterator end,
InputIterator end, OutputIterator oi, Traits& )
OutputIterator oi,
Traits& )
{ {
if(begin == end) if (begin == end)
return (oi); return (oi);
General_polygon_set_2<Traits> gps(*begin); General_polygon_set_2<Traits> gps(*begin);
@ -877,8 +852,7 @@ inline OutputIterator join(InputIterator begin,
} }
template <class InputIterator, class OutputIterator> template <class InputIterator, class OutputIterator>
inline OutputIterator join(InputIterator begin, inline OutputIterator join(InputIterator begin, InputIterator end,
InputIterator end,
OutputIterator oi) OutputIterator oi)
{ {
typename map_iterator_to_traits<InputIterator>::Traits tr; typename map_iterator_to_traits<InputIterator>::Traits tr;
@ -888,14 +862,11 @@ inline OutputIterator join(InputIterator begin,
// Join two ranges of simple polygons and polygons with holes. // Join two ranges of simple polygons and polygons with holes.
template <class InputIterator1, class InputIterator2, template <class InputIterator1, class InputIterator2,
class OutputIterator, class Traits> class OutputIterator, class Traits>
inline OutputIterator join(InputIterator1 begin1, inline OutputIterator join(InputIterator1 begin1, InputIterator1 end1,
InputIterator1 end1, InputIterator2 begin2, InputIterator2 end2,
InputIterator2 begin2, OutputIterator oi, Traits& tr)
InputIterator2 end2,
OutputIterator oi,
Traits& tr)
{ {
if(begin1 == end1) if (begin1 == end1)
return (join(begin2, end2, oi, tr)); return (join(begin2, end2, oi, tr));
General_polygon_set_2<Traits> gps(*begin1); General_polygon_set_2<Traits> gps(*begin1);
@ -904,10 +875,8 @@ inline OutputIterator join(InputIterator1 begin1,
} }
template <class InputIterator1, class InputIterator2, class OutputIterator> template <class InputIterator1, class InputIterator2, class OutputIterator>
inline OutputIterator join(InputIterator1 begin1, inline OutputIterator join(InputIterator1 begin1, InputIterator1 end1,
InputIterator1 end1, InputIterator2 begin2, InputIterator2 end2,
InputIterator2 begin2,
InputIterator2 end2,
OutputIterator oi) OutputIterator oi)
{ {
typename map_iterator_to_traits<InputIterator1>::Traits tr; typename map_iterator_to_traits<InputIterator1>::Traits tr;
@ -918,12 +887,10 @@ inline OutputIterator join(InputIterator1 begin1,
/// \name Aggregated intersection() functions. /// \name Aggregated intersection() functions.
//@{ //@{
template <class InputIterator, class OutputIterator, class Traits> template <class InputIterator, class OutputIterator, class Traits>
inline OutputIterator intersection (InputIterator begin, inline OutputIterator intersection (InputIterator begin, InputIterator end,
InputIterator end, OutputIterator oi, Traits&)
OutputIterator oi,
Traits&)
{ {
if(begin == end) if (begin == end)
return (oi); return (oi);
General_polygon_set_2<Traits> gps(*begin); General_polygon_set_2<Traits> gps(*begin);
@ -932,8 +899,7 @@ inline OutputIterator intersection (InputIterator begin,
} }
template <class InputIterator, class OutputIterator> template <class InputIterator, class OutputIterator>
inline OutputIterator intersection (InputIterator begin, inline OutputIterator intersection (InputIterator begin, InputIterator end,
InputIterator end,
OutputIterator oi) OutputIterator oi)
{ {
typename map_iterator_to_traits<InputIterator>::Traits tr; typename map_iterator_to_traits<InputIterator>::Traits tr;
@ -943,14 +909,11 @@ inline OutputIterator intersection (InputIterator begin,
// Inersect two ranges of simple polygons and polygons with holes. // Inersect two ranges of simple polygons and polygons with holes.
template <class InputIterator1, class InputIterator2, template <class InputIterator1, class InputIterator2,
class OutputIterator, class Traits> class OutputIterator, class Traits>
inline OutputIterator intersection(InputIterator1 begin1, inline OutputIterator intersection(InputIterator1 begin1, InputIterator1 end1,
InputIterator1 end1, InputIterator2 begin2, InputIterator2 end2,
InputIterator2 begin2, OutputIterator oi, Traits& tr)
InputIterator2 end2,
OutputIterator oi,
Traits& tr)
{ {
if(begin1 == end1) if (begin1 == end1)
return (intersection(begin2, end2, oi, tr)); return (intersection(begin2, end2, oi, tr));
General_polygon_set_2<Traits> gps(*begin1); General_polygon_set_2<Traits> gps(*begin1);
@ -960,10 +923,8 @@ inline OutputIterator intersection(InputIterator1 begin1,
} }
template <class InputIterator1, class InputIterator2, class OutputIterator> template <class InputIterator1, class InputIterator2, class OutputIterator>
inline OutputIterator intersection(InputIterator1 begin1, inline OutputIterator intersection(InputIterator1 begin1, InputIterator1 end1,
InputIterator1 end1, InputIterator2 begin2, InputIterator2 end2,
InputIterator2 begin2,
InputIterator2 end2,
OutputIterator oi) OutputIterator oi)
{ {
typename map_iterator_to_traits<InputIterator1>::Traits tr; typename map_iterator_to_traits<InputIterator1>::Traits tr;
@ -974,12 +935,11 @@ inline OutputIterator intersection(InputIterator1 begin1,
/// \name Aggregated symmetric_difference() functions. /// \name Aggregated symmetric_difference() functions.
//@{ //@{
template <class InputIterator, class OutputIterator, class Traits> template <class InputIterator, class OutputIterator, class Traits>
inline OutputIterator symmetric_difference(InputIterator begin, inline
InputIterator end, OutputIterator symmetric_difference(InputIterator begin, InputIterator end,
OutputIterator oi, OutputIterator oi, Traits& tr)
Traits& tr)
{ {
if(begin == end) if (begin == end)
return (oi); return (oi);
General_polygon_set_2<Traits> gps(tr); General_polygon_set_2<Traits> gps(tr);
@ -989,9 +949,9 @@ inline OutputIterator symmetric_difference(InputIterator begin,
} }
template <class InputIterator, class OutputIterator> template <class InputIterator, class OutputIterator>
inline OutputIterator symmetric_difference (InputIterator begin, inline
InputIterator end, OutputIterator symmetric_difference (InputIterator begin, InputIterator end,
OutputIterator oi) OutputIterator oi)
{ {
typename map_iterator_to_traits<InputIterator>::Traits tr; typename map_iterator_to_traits<InputIterator>::Traits tr;
return symmetric_difference(begin, end, oi, tr); return symmetric_difference(begin, end, oi, tr);
@ -1000,14 +960,12 @@ inline OutputIterator symmetric_difference (InputIterator begin,
// Xor two ranges of simple polygons and polygons with holes. // Xor two ranges of simple polygons and polygons with holes.
template <class InputIterator1, class InputIterator2, template <class InputIterator1, class InputIterator2,
class OutputIterator, class Traits> class OutputIterator, class Traits>
inline OutputIterator symmetric_difference (InputIterator1 begin1, inline
InputIterator1 end1, OutputIterator symmetric_difference (InputIterator1 begin1, InputIterator1 end1,
InputIterator2 begin2, InputIterator2 begin2, InputIterator2 end2,
InputIterator2 end2, OutputIterator oi, Traits& tr)
OutputIterator oi,
Traits& tr)
{ {
if(begin1 == end1) if (begin1 == end1)
return (symmetric_difference(begin2, end2, oi, tr)); return (symmetric_difference(begin2, end2, oi, tr));
General_polygon_set_2<Traits> gps(tr); General_polygon_set_2<Traits> gps(tr);
@ -1018,11 +976,10 @@ inline OutputIterator symmetric_difference (InputIterator1 begin1,
} }
template <class InputIterator1, class InputIterator2, class OutputIterator> template <class InputIterator1, class InputIterator2, class OutputIterator>
inline OutputIterator symmetric_difference (InputIterator1 begin1, inline
InputIterator1 end1, OutputIterator symmetric_difference (InputIterator1 begin1, InputIterator1 end1,
InputIterator2 begin2, InputIterator2 begin2, InputIterator2 end2,
InputIterator2 end2, OutputIterator oi)
OutputIterator oi)
{ {
typename map_iterator_to_traits<InputIterator1>::Traits tr; typename map_iterator_to_traits<InputIterator1>::Traits tr;
return symmetric_difference(begin1, end1, begin2, end2, oi, tr); return symmetric_difference(begin1, end1, begin2, end2, oi, tr);
@ -1035,7 +992,7 @@ inline OutputIterator symmetric_difference (InputIterator1 begin1,
template <class InputIterator, class Traits> template <class InputIterator, class Traits>
inline bool do_intersect(InputIterator begin, InputIterator end, Traits& tr) inline bool do_intersect(InputIterator begin, InputIterator end, Traits& tr)
{ {
if(begin == end) if (begin == end)
return false; return false;
General_polygon_set_2<Traits> gps(tr); General_polygon_set_2<Traits> gps(tr);
@ -1056,7 +1013,7 @@ inline bool do_intersect (InputIterator1 begin1, InputIterator1 end1,
InputIterator2 begin2, InputIterator2 end2, InputIterator2 begin2, InputIterator2 end2,
Traits& tr) Traits& tr)
{ {
if(begin1 == end1) if (begin1 == end1)
return (do_intersect(begin2, end2, tr)); return (do_intersect(begin2, end2, tr));
General_polygon_set_2<Traits> gps(tr); General_polygon_set_2<Traits> gps(tr);
@ -1074,6 +1031,212 @@ inline bool do_intersect (InputIterator1 begin1, InputIterator1 end1,
//@} //@}
/// \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));
}
//@}
CGAL_END_NAMESPACE CGAL_END_NAMESPACE
#endif #endif

View File

@ -17,6 +17,7 @@
// //
// Author(s) : Baruch Zukerman <baruchzu@post.tau.ac.il> // Author(s) : Baruch Zukerman <baruchzu@post.tau.ac.il>
// Ron Wein <wein@post.tau.ac.il> // Ron Wein <wein@post.tau.ac.il>
// Efi Fogel <efif@post.tau.ac.il>
#ifndef CGAL_BSO_INTERNAL_FUNCTIONS_H #ifndef CGAL_BSO_INTERNAL_FUNCTIONS_H
#define CGAL_BSO_INTERNAL_FUNCTIONS_H #define CGAL_BSO_INTERNAL_FUNCTIONS_H
@ -30,9 +31,7 @@ CGAL_BEGIN_NAMESPACE
//@{ //@{
template <class Pgn1, class Pgn2, class Traits> template <class Pgn1, class Pgn2, class Traits>
inline bool _do_intersect(const Pgn1& pgn1, inline bool _do_intersect(const Pgn1& pgn1, const Pgn2& pgn2, Traits& tr)
const Pgn2& pgn2,
Traits& tr)
{ {
General_polygon_set_2<Traits> gps(tr); General_polygon_set_2<Traits> gps(tr);
gps.insert(pgn1); gps.insert(pgn1);
@ -40,11 +39,30 @@ inline bool _do_intersect(const Pgn1& pgn1,
} }
template <class Pgn1, class Pgn2> template <class Pgn1, class Pgn2>
inline bool _do_intersect(const Pgn1& pgn1, inline bool _do_intersect(const Pgn1& pgn1, const Pgn2& pgn2)
const Pgn2& pgn2)
{ {
typename Gps_default_traits<Pgn1>::Traits tr; typename Gps_default_traits<Pgn1>::Traits tr;
return (_do_intersect(pgn1, pgn2, tr)); return _do_intersect(pgn1, pgn2, tr);
}
//@}
/// \name _oriented_side() functions.
//@{
template <class Obj, class Pgn, class Traits>
inline
Oriented_side _oriented_side(const Obj& obj, const Pgn& pgn, Traits& tr)
{
General_polygon_set_2<Traits> gps(tr);
gps.insert(pgn);
return (gps.oriented_side(obj));
}
template <class Obj, class Pgn>
inline Oriented_side _oriented_side(const Obj& obj, const Pgn& pgn)
{
typename Gps_default_traits<Pgn>::Traits tr;
return _oriented_side(obj, pgn, tr);
} }
//@} //@}
@ -52,10 +70,8 @@ inline bool _do_intersect(const Pgn1& pgn1,
//@{ //@{
template <class Pgn1, class Pgn2, class OutputIterator, class Traits> template <class Pgn1, class Pgn2, class OutputIterator, class Traits>
inline OutputIterator _intersection(const Pgn1& pgn1, inline OutputIterator _intersection(const Pgn1& pgn1, const Pgn2& pgn2,
const Pgn2& pgn2, OutputIterator out, Traits& tr)
OutputIterator out,
Traits& tr)
{ {
General_polygon_set_2<Traits> gps(tr); General_polygon_set_2<Traits> gps(tr);
gps.insert(pgn1); gps.insert(pgn1);
@ -64,12 +80,10 @@ inline OutputIterator _intersection(const Pgn1& pgn1,
} }
template <class Pgn1, class Pgn2, class OutputIterator> template <class Pgn1, class Pgn2, class OutputIterator>
inline OutputIterator _intersection(const Pgn1& pgn1, inline OutputIterator _intersection(const Pgn1& pgn1, const Pgn2& pgn2,
const Pgn2& pgn2,
OutputIterator out) OutputIterator out)
{ {
typedef typename Gps_default_traits<Pgn1>::Traits Traits; typename Gps_default_traits<Pgn1>::Traits tr;
Traits tr;
return (_intersection(pgn1, pgn2, out, tr)); return (_intersection(pgn1, pgn2, out, tr));
} }
@ -78,8 +92,7 @@ inline OutputIterator _intersection(const Pgn1& pgn1,
//@{ //@{
template <class Traits> template <class Traits>
inline bool _is_empty (const typename Traits:: Polygon_2& pgn, inline bool _is_empty (const typename Traits:: Polygon_2& pgn, Traits& tr)
Traits& tr)
{ {
typedef typename Traits::Curve_const_iterator Curve_const_iterator; typedef typename Traits::Curve_const_iterator Curve_const_iterator;
const std::pair<Curve_const_iterator, Curve_const_iterator>& itr_pair = const std::pair<Curve_const_iterator, Curve_const_iterator>& itr_pair =
@ -88,20 +101,17 @@ inline bool _is_empty (const typename Traits:: Polygon_2& pgn,
} }
template <class Traits> template <class Traits>
inline bool _is_empty (const typename Traits::Polygon_with_holes_2&, inline bool _is_empty (const typename Traits::Polygon_with_holes_2&, Traits&)
Traits&)
{ {
return (false); return false;
} }
template <class Pgn1, class Pgn2, class Traits> template <class Pgn1, class Pgn2, class Traits>
inline bool _join(const Pgn1& pgn1, inline bool _join(const Pgn1& pgn1, const Pgn2& pgn2,
const Pgn2& pgn2, typename Traits::Polygon_with_holes_2& res, Traits& tr)
typename Traits::Polygon_with_holes_2& res,
Traits& tr)
{ {
if (_is_empty(pgn1, tr) || _is_empty(pgn2, tr)) if (_is_empty(pgn1, tr) || _is_empty(pgn2, tr))
return (false); return false;
General_polygon_set_2<Traits> gps(tr); General_polygon_set_2<Traits> gps(tr);
gps.insert(pgn1); gps.insert(pgn1);
@ -110,21 +120,18 @@ inline bool _join(const Pgn1& pgn1,
{ {
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);
return (true); return true;
} }
// the polygon doesnt intersect, the original pgn1, pgn2 contain the union // the polygon doesnt intersect, the original pgn1, pgn2 contain the union
return (false); return false;
} }
template <class Pgn1, class Pgn2, class Pwh> template <class Pgn1, class Pgn2, class Pwh>
inline bool inline bool _join(const Pgn1& pgn1, const Pgn2& pgn2, Pwh& res)
_join(const Pgn1& pgn1,
const Pgn2& pgn2,
Pwh& res)
{ {
typename Gps_default_traits<Pgn1>::Traits tr; typename Gps_default_traits<Pgn1>::Traits tr;
return (_join(pgn1, pgn2, res, tr)); return _join(pgn1, pgn2, res, tr);
} }
//@} //@}
@ -132,24 +139,21 @@ _join(const Pgn1& pgn1,
//@{ //@{
template <class Pgn1, class Pgn2, class OutputIterator, class Traits> template <class Pgn1, class Pgn2, class OutputIterator, class Traits>
inline OutputIterator _difference(const Pgn1& pgn1, inline OutputIterator _difference(const Pgn1& pgn1, const Pgn2& pgn2,
const Pgn2& pgn2, OutputIterator oi, Traits& tr)
OutputIterator oi,
Traits& tr)
{ {
General_polygon_set_2<Traits> gps(tr); General_polygon_set_2<Traits> gps(tr);
gps.insert(pgn1); gps.insert(pgn1);
gps.difference(pgn2); gps.difference(pgn2);
return (gps.polygons_with_holes(oi)); return gps.polygons_with_holes(oi);
} }
template <class Pgn1, class Pgn2, class OutputIterator> template <class Pgn1, class Pgn2, class OutputIterator>
inline OutputIterator _difference(const Pgn1& pgn1, inline OutputIterator _difference(const Pgn1& pgn1, const Pgn2& pgn2,
const Pgn2& pgn2,
OutputIterator oi) OutputIterator oi)
{ {
typename Gps_default_traits<Pgn1>::Traits tr; typename Gps_default_traits<Pgn1>::Traits tr;
return(_difference(pgn1, pgn2, oi, tr)); return _difference(pgn1, pgn2, oi, tr);
} }
//@} //@}
@ -157,24 +161,21 @@ inline OutputIterator _difference(const Pgn1& pgn1,
//@{ //@{
template <class Pgn1, class Pgn2, class OutputIterator, class Traits> template <class Pgn1, class Pgn2, class OutputIterator, class Traits>
inline OutputIterator _symmetric_difference(const Pgn1& pgn1, inline OutputIterator _symmetric_difference(const Pgn1& pgn1, const Pgn2& pgn2,
const Pgn2& pgn2, OutputIterator oi, Traits& tr)
OutputIterator oi,
Traits& tr)
{ {
General_polygon_set_2<Traits> gps(tr); General_polygon_set_2<Traits> gps(tr);
gps.insert(pgn1); gps.insert(pgn1);
gps.symmetric_difference(pgn2); gps.symmetric_difference(pgn2);
return (gps.polygons_with_holes(oi)); return gps.polygons_with_holes(oi);
} }
template <class Pgn1, class Pgn2, class OutputIterator> template <class Pgn1, class Pgn2, class OutputIterator>
inline OutputIterator _symmetric_difference(const Pgn1& pgn1, inline OutputIterator _symmetric_difference(const Pgn1& pgn1, const Pgn2& pgn2,
const Pgn2& pgn2,
OutputIterator oi) OutputIterator oi)
{ {
typename Gps_default_traits<Pgn1>::Traits tr; typename Gps_default_traits<Pgn1>::Traits tr;
return (_symmetric_difference(pgn1, pgn2, oi, tr)); return _symmetric_difference(pgn1, pgn2, oi, tr);
} }
//@} //@}
@ -182,8 +183,7 @@ inline OutputIterator _symmetric_difference(const Pgn1& pgn1,
//@{ //@{
template <class Pgn, class Traits> template <class Pgn, class Traits>
void _complement(const Pgn& pgn, void _complement(const Pgn& pgn, typename Traits::Polygon_with_holes_2& res,
typename Traits::Polygon_with_holes_2& res,
Traits& tr) Traits& tr)
{ {
General_polygon_set_2<Traits> gps(tr); General_polygon_set_2<Traits> gps(tr);
@ -191,7 +191,6 @@ void _complement(const Pgn& 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);
} }
template <class Pgn, class Pwh> template <class Pgn, class Pwh>