// Copyright (c) 2006 Tel-Aviv University (Israel). // All rights reserved. // // This file is part of CGAL (www.cgal.org). // You can redistribute it and/or modify it under the terms of the GNU // General Public License as published by the Free Software Foundation, // either version 3 of the License, or (at your option) any later version. // // 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. // // Author(s) : Ron Wein // Efi Fogel #ifndef CGAL_MINKOWSKI_SUM_2_H #define CGAL_MINKOWSKI_SUM_2_H #include #include #include #include #include #include #include namespace CGAL { /*! * 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 * `Q` are convex or non-convex. * 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 Polygon_with_holes_2 minkowski_sum_by_reduced_convolution_2(const Polygon_2& pgn1, const Polygon_2& pgn2) { typedef Kernel_ Kernel; typedef Container_ Container; Minkowski_sum_by_reduced_convolution_2 mink_sum; 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)); return (Polygon_with_holes_2(sum_bound, sum_holes.begin(), sum_holes.end())); } /*! * 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. * \param[in] pgn1 The first polygon. * \param[in] pgn2 The second polygon. */ template Polygon_with_holes_2 minkowski_sum_by_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; 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; 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())); } /*! * 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_by_reduced_convolution_2 (const Polygon_2& pgn1, const Polygon_with_holes_2& 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_by_reduced_convolution_2 (const Polygon_with_holes_2& pgn1, const Polygon_2& pgn2) { return minkowski_sum_by_reduced_convolution_2(pgn2, pgn1); } /*! * Compute the Minkowski sum of two simple polygons using the (full) * convolution method. * 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. * \return The resulting polygon with holes, representing the sum. */ template Polygon_with_holes_2 minkowski_sum_by_full_convolution_2(const Polygon_2& pgn1, const Polygon_2& pgn2) { typedef Kernel_ Kernel; typedef Container_ Container; Minkowski_sum_by_convolution_2 mink_sum; 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)); return (Polygon_with_holes_2(sum_bound, sum_holes.begin(), sum_holes.end())); } /*! * Compute the Minkowski sum of two simple polygons using the convolution * method. This function defaults to calling the reduced convolution method, * as it is more efficient in most cases. * 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. * \return The resulting polygon with holes, representing the sum. * * \sa `CGAL::minkowski_sum_by_reduced_convolution_2()` * \sa `CGAL::minkowski_sum_by_full_convolution_2()` */ template Polygon_with_holes_2 minkowski_sum_2(const Polygon_2& pgn1, const Polygon_2& pgn2) { return minkowski_sum_by_reduced_convolution_2(pgn1, pgn2); } /*! * Compute the Minkowski sum of two polygons 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 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_by_reduced_convolution_2()` * \sa `CGAL::minkowski_sum_by_full_convolution_2()` */ template Polygon_with_holes_2 minkowski_sum_2(const Polygon_with_holes_2& pgn1, const Polygon_with_holes_2& pgn2) { return minkowski_sum_by_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 simple polygon. * \param[in] pgn2 The polygon with holes. * \return The resulting polygon with holes, representing the sum. * * \sa `CGAL::minkowski_sum_by_reduced_convolution_2()` * \sa `CGAL::minkowski_sum_by_full_convolution_2()` */ template Polygon_with_holes_2 minkowski_sum_2(const Polygon_2& pgn1, const Polygon_with_holes_2& pgn2) { return minkowski_sum_by_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_by_reduced_convolution_2()` * \sa `CGAL::minkowski_sum_by_full_convolution_2()` */ template Polygon_with_holes_2 minkowski_sum_2(const Polygon_with_holes_2& pgn1, const Polygon_2& pgn2) { return minkowski_sum_by_reduced_convolution_2(pgn1, pgn2); } /*! * Compute the Minkowski sum of two simple polygons by decomposing each * polygon to convex sub-polygons and computing the union of the pairwise * Minkowski sums of the sub-polygons. * 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. * \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_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 two simple polygons by decomposing each * polygon to convex sub-polygons and computing the union of the pairwise * Minkowski sums of the sub-polygons. * 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. * \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_2& pgn1, const Polygon_2& pgn2, const DecompositionStrategy_& decomposition_strategy, const typename Minkowski_sum_by_decomposition_2::Traits_2& traits) { typedef Container_ Container; typedef DecompositionStrategy_ Decomposition_strategy; Minkowski_sum_by_decomposition_2 mink_sum(decomposition_strategy, traits); return mink_sum(pgn1, pgn2); } /*! * 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[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 Polygon_with_holes_2 minkowski_sum_2(const Polygon_with_holes_2& pgn1, const Polygon_with_holes_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 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[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 Polygon_with_holes_2 minkowski_sum_2(const Polygon_with_holes_2& pgn1, const Polygon_with_holes_2& pgn2, const DecompositionStrategy_& decomposition_strategy, const typename Minkowski_sum_by_decomposition_2::Traits_2& traits) { typedef Kernel_ Kernel; typedef Container_ Container; typedef DecompositionStrategy_ Decomposition_strategy; 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(pgn2, pgn1, filtered_pgn2); return mink_sum(filtered_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 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 Polygon_with_holes_2 minkowski_sum_2(const Polygon_2& pgn1, const Polygon_with_holes_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 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 Polygon_with_holes_2 minkowski_sum_2(const Polygon_2& pgn1, const Polygon_with_holes_2& pgn2, const DecompositionStrategy_& decomposition_strategy, const typename Minkowski_sum_by_decomposition_2::Traits_2& traits) { typedef Kernel_ Kernel; typedef Container_ Container; typedef DecompositionStrategy_ Decomposition_strategy; Minkowski_sum_by_decomposition_2 mink_sum(decomposition_strategy, traits); Hole_filter_2 hole_filter; Polygon_with_holes_2 filtered_pgn2; hole_filter(pgn2, pgn1, filtered_pgn2); 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