This was caused by mistakenly swapping the key and the value in a vertex map.
This commit is contained in:
parent
b878b3a80f
commit
614cd7081d
1 changed files with 19 additions and 12 deletions
|
@ -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(
|
inline static std::unordered_map<Point, Point, PointHash> try_to_fix_degenerated_voronoi_diagram_by_rotation(
|
||||||
Geometry::VoronoiDiagram &voronoi_diagram,
|
Geometry::VoronoiDiagram &voronoi_diagram,
|
||||||
const Polygons &polys,
|
const Polygons &polys,
|
||||||
Polygons &polys_copy,
|
Polygons &polys_rotated,
|
||||||
std::vector<SkeletalTrapezoidation::Segment> &segments,
|
std::vector<SkeletalTrapezoidation::Segment> &segments,
|
||||||
const double fix_angle)
|
const double fix_angle)
|
||||||
{
|
{
|
||||||
std::unordered_map<Point, Point, PointHash> vertex_mapping;
|
std::unordered_map<Point, Point, PointHash> vertex_mapping;
|
||||||
for (Polygon &poly : polys_copy)
|
for (Polygon &poly : polys_rotated)
|
||||||
poly.rotate(fix_angle);
|
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) {
|
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)
|
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();
|
segments.clear();
|
||||||
for (size_t poly_idx = 0; poly_idx < polys_copy.size(); poly_idx++)
|
for (size_t poly_idx = 0; poly_idx < polys_rotated.size(); poly_idx++)
|
||||||
for (size_t point_idx = 0; point_idx < polys_copy[poly_idx].size(); point_idx++)
|
for (size_t point_idx = 0; point_idx < polys_rotated[poly_idx].size(); point_idx++)
|
||||||
segments.emplace_back(&polys_copy, poly_idx, point_idx);
|
segments.emplace_back(&polys_rotated, poly_idx, point_idx);
|
||||||
|
|
||||||
voronoi_diagram.clear();
|
voronoi_diagram.clear();
|
||||||
construct_voronoi(segments.begin(), segments.end(), &voronoi_diagram);
|
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));
|
assert(Geometry::VoronoiUtilsCgal::is_voronoi_diagram_planar_intersection(voronoi_diagram));
|
||||||
|
|
||||||
return vertex_mapping;
|
return vertex_mapping;
|
||||||
|
@ -607,10 +614,6 @@ void SkeletalTrapezoidation::constructFromPolygons(const Polygons& polys)
|
||||||
}
|
}
|
||||||
#endif
|
#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
|
// Try to detect cases when some Voronoi vertex is missing and when
|
||||||
// the Voronoi diagram is not planar.
|
// the Voronoi diagram is not planar.
|
||||||
// When any Voronoi vertex is missing, or the Voronoi diagram is not
|
// When any Voronoi vertex is missing, or the Voronoi diagram is not
|
||||||
|
@ -731,6 +734,10 @@ process_voronoi_diagram:
|
||||||
if (degenerated_voronoi_diagram)
|
if (degenerated_voronoi_diagram)
|
||||||
rotate_back_skeletal_trapezoidation_graph_after_fix(this->graph, fix_angle, vertex_mapping);
|
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();
|
separatePointyQuadEndNodes();
|
||||||
|
|
||||||
graph.collapseSmallEdges();
|
graph.collapseSmallEdges();
|
||||||
|
|
Loading…
Add table
Reference in a new issue