From ff880ac3483f6600dfa70fca5fa1859a2f419460 Mon Sep 17 00:00:00 2001 From: remi durand Date: Sat, 31 Jul 2021 19:43:42 +0200 Subject: [PATCH] Fix thin_wall detection supermerill/SuperSlicer#1437 --- src/libslic3r/ClipperUtils.cpp | 4 ++-- src/libslic3r/MedialAxis.cpp | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/libslic3r/ClipperUtils.cpp b/src/libslic3r/ClipperUtils.cpp index 5b47e7a98..db5dd463c 100644 --- a/src/libslic3r/ClipperUtils.cpp +++ b/src/libslic3r/ClipperUtils.cpp @@ -532,8 +532,8 @@ bool test_path(const ClipperLib::Path &path) { ClipperLib::IntPoint centroid = ClipperLib::Centroid(path, area); for (const ClipperLib::IntPoint& pt : path) { // &0x3FFFFFFF to let (dx * dx + dy * dy) be storable into a int64 - ClipperLib::cInt dx = (pt.X - centroid.X) & 0x3FFFFFFF; - ClipperLib::cInt dy = (pt.Y - centroid.Y) & 0x3FFFFFFF; + ClipperLib::cInt dx = std::abs(pt.X - centroid.X) & 0x3FFFFFFF; + ClipperLib::cInt dy = std::abs(pt.Y - centroid.Y) & 0x3FFFFFFF; ClipperLib::cInt dist_sqrd = (dx * dx + dy * dy); max_dist_sqrd = std::max(max_dist_sqrd, dist_sqrd); } diff --git a/src/libslic3r/MedialAxis.cpp b/src/libslic3r/MedialAxis.cpp index 66deb155f..9c2c9a21f 100644 --- a/src/libslic3r/MedialAxis.cpp +++ b/src/libslic3r/MedialAxis.cpp @@ -1606,6 +1606,8 @@ check_circular(ExPolygon& expolygon, coord_t max_variation) { void MedialAxis::build(ThickPolylines &polylines_out) { + //static int id = 0; + //id++; //std::cout << this->id << "\n"; //{ // std::stringstream stri; @@ -1629,11 +1631,12 @@ MedialAxis::build(ThickPolylines &polylines_out) //check for circular shape double radius = check_circular(this->expolygon, this->min_width/4); - if (radius > 0) { + if (radius > 0 && this->expolygon.contour.points.size() > 4) { ExPolygons miniPeri = offset_ex(this->expolygon.contour, -radius / 2); if (miniPeri.size() == 1 && miniPeri[0].holes.size() == 0) { ThickPolyline thickPoly; thickPoly.points = miniPeri[0].contour.points; + thickPoly.points.push_back(thickPoly.points.front()); thickPoly.endpoints.first = false; thickPoly.endpoints.second = false; for (int i = 0; i < thickPoly.points.size(); i++) {