Skip to content

Commit

Permalink
Use buffer with miter corners where possible to improve performance
Browse files Browse the repository at this point in the history
  • Loading branch information
eyal0 committed Jul 3, 2020
1 parent a3a2475 commit 68cca9d
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 2 deletions.
27 changes: 27 additions & 0 deletions bg_helpers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,33 @@ multi_polygon_type_fp buffer(multi_polygon_type_fp const & geometry_in, coordina
}
}

multi_polygon_type_fp buffer_miter(multi_polygon_type_fp const & geometry_in, coordinate_type_fp expand_by) {
if (expand_by == 0) {
return geometry_in;
} else {
multi_polygon_type_fp geometry_out;
bg::buffer(geometry_in, geometry_out,
bg::strategy::buffer::distance_symmetric<coordinate_type_fp>(expand_by),
bg::strategy::buffer::side_straight(),
bg::strategy::buffer::join_miter(expand_by),
bg::strategy::buffer::end_round(points_per_circle),
bg::strategy::buffer::point_circle(points_per_circle));
return geometry_out;
}
}

template<typename CoordinateType>
multi_polygon_type_fp buffer(polygon_type_fp const & geometry_in, CoordinateType expand_by) {
return buffer(multi_polygon_type_fp{geometry_in}, expand_by);
}

template multi_polygon_type_fp buffer(polygon_type_fp const&, double);

template<typename CoordinateType>
multi_polygon_type_fp buffer_miter(polygon_type_fp const & geometry_in, CoordinateType expand_by) {
return buffer_miter(multi_polygon_type_fp{geometry_in}, expand_by);
}

template<typename CoordinateType>
multi_polygon_type_fp buffer(linestring_type_fp const & geometry_in, CoordinateType expand_by) {
if (expand_by == 0) {
Expand Down Expand Up @@ -99,4 +119,11 @@ multi_polygon_type_fp buffer(ring_type_fp const & geometry_in, CoordinateType ex

template multi_polygon_type_fp buffer(ring_type_fp const&, double);

template<typename CoordinateType>
multi_polygon_type_fp buffer_miter(ring_type_fp const & geometry_in, CoordinateType expand_by) {
return buffer_miter(polygon_type_fp{geometry_in}, expand_by);
}

template multi_polygon_type_fp buffer_miter(ring_type_fp const&, double);

} // namespace bg_helpers
5 changes: 5 additions & 0 deletions bg_helpers.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ namespace bg_helpers {
// 0, unlike bg::buffer.
multi_polygon_type_fp buffer(multi_polygon_type_fp const & geometry_in, coordinate_type_fp expand_by);

multi_polygon_type_fp buffer_miter(multi_polygon_type_fp const & geometry_in, coordinate_type_fp expand_by);

template<typename CoordinateType>
multi_polygon_type_fp buffer(polygon_type_fp const & geometry_in, CoordinateType expand_by);

Expand All @@ -27,6 +29,9 @@ multi_polygon_type_fp buffer(multi_linestring_type_fp const & geometry_in, Coord
template<typename CoordinateType>
multi_polygon_type_fp buffer(ring_type_fp const & geometry_in, CoordinateType expand_by);

template<typename CoordinateType>
multi_polygon_type_fp buffer_miter(ring_type_fp const & geometry_in, CoordinateType expand_by);

} // namespace bg_helpers

#endif //BG_HELPERS_HPP
2 changes: 1 addition & 1 deletion path_finding.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ class PathFindingSurface {
}),
all_vertices.end());

total_keep_in_grown = bg_helpers::buffer(total_keep_in, tolerance);
total_keep_in_grown = bg_helpers::buffer_miter(total_keep_in, tolerance);
}
multi_polygon_type_fp total_keep_in_grown;
vector<point_type_fp> all_vertices;
Expand Down
2 changes: 1 addition & 1 deletion surface_vectorial.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@ vector<polygon_type_fp> find_thermal_reliefs(const multi_polygon_type_fp& millin
auto thermal_hole = inner;
bg::correct(thermal_hole); // Convert it from a hole to a filled-in shape.
multi_polygon_type_fp shrunk_thermal_hole =
bg_helpers::buffer(thermal_hole, -tolerance);
bg_helpers::buffer_miter(thermal_hole, -tolerance);
bool empty_hole = !bg::intersects(shrunk_thermal_hole, milling_surface);
if (!empty_hole) {
continue;
Expand Down

0 comments on commit 68cca9d

Please sign in to comment.