Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/prusa3d/PrusaSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukáš Hejl <hejl.lukas@gmail.com>2022-08-30 13:27:41 +0300
committerLukáš Hejl <hejl.lukas@gmail.com>2022-08-30 13:29:06 +0300
commit614cd7081d4a33104272eb64d8f50939844ecbbd (patch)
tree93ddfe9c0a5c738599bb5f671b7fb26d3e111a92
parentb878b3a80f01df5bd271361c0f02ea5346eb47af (diff)
Fix of #8778 and #8760: Artifacts on models when Arachne was used.
This was caused by mistakenly swapping the key and the value in a vertex map.
-rw-r--r--src/libslic3r/Arachne/SkeletalTrapezoidation.cpp31
1 files changed, 19 insertions, 12 deletions
diff --git a/src/libslic3r/Arachne/SkeletalTrapezoidation.cpp b/src/libslic3r/Arachne/SkeletalTrapezoidation.cpp
index c7014aa01..04dede546 100644
--- a/src/libslic3r/Arachne/SkeletalTrapezoidation.cpp
+++ b/src/libslic3r/Arachne/SkeletalTrapezoidation.cpp
@@ -525,29 +525,36 @@ static bool has_missing_twin_edge(const SkeletalTrapezoidationGraph &graph)
inline static std::unordered_map<Point, Point, PointHash> try_to_fix_degenerated_voronoi_diagram_by_rotation(
Geometry::VoronoiDiagram &voronoi_diagram,
const Polygons &polys,
- Polygons &polys_copy,
+ Polygons &polys_rotated,
std::vector<SkeletalTrapezoidation::Segment> &segments,
const double fix_angle)
{
std::unordered_map<Point, Point, PointHash> vertex_mapping;
- for (Polygon &poly : polys_copy)
+ for (Polygon &poly : polys_rotated)
poly.rotate(fix_angle);
- assert(polys_copy.size() == polys.size());
+ assert(polys_rotated.size() == polys.size());
for (size_t poly_idx = 0; poly_idx < polys.size(); ++poly_idx) {
- assert(polys_copy[poly_idx].size() == polys[poly_idx].size());
+ assert(polys_rotated[poly_idx].size() == polys[poly_idx].size());
for (size_t point_idx = 0; point_idx < polys[poly_idx].size(); ++point_idx)
- vertex_mapping.insert({polys[poly_idx][point_idx], polys_copy[poly_idx][point_idx]});
+ vertex_mapping.insert({polys_rotated[poly_idx][point_idx], polys[poly_idx][point_idx]});
}
segments.clear();
- for (size_t poly_idx = 0; poly_idx < polys_copy.size(); poly_idx++)
- for (size_t point_idx = 0; point_idx < polys_copy[poly_idx].size(); point_idx++)
- segments.emplace_back(&polys_copy, poly_idx, point_idx);
+ for (size_t poly_idx = 0; poly_idx < polys_rotated.size(); poly_idx++)
+ for (size_t point_idx = 0; point_idx < polys_rotated[poly_idx].size(); point_idx++)
+ segments.emplace_back(&polys_rotated, poly_idx, point_idx);
voronoi_diagram.clear();
construct_voronoi(segments.begin(), segments.end(), &voronoi_diagram);
+#ifdef ARACHNE_DEBUG_VORONOI
+ {
+ static int iRun = 0;
+ dump_voronoi_to_svg(debug_out_path("arachne_voronoi-diagram-rotated-%d.svg", iRun++).c_str(), voronoi_diagram, to_points(polys), to_lines(polys));
+ }
+#endif
+
assert(Geometry::VoronoiUtilsCgal::is_voronoi_diagram_planar_intersection(voronoi_diagram));
return vertex_mapping;
@@ -607,10 +614,6 @@ void SkeletalTrapezoidation::constructFromPolygons(const Polygons& polys)
}
#endif
-#ifdef ARACHNE_DEBUG
- assert(Geometry::VoronoiUtilsCgal::is_voronoi_diagram_planar_intersection(voronoi_diagram));
-#endif
-
// Try to detect cases when some Voronoi vertex is missing and when
// the Voronoi diagram is not planar.
// When any Voronoi vertex is missing, or the Voronoi diagram is not
@@ -731,6 +734,10 @@ process_voronoi_diagram:
if (degenerated_voronoi_diagram)
rotate_back_skeletal_trapezoidation_graph_after_fix(this->graph, fix_angle, vertex_mapping);
+#ifdef ARACHNE_DEBUG
+ assert(Geometry::VoronoiUtilsCgal::is_voronoi_diagram_planar_intersection(voronoi_diagram));
+#endif
+
separatePointyQuadEndNodes();
graph.collapseSmallEdges();