From 614cd7081d4a33104272eb64d8f50939844ecbbd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hejl?= <hejl.lukas@gmail.com>
Date: Tue, 30 Aug 2022 12:27:41 +0200
Subject: [PATCH] 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.
---
 .../Arachne/SkeletalTrapezoidation.cpp        | 31 ++++++++++++-------
 1 file 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();