diff --git a/bg_helpers.cpp b/bg_helpers.cpp index 6a4e3ff06..7daa91688 100644 --- a/bg_helpers.cpp +++ b/bg_helpers.cpp @@ -31,6 +31,21 @@ 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(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 multi_polygon_type_fp buffer(polygon_type_fp const & geometry_in, CoordinateType expand_by) { return buffer(multi_polygon_type_fp{geometry_in}, expand_by); @@ -38,6 +53,11 @@ multi_polygon_type_fp buffer(polygon_type_fp const & geometry_in, CoordinateType template multi_polygon_type_fp buffer(polygon_type_fp const&, double); +template +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 multi_polygon_type_fp buffer(linestring_type_fp const & geometry_in, CoordinateType expand_by) { if (expand_by == 0) { @@ -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 +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 diff --git a/bg_helpers.hpp b/bg_helpers.hpp index 7c313d941..f01b5350c 100644 --- a/bg_helpers.hpp +++ b/bg_helpers.hpp @@ -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 multi_polygon_type_fp buffer(polygon_type_fp const & geometry_in, CoordinateType expand_by); @@ -27,6 +29,9 @@ multi_polygon_type_fp buffer(multi_linestring_type_fp const & geometry_in, Coord template multi_polygon_type_fp buffer(ring_type_fp const & geometry_in, CoordinateType expand_by); +template +multi_polygon_type_fp buffer_miter(ring_type_fp const & geometry_in, CoordinateType expand_by); + } // namespace bg_helpers #endif //BG_HELPERS_HPP diff --git a/path_finding.cpp b/path_finding.cpp index 07808758b..eefaf9ea6 100644 --- a/path_finding.cpp +++ b/path_finding.cpp @@ -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 all_vertices; diff --git a/surface_vectorial.cpp b/surface_vectorial.cpp index a27125c88..494faaddb 100644 --- a/surface_vectorial.cpp +++ b/surface_vectorial.cpp @@ -166,7 +166,7 @@ vector 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;