diff options
author | Lukáš Hejl <hejl.lukas@gmail.com> | 2022-08-30 13:27:41 +0300 |
---|---|---|
committer | Lukáš Hejl <hejl.lukas@gmail.com> | 2022-08-30 13:29:06 +0300 |
commit | 614cd7081d4a33104272eb64d8f50939844ecbbd (patch) | |
tree | 93ddfe9c0a5c738599bb5f671b7fb26d3e111a92 | |
parent | b878b3a80f01df5bd271361c0f02ea5346eb47af (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.cpp | 31 |
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(); |