Triangle: bug fixes

This commit is contained in:
Matthias Koefferlein 2023-08-15 21:05:08 +02:00
parent bfccd24016
commit 26f1219cc5
3 changed files with 17 additions and 9 deletions

View File

@ -1393,9 +1393,9 @@ static bool is_skinny (db::Triangle *tri, const Triangles::TriangulateParameters
return false; return false;
} else { } else {
auto cr = tri->circumcircle (); 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) { 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; double delta = (fabs (lmin / cr.second) + fabs (param.b)) * db::epsilon;
return lmin / cr.second < param.b - delta; return lmin / cr.second < param.b - delta;
@ -1461,7 +1461,7 @@ Triangles::triangulate (const db::Region &region, const TriangulateParameters &p
} }
// @@@ TODO: break if iteration gets stuck // @@@ TODO: break if iteration gets stuck
while (nloop < 20) { // @@@ while (nloop < parameters.max_iterations) { // @@@
++nloop; ++nloop;
tl::info << "Iteration " << nloop << " .."; tl::info << "Iteration " << nloop << " ..";
@ -1548,7 +1548,7 @@ Triangles::triangulate (const db::Region &region, const TriangulateParameters &p
} }
// @@@ tris.dump_as_gdstxt("debug2.txt") // @@@ dump ("debug2.gds"); // @@@
} }

View File

@ -45,7 +45,8 @@ public:
TriangulateParameters () TriangulateParameters ()
: b (1.0), : b (1.0),
max_area (0.0), max_area (0.0),
max_area_border (0.0) max_area_border (0.0),
max_iterations (std::numeric_limits<size_t>::max ())
{ } { }
/** /**
@ -62,6 +63,11 @@ public:
* @brief Max area for border triangles or zero for "use max_area" * @brief Max area for border triangles or zero for "use max_area"
*/ */
double max_area_border; double max_area_border;
/**
* @brief Max number of iterations
*/
size_t max_iterations;
}; };
typedef tl::shared_collection<db::Triangle> triangles_type; typedef tl::shared_collection<db::Triangle> triangles_type;

View File

@ -623,18 +623,20 @@ TEST(Triangles_test_create_constrained_delaunay)
TEST(Triangles_test_triangulate) TEST(Triangles_test_triangulate)
{ {
db::Region r; db::Region r;
r.insert (db::Box (0, 0, 1000, 1000)); r.insert (db::Box (0, 0, 10000, 10000));
db::Region r2; db::Region r2;
r2.insert (db::Box (200, 200, 800, 800)); r2.insert (db::Box (2000, 2000, 8000, 8000));
r -= r2; r -= r2;
db::Triangles::TriangulateParameters param; 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; db::Triangles tri;
tri.triangulate (r, param); tri.triangulate (r, param, 0.001);
tri.dump ("debug.gds"); tri.dump ("debug.gds");