19 #ifndef GEOMETRY__HULL_POCKETS_HPP_
20 #define GEOMETRY__HULL_POCKETS_HPP_
60 template<
typename Iter1,
typename Iter2>
61 typename std::vector<std::vector<typename std::iterator_traits<Iter1>::value_type>>
hull_pockets(
62 const Iter1 polygon_start,
63 const Iter1 polygon_end,
64 const Iter2 convex_hull_start,
65 const Iter2 convex_hull_end
68 auto pockets = std::vector<std::vector<typename std::iterator_traits<Iter1>::value_type>>{};
69 if (std::distance(polygon_start, polygon_end) <= 3) {
74 const auto in_convex_hull = [convex_hull_start, convex_hull_end](Iter1 p) {
76 convex_hull_start, convex_hull_end, [p](
auto hull_entry)
81 *p)) < std::numeric_limits<float32_t>::epsilon();
87 std::vector<typename std::iterator_traits<Iter1>::value_type> current_pocket{};
88 for (
auto it = polygon_start; it != polygon_end; it = std::next(it)) {
89 if (in_convex_hull(it)) {
90 if (current_pocket.size() > 1) {
91 current_pocket.emplace_back(*it);
92 pockets.push_back(current_pocket);
94 current_pocket.clear();
95 current_pocket.emplace_back(*it);
97 current_pocket.emplace_back(*it);
105 if (current_pocket.size() > 1) {
106 current_pocket.push_back(*polygon_start);
107 pockets.push_back(current_pocket);
116 #endif // GEOMETRY__HULL_POCKETS_HPP_