Used function smooth_outward in multi-material segmentation to get rid of artifacts arisen after merging multi-volume objects.
This commit is contained in:
parent
a426093f12
commit
cb93c8ce99
@ -4,6 +4,7 @@
|
|||||||
#include "Layer.hpp"
|
#include "Layer.hpp"
|
||||||
#include "Print.hpp"
|
#include "Print.hpp"
|
||||||
#include "VoronoiVisualUtils.hpp"
|
#include "VoronoiVisualUtils.hpp"
|
||||||
|
#include "MutablePolygon.hpp"
|
||||||
|
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <cfloat>
|
#include <cfloat>
|
||||||
@ -1421,7 +1422,7 @@ std::vector<std::vector<std::pair<ExPolygon, size_t>>> multi_material_segmentati
|
|||||||
// All expolygons are expanded by SCALED_EPSILON, merged, and then shrunk again by SCALED_EPSILON
|
// All expolygons are expanded by SCALED_EPSILON, merged, and then shrunk again by SCALED_EPSILON
|
||||||
// to ensure that very close polygons will be merged.
|
// to ensure that very close polygons will be merged.
|
||||||
ex_polygons = union_ex(ex_polygons);
|
ex_polygons = union_ex(ex_polygons);
|
||||||
// Remove all expolygons and holes with an area less than 0.01mm^2
|
// Remove all expolygons and holes with an area less than 0.1mm^2
|
||||||
remove_small_and_small_holes(ex_polygons, Slic3r::sqr(scale_(0.1f)));
|
remove_small_and_small_holes(ex_polygons, Slic3r::sqr(scale_(0.1f)));
|
||||||
// Occasionally, some input polygons contained self-intersections that caused problems with Voronoi diagrams
|
// Occasionally, some input polygons contained self-intersections that caused problems with Voronoi diagrams
|
||||||
// and consequently with the extraction of colored segments by function extract_colored_segments.
|
// and consequently with the extraction of colored segments by function extract_colored_segments.
|
||||||
@ -1430,19 +1431,19 @@ std::vector<std::vector<std::pair<ExPolygon, size_t>>> multi_material_segmentati
|
|||||||
// Such close points sometimes caused that the Voronoi diagram has self-intersecting edges around these vertices.
|
// Such close points sometimes caused that the Voronoi diagram has self-intersecting edges around these vertices.
|
||||||
// This consequently leads to issues with the extraction of colored segments by function extract_colored_segments.
|
// This consequently leads to issues with the extraction of colored segments by function extract_colored_segments.
|
||||||
// Calling expolygons_simplify fixed these issues.
|
// Calling expolygons_simplify fixed these issues.
|
||||||
input_expolygons[layer_idx] = simplify_polygons_ex(to_polygons(expolygons_simplify(offset_ex(ex_polygons, float(-10 * SCALED_EPSILON)), 5 * SCALED_EPSILON)));
|
input_expolygons[layer_idx] = smooth_outward(expolygons_simplify(offset_ex(ex_polygons, -10.f * float(SCALED_EPSILON)), 5 * SCALED_EPSILON), 10 * coord_t(SCALED_EPSILON));
|
||||||
input_polygons[layer_idx] = to_polygons(input_expolygons[layer_idx]);
|
input_polygons[layer_idx] = to_polygons(input_expolygons[layer_idx]);
|
||||||
}
|
}
|
||||||
}); // end of parallel_for
|
}); // end of parallel_for
|
||||||
BOOST_LOG_TRIVIAL(debug) << "MMU segmentation - slices preparation in parallel - end";
|
BOOST_LOG_TRIVIAL(debug) << "MMU segmentation - slices preparation in parallel - end";
|
||||||
|
|
||||||
for (size_t layer_idx = 0; layer_idx < layers.size(); ++layer_idx) {
|
for (size_t layer_idx = 0; layer_idx < layers.size(); ++layer_idx) {
|
||||||
throw_on_cancel_callback();
|
throw_on_cancel_callback();
|
||||||
BoundingBox bbox(get_extents(input_expolygons[layer_idx]));
|
BoundingBox bbox(get_extents(input_polygons[layer_idx]));
|
||||||
// Projected triangles may slightly exceed the input polygons.
|
// Projected triangles may slightly exceed the input polygons.
|
||||||
bbox.offset(20 * SCALED_EPSILON);
|
bbox.offset(20 * SCALED_EPSILON);
|
||||||
edge_grids[layer_idx].set_bbox(bbox);
|
edge_grids[layer_idx].set_bbox(bbox);
|
||||||
edge_grids[layer_idx].create(input_expolygons[layer_idx], coord_t(scale_(10.)));
|
edge_grids[layer_idx].create(input_polygons[layer_idx], coord_t(scale_(10.)));
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_LOG_TRIVIAL(debug) << "MMU segmentation - projection of painted triangles - begin";
|
BOOST_LOG_TRIVIAL(debug) << "MMU segmentation - projection of painted triangles - begin";
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
#include "Point.hpp"
|
#include "Point.hpp"
|
||||||
#include "Polygon.hpp"
|
#include "Polygon.hpp"
|
||||||
|
#include "ExPolygon.hpp"
|
||||||
|
|
||||||
namespace Slic3r {
|
namespace Slic3r {
|
||||||
|
|
||||||
@ -330,6 +331,24 @@ inline Polygons smooth_outward(Polygons polygons, coord_t clip_dist_scaled)
|
|||||||
return polygons;
|
return polygons;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline ExPolygons smooth_outward(ExPolygons expolygons, coord_t clip_dist_scaled)
|
||||||
|
{
|
||||||
|
MutablePolygon mp;
|
||||||
|
for (ExPolygon &expolygon : expolygons) {
|
||||||
|
mp.assign(expolygon.contour, expolygon.contour.size() * 2);
|
||||||
|
smooth_outward(mp, clip_dist_scaled);
|
||||||
|
mp.polygon(expolygon.contour);
|
||||||
|
for (Polygon &hole : expolygon.holes) {
|
||||||
|
mp.assign(hole, hole.size() * 2);
|
||||||
|
smooth_outward(mp, clip_dist_scaled);
|
||||||
|
mp.polygon(hole);
|
||||||
|
}
|
||||||
|
expolygon.holes.erase(std::remove_if(expolygon.holes.begin(), expolygon.holes.end(), [](const auto &p) { return p.empty(); }), expolygon.holes.end());
|
||||||
|
}
|
||||||
|
expolygons.erase(std::remove_if(expolygons.begin(), expolygons.end(), [](const auto &p) { return p.empty(); }), expolygons.end());
|
||||||
|
return expolygons;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // slic3r_MutablePolygon_hpp_
|
#endif // slic3r_MutablePolygon_hpp_
|
||||||
|
Loading…
Reference in New Issue
Block a user