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;
} 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 &region, 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 &region, const TriangulateParameters &p
}
// @@@ tris.dump_as_gdstxt("debug2.txt")
// @@@ dump ("debug2.gds"); // @@@
}

View File

@ -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<size_t>::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<db::Triangle> triangles_type;

View File

@ -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");