diff --git a/src/db/db/dbTriangles.cc b/src/db/db/dbTriangles.cc index 0d51148f9..b3e6a057d 100644 --- a/src/db/db/dbTriangles.cc +++ b/src/db/db/dbTriangles.cc @@ -1393,9 +1393,9 @@ static bool is_skinny (db::Triangle *tri, const Triangles::TriangulateParameters return false; } else { auto cr = tri->circumcircle (); - double lmin = tri->edge (0)->d ().sq_length (); + double lmin = tri->edge (0)->d ().length (); for (int i = 1; i < 3; ++i) { - lmin = std::min (lmin, tri->edge (i)->d ().sq_length ()); + lmin = std::min (lmin, tri->edge (i)->d ().length ()); } double delta = (fabs (lmin / cr.second) + fabs (param.b)) * db::epsilon; return lmin / cr.second < param.b - delta; @@ -1461,7 +1461,7 @@ Triangles::triangulate (const db::Region ®ion, const TriangulateParameters &p } // @@@ TODO: break if iteration gets stuck - while (nloop < 20) { // @@@ + while (nloop < parameters.max_iterations) { // @@@ ++nloop; tl::info << "Iteration " << nloop << " .."; @@ -1548,7 +1548,7 @@ Triangles::triangulate (const db::Region ®ion, const TriangulateParameters &p } - // @@@ tris.dump_as_gdstxt("debug2.txt") + // @@@ dump ("debug2.gds"); // @@@ } diff --git a/src/db/db/dbTriangles.h b/src/db/db/dbTriangles.h index 4e4743482..2cd5d8d62 100644 --- a/src/db/db/dbTriangles.h +++ b/src/db/db/dbTriangles.h @@ -45,7 +45,8 @@ public: TriangulateParameters () : b (1.0), max_area (0.0), - max_area_border (0.0) + max_area_border (0.0), + max_iterations (std::numeric_limits::max ()) { } /** @@ -62,6 +63,11 @@ public: * @brief Max area for border triangles or zero for "use max_area" */ double max_area_border; + + /** + * @brief Max number of iterations + */ + size_t max_iterations; }; typedef tl::shared_collection triangles_type; diff --git a/src/db/unit_tests/dbTrianglesTests.cc b/src/db/unit_tests/dbTrianglesTests.cc index 3807d6cb1..6bfaa1825 100644 --- a/src/db/unit_tests/dbTrianglesTests.cc +++ b/src/db/unit_tests/dbTrianglesTests.cc @@ -623,18 +623,20 @@ TEST(Triangles_test_create_constrained_delaunay) TEST(Triangles_test_triangulate) { db::Region r; - r.insert (db::Box (0, 0, 1000, 1000)); + r.insert (db::Box (0, 0, 10000, 10000)); db::Region r2; - r2.insert (db::Box (200, 200, 800, 800)); + r2.insert (db::Box (2000, 2000, 8000, 8000)); r -= r2; db::Triangles::TriangulateParameters param; - param.max_area = 0.1; + param.b = 1.21; + param.max_area = 1.0; + param.max_area_border = 0.0; db::Triangles tri; - tri.triangulate (r, param); + tri.triangulate (r, param, 0.001); tri.dump ("debug.gds");