This commit is contained in:
Matthias Koefferlein
2026-08-21 01:17:25 +02:00
parent a435b186a7
commit ca45619b2b
2 changed files with 77 additions and 17 deletions
+17 -17
View File
@@ -241,36 +241,36 @@ Triangulation::insert (Vertex *vertex, std::list<tl::weak_ptr<Polygon> > *new_tr
}
// check, if the new vertex is on an edge (may be edge between triangles or edge on outside)
std::vector<Edge *> on_edges;
Edge *on_edge = 0;
std::vector<Edge *> 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
@@ -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)
}
}
}