diff --git a/Minkowski_sum_2/include/CGAL/minkowski_sum_2.h b/Minkowski_sum_2/include/CGAL/minkowski_sum_2.h index 6de28e748b5..ed41c1c4607 100644 --- a/Minkowski_sum_2/include/CGAL/minkowski_sum_2.h +++ b/Minkowski_sum_2/include/CGAL/minkowski_sum_2.h @@ -30,7 +30,7 @@ namespace CGAL { /*! - * Computes the Minkowski sum \f$ P \oplus Q\f$ of the two given polygons. + * Computes the Minkowski sum \f$ P \oplus Q\f$ of two given polygons. * The function computes the reduced convolution of the two polygons and * extracts those loops of the convolution which are part of the Minkowsi * sum. This method works very efficiently, regardless of whether `P` and @@ -38,10 +38,11 @@ namespace CGAL { * Note that as the input polygons may not be convex, their Minkowski * sum may not be a simple polygon. The result is therefore represented * as a polygon with holes. + * \param[in] pgn1 The first polygon. + * \param[in] pgn2 The second polygon. * \pre Both `P` and `Q` are simple, counterclockwise-oriented polygons. -*/ - -template + */ +template Polygon_with_holes_2 minkowski_sum_reduced_convolution_2(const Polygon_2& pgn1, const Polygon_2& pgn2) @@ -50,64 +51,107 @@ minkowski_sum_reduced_convolution_2(const Polygon_2& pgn1, typedef Container_ Container; Minkowski_sum_by_reduced_convolution_2 mink_sum; - Polygon_2 sum_bound; - std::list > sum_holes; + Polygon_2 sum_bound; + std::list > sum_holes; if (pgn1.size() > pgn2.size()) - mink_sum (pgn1, pgn2, sum_bound, std::back_inserter(sum_holes)); - else - mink_sum (pgn2, pgn1, sum_bound, std::back_inserter(sum_holes)); + mink_sum(pgn1, pgn2, sum_bound, std::back_inserter(sum_holes)); + else mink_sum(pgn2, pgn1, sum_bound, std::back_inserter(sum_holes)); - return (Polygon_with_holes_2 (sum_bound, - sum_holes.begin(), - sum_holes.end())); + return (Polygon_with_holes_2(sum_bound, + sum_holes.begin(), + sum_holes.end())); } /*! - * Computes the Minkowski sum \f$ P \oplus Q\f$ of the two given - * polygons-with-holes. + * Computes the Minkowski sum \f$ P \oplus Q\f$ of two given polygons with + * holes. * The function computes the reduced convolution of the two polygons and * extracts those loops of the convolution which are part of the Minkowsi * sum. This method works very efficiently, regardless of whether `P` and * `Q` are convex or non-convex. * The result is also represented as a polygon with holes. -*/ -template + * \param[in] pgn1 The first polygon. + * \param[in] pgn2 The second polygon. + */ +template Polygon_with_holes_2 -minkowski_sum_reduced_convolution_2(const Polygon_with_holes_2& pgn1, - const Polygon_with_holes_2& pgn2) +minkowski_sum_reduced_convolution_2 +(const Polygon_with_holes_2& pgn1, + const Polygon_with_holes_2& pgn2) { typedef Kernel_ Kernel; typedef Container_ Container; Hole_filter_2 hole_filter; - Polygon_with_holes_2 filtered_pgn1; - Polygon_with_holes_2 filtered_pgn2; + Polygon_with_holes_2 filtered_pgn1; + Polygon_with_holes_2 filtered_pgn2; hole_filter(pgn1, pgn2, filtered_pgn1); hole_filter(pgn2, pgn1, filtered_pgn2); Minkowski_sum_by_reduced_convolution_2 mink_sum; - Polygon_2 sum_bound; - std::list > sum_holes; + Polygon_2 sum_bound; + std::list > sum_holes; - mink_sum (filtered_pgn1, filtered_pgn2, sum_bound, std::back_inserter(sum_holes)); + mink_sum(filtered_pgn1, filtered_pgn2, sum_bound, + std::back_inserter(sum_holes)); - return (Polygon_with_holes_2 (sum_bound, - sum_holes.begin(), - sum_holes.end())); + return (Polygon_with_holes_2(sum_bound, + sum_holes.begin(), + sum_holes.end())); } +/*! + * Computes the Minkowski sum \f$ P \oplus Q\f$ of a simple polygon and a + * polygon with holes. + * The function computes the reduced convolution of the two polygons and + * extracts those loops of the convolution which are part of the Minkowsi + * sum. This method works very efficiently, regardless of whether `P` and + * `Q` are convex or non-convex. + * The result is also represented as a polygon with holes. + * \param[in] pgn1 The simple polygon. + * \param[in] pgn2 The polygon with holes. + */ template Polygon_with_holes_2 -minkowski_sum_reduced_convolution_2(const Polygon_2& pgn1, - const Polygon_with_holes_2& pgn2) +minkowski_sum_reduced_convolution_2 +(const Polygon_2& pgn1, + const Polygon_with_holes_2& pgn2) { - Polygon_with_holes_2 pgnwh1(pgn1); - return minkowski_sum_reduced_convolution_2(pgnwh1, pgn2); + typedef Kernel_ Kernel; + typedef Container_ Container; + + Hole_filter_2 hole_filter; + Polygon_with_holes_2 filtered_pgn2; + hole_filter(pgn2, pgn1, filtered_pgn2); + Minkowski_sum_by_reduced_convolution_2 mink_sum; + Polygon_2 sum_bound; + std::list > sum_holes; + mink_sum(pgn1, filtered_pgn2, sum_bound, std::back_inserter(sum_holes)); + return (Polygon_with_holes_2(sum_bound, + sum_holes.begin(), + sum_holes.end())); } +/*! + * Computes the Minkowski sum \f$ P \oplus Q\f$ of a simple polygon and a + * polygon with holes. + * The function computes the reduced convolution of the two polygons and + * extracts those loops of the convolution which are part of the Minkowsi + * sum. This method works very efficiently, regardless of whether `P` and + * `Q` are convex or non-convex. + * The result is also represented as a polygon with holes. + * \param[in] pgn1 The polygon with holes. + * \param[in] pgn2 The simple polygon. + */ +template +Polygon_with_holes_2 +minkowski_sum_reduced_convolution_2 +(const Polygon_with_holes_2& pgn1, + const Polygon_2& pgn2) +{ return minkowski_sum_reduced_convolution_2(pgn2, pgn1); } /*! * Compute the Minkowski sum of two simple polygons using the (full) @@ -115,11 +159,11 @@ minkowski_sum_reduced_convolution_2(const Polygon_2& pgn1, * Note that as the input polygons may not be convex, their Minkowski sum may * not be a simple polygon. The result is therefore represented as a polygon * with holes. - * \param pgn1 (in) The first polygon. - * \param pgn2 (in) The second polygon. + * \param[in] pgn1 The first polygon. + * \param[in] pgn2 The second polygon. * \return The resulting polygon with holes, representing the sum. */ -template +template Polygon_with_holes_2 minkowski_sum_full_convolution_2(const Polygon_2& pgn1, const Polygon_2& pgn2) @@ -133,8 +177,7 @@ minkowski_sum_full_convolution_2(const Polygon_2& pgn1, if (pgn1.size() > pgn2.size()) mink_sum(pgn1, pgn2, sum_bound, std::back_inserter(sum_holes)); - else - mink_sum(pgn2, pgn1, sum_bound, std::back_inserter(sum_holes)); + else mink_sum(pgn2, pgn1, sum_bound, std::back_inserter(sum_holes)); return (Polygon_with_holes_2(sum_bound, sum_holes.begin(), sum_holes.end())); @@ -147,8 +190,8 @@ minkowski_sum_full_convolution_2(const Polygon_2& pgn1, * Note that as the input polygons may not be convex, their Minkowski sum may * not be a simple polygon. The result is therefore represented as a polygon * with holes. - * \param pgn1 (in) The first polygon. - * \param pgn2 (in) The second polygon. + * \param[in] pgn1 The first polygon. + * \param[in] pgn2 The second polygon. * \return The resulting polygon with holes, representing the sum. * * \sa `CGAL::minkowski_sum_reduced_convolution_2()` @@ -158,9 +201,7 @@ template Polygon_with_holes_2 minkowski_sum_2(const Polygon_2& pgn1, const Polygon_2& pgn2) -{ - return minkowski_sum_reduced_convolution_2(pgn1, pgn2); -} +{ return minkowski_sum_reduced_convolution_2(pgn1, pgn2); } /*! * Compute the Minkowski sum of two polygons with holes using the convolution @@ -168,8 +209,8 @@ minkowski_sum_2(const Polygon_2& pgn1, * as it is more efficient in most cases. * Note that the result may not be a simple polygon. The result is therefore * represented as a polygon with holes. - * \param pgn1 (in) The first polygon with holes. - * \param pgn2 (in) The second polygon with holes. + * \param[in] pgn1 The first polygon with holes. + * \param[in] pgn2 The second polygon with holes. * \return The resulting polygon with holes, representing the sum. * * \sa `CGAL::minkowski_sum_reduced_convolution_2()` @@ -179,18 +220,16 @@ template Polygon_with_holes_2 minkowski_sum_2(const Polygon_with_holes_2& pgn1, const Polygon_with_holes_2& pgn2) -{ - return minkowski_sum_reduced_convolution_2(pgn1, pgn2); -} +{ return minkowski_sum_reduced_convolution_2(pgn1, pgn2); } /*! - * Compute the Minkowski sum of a simple polygons and a polygon-with-holes + * Compute the Minkowski sum of a simple polygon and a polygon with holes * using the convolution method. This function defaults to calling the reduced * convolution method, as it is more efficient in most cases. * Note that the result may not be a simple polygon. The result is therefore * represented as a polygon with holes. - * \param pgn1 (in) The polygon. - * \param pgn2 (in) The polygon with holes. + * \param[in] pgn1 The simple polygon. + * \param[in] pgn2 The polygon with holes. * \return The resulting polygon with holes, representing the sum. * * \sa `CGAL::minkowski_sum_reduced_convolution_2()` @@ -200,10 +239,26 @@ template Polygon_with_holes_2 minkowski_sum_2(const Polygon_2& pgn1, const Polygon_with_holes_2& pgn2) -{ - Polygon_with_holes_2 pgnwh1(pgn1); - return minkowski_sum_reduced_convolution_2(pgnwh1, pgn2); -} +{ return minkowski_sum_reduced_convolution_2(pgn1, pgn2); } + + /*! + * Compute the Minkowski sum of a simple polygon and a polygon with holes + * using the convolution method. This function defaults to calling the reduced + * convolution method, as it is more efficient in most cases. + * Note that the result may not be a simple polygon. The result is therefore + * represented as a polygon with holes. + * \param[in] pgn1 The polygon with holes. + * \param[in] pgn2 The simple polygon. + * \return The resulting polygon with holes, representing the sum. + * + * \sa `CGAL::minkowski_sum_reduced_convolution_2()` + * \sa `CGAL::minkowski_sum_full_convolution_2()` + */ +template +Polygon_with_holes_2 +minkowski_sum_2(const Polygon_with_holes_2& pgn1, + const Polygon_2& pgn2) +{ return minkowski_sum_reduced_convolution_2(pgn1, pgn2); } /*! * Compute the Minkowski sum of two simple polygons by decomposing each @@ -212,9 +267,9 @@ minkowski_sum_2(const Polygon_2& pgn1, * Note that as the input polygons may not be convex, their Minkowski sum may * not be a simple polygon. The result is therefore represented as a polygon * with holes. - * \param pgn1 (in) The first polygon. - * \param pgn2 (in) The second polygon. - * \param decomposition_strategy (in) A functor for decomposing polygons. + * \param[in] pgn1 The first polygon. + * \param[in] pgn2 The second polygon. + * \param[in] decomposition_strategy A functor for decomposing polygons. * \return The resulting polygon with holes, representing the sum. */ template & pgn1, * Note that as the input polygons may not be convex, their Minkowski sum may * not be a simple polygon. The result is therefore represented as a polygon * with holes. - * \param pgn1 (in) The first polygon. - * \param pgn2 (in) The second polygon. - * \param decomposition_strategy (in) A functor for decomposing polygons. - * \param traits (in) traits The traits. + * \param[in] pgn1 The first polygon. + * \param[in] pgn2 The second polygon. + * \param[in] decomposition_strategy A functor for decomposing polygons. + * \param[in] traits The traits. * \return The resulting polygon with holes, representing the sum. */ template & pgn1, Minkowski_sum_by_decomposition_2 mink_sum(decomposition_strategy, traits); - Polygon_with_holes_2 sum = mink_sum(pgn1, pgn2); - return (sum); + return mink_sum(pgn1, pgn2); } /*! - * Compute the Minkowski sum of two polygon-with-holes by decomposing each + * Compute the Minkowski sum of two polygon with holes by decomposing each * polygon to convex sub-polygons and computing the union of the pairwise * Minkowski sums of the sub-polygons. * The result is also represented as a polygon with holes. - * \param pgn1 (in) The first polygon. - * \param pgn2 (in) The second polygon. - * \param decomposition_strategy (in) A functor for decomposing polygons. + * \param[in] pgn1 The first polygon. + * \param[in] pgn2 The second polygon. + * \param[in] decomposition_strategy A functor for decomposing polygons. * \return The resulting polygon with holes, representing the sum. */ template & pgn1, { typename Minkowski_sum_by_decomposition_2::Traits_2 traits; - - Hole_filter_2 hole_filter; - - Polygon_with_holes_2 filtered_pgn1; - Polygon_with_holes_2 filtered_pgn2; - - hole_filter(pgn1, pgn2, filtered_pgn1); - hole_filter(pgn2, pgn1, filtered_pgn2); - - return minkowski_sum_2(filtered_pgn1, filtered_pgn2, decomposition_strategy, traits); + return minkowski_sum_2(pgn1, pgn2, decomposition_strategy, traits); } /*! - * Compute the Minkowski sum of two polygon-with-holes by decomposing each + * Compute the Minkowski sum of two polygon with holes by decomposing each * polygon to convex sub-polygons and computing the union of the pairwise * Minkowski sums of the sub-polygons. * The result is also represented as a polygon with holes. - * \param pgn1 (in) The first polygon. - * \param pgn2 (in) The second polygon. - * \param decomposition_strategy (in) A functor for decomposing polygons. - * \param traits (in) The traits. + * \param[in] pgn1 The first polygon. + * \param[in] pgn2 The second polygon. + * \param[in] decomposition_strategy A functor for decomposing polygons. + * \param[in] traits The traits. * \return The resulting polygon with holes, representing the sum. */ template & pgn1, Minkowski_sum_by_decomposition_2 mink_sum(decomposition_strategy, traits); - - Hole_filter_2 hole_filter; - - Polygon_with_holes_2 filtered_pgn1; - Polygon_with_holes_2 filtered_pgn2; - + Hole_filter_2 hole_filter; + Polygon_with_holes_2 filtered_pgn1; + Polygon_with_holes_2 filtered_pgn2; hole_filter(pgn1, pgn2, filtered_pgn1); hole_filter(pgn2, pgn1, filtered_pgn2); - - Polygon_with_holes_2 sum = mink_sum(filtered_pgn1, filtered_pgn2); - return sum; + return mink_sum(filtered_pgn1, filtered_pgn2); } /*! - * Compute the Minkowski sum of one simple polygon and one polygon-with-holes + * Compute the Minkowski sum of a simple polygon and a polygon with holes * by decomposing each polygon to convex sub-polygons and computing the union * of the pairwise Minkowski sums of the sub-polygons. The result is also * represented as a polygon with holes. - * \param pgn1 (in) The first polygon. - * \param pgn2 (in)The second polygon. - * \param decomposition_strategy (in) A functor for decomposing polygons. + * \param[in] pgn1 The first polygon. + * \param[in] pgn2 The second polygon. + * \param[in] decomposition_strategy A functor for decomposing polygons. * \return The resulting polygon with holes, representing the sum. */ template & pgn1, { typename Minkowski_sum_by_decomposition_2::Traits_2 traits; - - Hole_filter_2 hole_filter; - - Polygon_with_holes_2 filtered_pgn1; - Polygon_with_holes_2 filtered_pgn2; - - hole_filter(pgn1, pgn2, filtered_pgn1); - hole_filter(pgn2, pgn1, filtered_pgn2); - - return minkowski_sum_2(filtered_pgn1, filtered_pgn2, decomposition_strategy, traits); + return minkowski_sum_2(pgn1, pgn2, decomposition_strategy, traits); } /*! - * Compute the Minkowski sum of one simple polygon and one polygon-with-holes + * Compute the Minkowski sum of a simple polygon and a polygon with holes * by decomposing each polygon to convex sub-polygons and computing the union * of the pairwise Minkowski sums of the sub-polygons. The result is also * represented as a polygon with holes. - * \param pgn1 (in) The first polygon. - * \param pgn2 (in)The second polygon. - * \param decomposition_strategy (in) A functor for decomposing polygons. - * \param traits (in) The traits. + * \param[in] pgn1 The simple polygon. + * \param[in] pgn2 The polygon with holes. + * \param[in] decomposition_strategy A functor for decomposing polygons. + * \param[in] traits The traits. * \return The resulting polygon with holes, representing the sum. */ template & pgn1, Minkowski_sum_by_decomposition_2 mink_sum(decomposition_strategy, traits); - - Hole_filter_2 hole_filter; - - Polygon_with_holes_2 filtered_pgn1; - Polygon_with_holes_2 filtered_pgn2; - - hole_filter(pgn1, pgn2, filtered_pgn1); + Hole_filter_2 hole_filter; + Polygon_with_holes_2 filtered_pgn2; hole_filter(pgn2, pgn1, filtered_pgn2); - - Polygon_with_holes_2 sum = mink_sum(filtered_pgn1, filtered_pgn2); - return sum; + return mink_sum(pgn1, filtered_pgn2); } +/*! + * Compute the Minkowski sum of a simple polygon and a polygon with holes + * by decomposing each polygon to convex sub-polygons and computing the union + * of the pairwise Minkowski sums of the sub-polygons. The result is also + * represented as a polygon with holes. + * \param[in] pgn1 The second polygon. + * \param[in] pgn2 The first polygon. + * \param[in] decomposition_strategy A functor for decomposing polygons. + * \return The resulting polygon with holes, representing the sum. + */ +template +Polygon_with_holes_2 +minkowski_sum_2(const Polygon_with_holes_2& pgn1, + const Polygon_2& pgn2, + const DecompositionStrategy_& decomposition_strategy) +{ + typename Minkowski_sum_by_decomposition_2::Traits_2 traits; + return minkowski_sum_2(pgn1, pgn2, decomposition_strategy, traits); +} + +/*! + * Compute the Minkowski sum of a simple polygon and a polygon with holes + * by decomposing each polygon to convex sub-polygons and computing the union + * of the pairwise Minkowski sums of the sub-polygons. The result is also + * represented as a polygon with holes. + * \param[in] pgn1 The polygon with holes. + * \param[in] pgn2 The simple polygon. + * \param[in] decomposition_strategy A functor for decomposing polygons. + * \param[in] traits The traits. + * \return The resulting polygon with holes, representing the sum. + */ +template +Polygon_with_holes_2 +minkowski_sum_2(const Polygon_with_holes_2& pgn1, + const Polygon_2& pgn2, + const DecompositionStrategy_& decomposition_strategy, + const typename + Minkowski_sum_by_decomposition_2::Traits_2& traits) +{ return minkowski_sum_2(pgn2, pgn1, decomposition_strategy, traits); } + } //namespace CGAL #endif