diff --git a/Minkowski_sum_2/include/CGAL/Minkowski_sum_2/Hole_filter_2.h b/Minkowski_sum_2/include/CGAL/Minkowski_sum_2/Hole_filter_2.h new file mode 100644 index 00000000000..4f472fddd73 --- /dev/null +++ b/Minkowski_sum_2/include/CGAL/Minkowski_sum_2/Hole_filter_2.h @@ -0,0 +1,57 @@ +#ifndef CGAL_MINKOWSKI_SUM_HOLE_FILTER_2_H +#define CGAL_MINKOWSKI_SUM_HOLE_FILTER_2_H + +#include +#include + +namespace CGAL { + +template +class Hole_filter_2 +{ + +private: + + typedef Kernel_ Kernel; + typedef Container_ Container; + + typedef CGAL::Polygon_with_holes_2 Polygon_with_holes_2; + +public: + + void operator()(const Polygon_with_holes_2 &pgn1, const Polygon_with_holes_2 &pgn2, + Polygon_with_holes_2 &filtered_pgn1) const + { + filtered_pgn1 = pgn1; + + Bbox_2 boundary_bbox; + typename Polygon_with_holes_2::Hole_iterator it; + + std::vector to_erase; + boundary_bbox = pgn2.outer_boundary().bbox(); + + it = filtered_pgn1.holes_begin(); + while (it != filtered_pgn1.holes_end()) + { + Bbox_2 hole_bbox = (*it).bbox(); + + if (hole_bbox.ymax()-hole_bbox.ymin() < boundary_bbox.ymax()-boundary_bbox.ymin() || + hole_bbox.xmax()-hole_bbox.xmin() < boundary_bbox.xmax()-boundary_bbox.xmin()) + { + to_erase.push_back(it); + } + ++it; + } + + typename std::vector::iterator it2 = to_erase.begin(); + while (it2 != to_erase.end()) + { + filtered_pgn1.erase_hole(*it2); + ++it2; + } + } +}; + +} // namespace CGAL + +#endif diff --git a/Minkowski_sum_2/include/CGAL/minkowski_sum_2.h b/Minkowski_sum_2/include/CGAL/minkowski_sum_2.h index 78dcdcb715c..c06013e3fc2 100644 --- a/Minkowski_sum_2/include/CGAL/minkowski_sum_2.h +++ b/Minkowski_sum_2/include/CGAL/minkowski_sum_2.h @@ -21,6 +21,7 @@ #include #include +#include #include #include #include @@ -79,11 +80,19 @@ minkowski_sum_reduced_convolution_2(const Polygon_with_holes_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 (pgn1, 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(), @@ -252,7 +261,16 @@ minkowski_sum_2(const Polygon_with_holes_2& pgn1, { typename Minkowski_sum_by_decomposition_2::Traits_2 traits; - return minkowski_sum_2(pgn1, pgn2, 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 minkowski_sum_2(filtered_pgn1, filtered_pgn2, decomposition_strategy, traits); } /*! @@ -282,7 +300,16 @@ minkowski_sum_2(const Polygon_with_holes_2& pgn1, Minkowski_sum_by_decomposition_2 mink_sum(decomposition_strategy, traits); - Polygon_with_holes_2 sum = mink_sum(pgn1, 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; } @@ -305,6 +332,9 @@ minkowski_sum_2(const Polygon_2& pgn1, { typename Minkowski_sum_by_decomposition_2::Traits_2 traits; + + // TODO: Apply Hole_filter_2 + return minkowski_sum_2(pgn1, pgn2, decomposition_strategy, traits); } @@ -335,6 +365,9 @@ minkowski_sum_2(const Polygon_2& pgn1, Minkowski_sum_by_decomposition_2 mink_sum(decomposition_strategy, traits); + + // TODO: Apply Hole_filter_2 + Polygon_with_holes_2 sum = mink_sum(pgn1, pgn2); return sum; }