WIP: remove vertex implemented for triangles

This commit is contained in:
Matthias Koefferlein 2023-08-13 21:40:09 +02:00
parent 576eacd0bf
commit a2e91532c4
3 changed files with 13 additions and 9 deletions

View File

@ -346,7 +346,6 @@ Triangle::Triangle (TriangleEdge *e1, TriangleEdge *e2, TriangleEdge *e3)
void
Triangle::unlink ()
{
// @@@ Is this really needed???
for (int i = 0; i != 3; ++i) {
db::TriangleEdge *e = edge (i);
if (e->left () == this) {

View File

@ -658,7 +658,9 @@ Triangles::find_inside_circle (const db::DPoint &center, double radius) const
void
Triangles::remove (db::Vertex *vertex, std::vector<db::Triangle *> *new_triangles)
{
if (vertex->is_outside ()) {
if (vertex->begin_edges () == vertex->end_edges ()) {
// removing an orphan vertex -> ignore
} else if (vertex->is_outside ()) {
remove_outside_vertex (vertex, new_triangles);
} else {
remove_inside_vertex (vertex, new_triangles);
@ -676,10 +678,15 @@ Triangles::remove_outside_vertex (db::Vertex *vertex, std::vector<db::Triangle *
}
for (auto t = to_remove.begin (); t != to_remove.end (); ++t) {
remove (*t);
(*t)->unlink ();
}
auto new_triangles = fill_concave_corners (outer_edges);
for (auto t = to_remove.begin (); t != to_remove.end (); ++t) {
remove (*t);
}
fix_triangles (new_triangles, std::vector<db::TriangleEdge *> (), new_triangles_out);
}

View File

@ -252,19 +252,17 @@ TEST(Triangle_test_heavy_remove)
}
}
int loop = 0; // @@@
while (! vertexes.empty ()) {
++loop; printf("@@@ %d\n", loop); fflush(stdout);
if (loop == 38) {
printf("@@@BANG!\n"); // @@@
}
unsigned int n = rand () % (unsigned int) vertexes.size ();
db::Vertex *v = vertexes [n];
tris.remove (v);
vertexes.erase (vertexes.begin () + n);
EXPECT_EQ (tris.check (), true);
// just a few times as it wastes time otherwise
if (vertexes.size () % 10 == 0) {
EXPECT_EQ (tris.check (), true);
}
}