From 77d007c4843c7736cf3d1b295cbc4f060ba8ca23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hejl?= Date: Tue, 23 Feb 2021 20:56:36 +0100 Subject: [PATCH] Fixed calculation of a distance from begin of a contour in the avoid crossing perimeters. The total length of a contour was incorrectly computed, which could cause the longest detour was selected instead of the shortest one in some cases. --- src/libslic3r/GCode/AvoidCrossingPerimeters.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/libslic3r/GCode/AvoidCrossingPerimeters.cpp b/src/libslic3r/GCode/AvoidCrossingPerimeters.cpp index 8801f5b3b..e00284fe1 100644 --- a/src/libslic3r/GCode/AvoidCrossingPerimeters.cpp +++ b/src/libslic3r/GCode/AvoidCrossingPerimeters.cpp @@ -283,8 +283,10 @@ static size_t avoid_perimeters_inner(const AvoidCrossingPerimeters::Boundary &bo AllIntersectionsVisitor visitor(edge_grid, intersections, Line(start, end)); edge_grid.visit_cells_intersecting_line(start, end, visitor); Vec2d dir = (end - start).cast(); - for (Intersection &intersection : intersections) - intersection.distance = boundary.boundaries_params[intersection.border_idx][intersection.line_idx]; + for (Intersection &intersection : intersections) { + float dist_from_line_begin = (intersection.point - boundary.boundaries[intersection.border_idx][intersection.line_idx]).cast().norm(); + intersection.distance = boundary.boundaries_params[intersection.border_idx][intersection.line_idx] + dist_from_line_begin; + } std::sort(intersections.begin(), intersections.end(), [dir](const auto &l, const auto &r) { return (r.point - l.point).template cast().dot(dir) > 0.; }); } @@ -568,7 +570,7 @@ static void precompute_polygon_distances(const Polygon &polygon, std::vector() - polygon[point_idx - 1].cast()).norm(); - polygon_distances_out.back() = polygon_distances_out[polygon.size() - 1] + (polygon.last_point().cast() - polygon.first_point().cast()).norm(); + polygon_distances_out.back() = polygon_distances_out[polygon.size() - 1] + (polygon.points.back().cast() - polygon.points.front().cast()).norm(); } static void precompute_expolygon_distances(const ExPolygon &ex_polygon, std::vector> &expolygon_distances_out)