From ca45619b2b4cc595fd9441ec518f64587646fcd6 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Fri, 21 Aug 2026 01:17:25 +0200 Subject: [PATCH] WIP --- src/db/db/dbPLCTriangulation.cc | 34 +++++------ src/db/unit_tests/dbPLCTriangulationTests.cc | 60 ++++++++++++++++++++ 2 files changed, 77 insertions(+), 17 deletions(-) diff --git a/src/db/db/dbPLCTriangulation.cc b/src/db/db/dbPLCTriangulation.cc index face8c8f0..a00cf49b9 100644 --- a/src/db/db/dbPLCTriangulation.cc +++ b/src/db/db/dbPLCTriangulation.cc @@ -241,36 +241,36 @@ Triangulation::insert (Vertex *vertex, std::list > *new_tr } // check, if the new vertex is on an edge (may be edge between triangles or edge on outside) - std::vector on_edges; + Edge *on_edge = 0; std::vector on_vertex; for (int i = 0; i < 3; ++i) { + Edge *e = tris.front ()->edge (i); -#if 0 // @@@ - if (e->side_of (*vertex) == 0) { -#else // @@@ + auto ee = e->edge (); - double snap = 1e-3; - if (std::abs (ee.distance (*vertex)) < snap * ee.length ()) { -#endif // @@@ - if (is_equal (*vertex, *e->v1 ()) || is_equal (*vertex, *e->v2 ())) { + double snap_range = 1e-5 * ee.length (); + + // @@@ refine? generalize "snap_range"? change "is_equal" in general? + if (std::abs (ee.distance (*vertex)) < snap_range) { + if (vertex->distance (*e->v1 ()) < snap_range || vertex->distance (*e->v2 ()) < snap_range) { on_vertex.push_back (e); - } else { - on_edges.push_back (e); + } else if (! on_edge) { + on_edge = e; } } + } - if (! on_vertex.empty ()) { + if (on_edge) { + + split_triangles_on_edge (vertex, on_edge, new_triangles); + return vertex; + + } else if (! on_vertex.empty ()) { tl_assert (on_vertex.size () == size_t (2)); return on_vertex.front ()->common_vertex (on_vertex [1]); - } else if (! on_edges.empty ()) { - - tl_assert (on_edges.size () == size_t (1)); - split_triangles_on_edge (vertex, on_edges.front (), new_triangles); - return vertex; - } else if (tris.size () == size_t (1)) { // the new vertex is inside one triangle diff --git a/src/db/unit_tests/dbPLCTriangulationTests.cc b/src/db/unit_tests/dbPLCTriangulationTests.cc index f867ee40b..44b90ff97 100644 --- a/src/db/unit_tests/dbPLCTriangulationTests.cc +++ b/src/db/unit_tests/dbPLCTriangulationTests.cc @@ -1078,6 +1078,65 @@ TEST(triangulate_issue1996) EXPECT_LT (plc.num_polygons (), size_t (132000)); } +TEST(triangulate_discussion_2883) +{ + db::DPoint contour[] = { + db::DPoint (-13025.428, -33338.541), + db::DPoint (-13127.959, -33236.01), + db::DPoint (-13132.732, -33240.783), + db::DPoint (-13135.914, -33237.601), + db::DPoint (-13026.136, -33127.823), + db::DPoint (-12923.605, -33230.354), + db::DPoint (-12920.423, -33227.172), + db::DPoint (-13022.954, -33124.641), + db::DPoint (-13014.999, -33116.686), + db::DPoint (-13011.817, -33119.868), + db::DPoint (-13016.59, -33124.641), + db::DPoint (-12914.059, -33227.172), + db::DPoint (-12923.605, -33236.718), + db::DPoint (-13026.136, -33134.187), + db::DPoint (-13029.317, -33137.369), + db::DPoint (-12926.787, -33239.899), + db::DPoint (-12936.333, -33249.445), + db::DPoint (-13038.863, -33146.915), + db::DPoint (-13042.045, -33150.097), + db::DPoint (-12939.515, -33252.627), + db::DPoint (-12949.061, -33262.173), + db::DPoint (-13051.591, -33159.643), + db::DPoint (-13054.773, -33162.825), + db::DPoint (-12952.243, -33265.355), + db::DPoint (-13012.701, -33325.813), + db::DPoint (-13115.231, -33223.283), + db::DPoint (-13118.413, -33226.464), + db::DPoint (-13015.882, -33328.995) + }; + + db::DPolygon poly; + poly.assign_hull (contour + 0, contour + sizeof (contour) / sizeof (contour[0])); + + double dbu = 0.001; + + db::plc::TriangulationParameters param; + param.min_b = 0.3; + + db::plc::Graph plc; + TestableTriangulation tri (&plc); + db::DCplxTrans trans = db::DCplxTrans (dbu) * db::DCplxTrans (db::DTrans (db::DPoint () - poly.box ().center ())); + tri.triangulate (trans * poly, param); + + EXPECT_EQ (tri.check (false), true); + + // for debugging: + // tri.dump ("debug.gds"); + + for (auto t = plc.begin (); t != plc.end (); ++t) { + EXPECT_GE (t->b (), param.min_b); + } + + EXPECT_GE (plc.num_polygons (), size_t (70)); + EXPECT_LE (plc.num_polygons (), size_t (72)); +} + TEST(triangulate_with_vertexes) { db::Point contour[] = { @@ -1172,3 +1231,4 @@ TEST(triangulate_with_vertexes) } } } +