From 0941bc214ce33a1abba37c78c3c36add8c49d739 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sat, 12 Aug 2023 20:27:05 +0200 Subject: [PATCH] WIP --- src/db/db/dbTriangle.cc | 18 +++++++- src/db/db/dbTriangle.h | 2 + src/db/db/dbTriangles.cc | 62 +++++++++++++--------------- src/db/unit_tests/dbTriangleTests.cc | 4 ++ 4 files changed, 50 insertions(+), 36 deletions(-) diff --git a/src/db/db/dbTriangle.cc b/src/db/db/dbTriangle.cc index 60071f41a..124510cfc 100644 --- a/src/db/db/dbTriangle.cc +++ b/src/db/db/dbTriangle.cc @@ -148,14 +148,14 @@ TriangleEdge::TriangleEdge (Vertex *v1, Vertex *v2) void TriangleEdge::set_left (Triangle *t) { - tl_assert (left () == 0); + tl_assert (t == 0 || left () == 0); mp_left = t; } void TriangleEdge::set_right (Triangle *t) { - tl_assert (right () == 0); + tl_assert (t == 0 || right () == 0); mp_right = t; } @@ -345,6 +345,20 @@ Triangle::Triangle (TriangleEdge *e1, TriangleEdge *e2, TriangleEdge *e3) } } +void +Triangle::unlink () +{ + for (int i = 0; i != 3; ++i) { + db::TriangleEdge *e = edge (i); + if (e->left () == this) { + e->set_left (0); + } + if (e->right () == this) { + e->set_right (0); + } + } +} + std::string Triangle::to_string (bool with_id) const { diff --git a/src/db/db/dbTriangle.h b/src/db/db/dbTriangle.h index 6d95f99e7..3459ad155 100644 --- a/src/db/db/dbTriangle.h +++ b/src/db/db/dbTriangle.h @@ -408,6 +408,8 @@ public: Triangle (); Triangle (TriangleEdge *e1, TriangleEdge *e2, TriangleEdge *e3); + void unlink (); + bool is_outside () const { return m_is_outside; } void set_outside (bool o) { m_is_outside = o; } diff --git a/src/db/db/dbTriangles.cc b/src/db/db/dbTriangles.cc index b390d5abd..ec97bb179 100644 --- a/src/db/db/dbTriangles.cc +++ b/src/db/db/dbTriangles.cc @@ -496,14 +496,39 @@ Triangles::fix_triangles (const std::vector &tris, const std::ve } -std::pair, TriangleEdge *> Triangles::flip(TriangleEdge *edge) +std::pair, TriangleEdge *> Triangles::flip (TriangleEdge *edge) { + db::Triangle *t1 = edge->left (); + db::Triangle *t2 = edge->right (); - // @@@ + bool outside = t1->is_outside (); + tl_assert (t1->is_outside () == outside); + // prepare for the new triangle to replace this one + t1->unlink (); + t2->unlink (); + + db::Vertex *t1_vext = t1->opposite (edge); + db::TriangleEdge *t1_sext1 = t1->find_edge_with (t1_vext, edge->v1 ()); + db::TriangleEdge *t1_sext2 = t1->find_edge_with (t1_vext, edge->v2 ()); + + db::Vertex *t2_vext = t2->opposite (edge); + db::TriangleEdge *t2_sext1 = t2->find_edge_with (t2_vext, edge->v1 ()); + db::TriangleEdge *t2_sext2 = t2->find_edge_with (t2_vext, edge->v2 ()); + + db::TriangleEdge *s_new = create_edge (t1_vext, t2_vext); + + db::Triangle *t1_new = create_triangle (s_new, t1_sext1, t2_sext1); + t1_new->set_outside (outside); + db::Triangle *t2_new = create_triangle (s_new, t1_sext2, t2_sext2); + t2_new->set_outside (outside); + + remove (t1); + remove (t2); + + return std::make_pair (std::make_pair (t1_new, t2_new), s_new); } - std::vector Triangles::fill_concave_corners (const std::vector &edges) { @@ -671,9 +696,6 @@ class Triangles(object): assert(False) - def _fill_concave_corners(self, edges: [TriangleEdge]) -> [Triangle]: - - def find_triangle_for_vertex(self, p: Point) -> [Triangle]: edge = self.find_closest_edge(p) @@ -1000,34 +1022,6 @@ class Triangles(object): return Edge(s.left.ext_vertex(s), s.right.ext_vertex(s)) - def flip(self, s: TriangleEdge) -> (Triangle, Triangle, TriangleEdge): - - t1 = s.left - t2 = s.right - - assert t1.is_outside == t2.is_outside - - s.unlink() - self.triangles.remove(t1) - self.triangles.remove(t2) - - t1_vext = t1.ext_vertex(s) - t1_sext1 = t1.find_edge_with(t1_vext, s.p1) - t1_sext2 = t1.find_edge_with(t1_vext, s.p2) - t2_vext = t2.ext_vertex(s) - t2_sext1 = t2.find_edge_with(t2_vext, s.p1) - t2_sext2 = t2.find_edge_with(t2_vext, s.p2) - s_new = TriangleEdge(t1_vext, t2_vext) - t1_new = Triangle(s_new, t1_sext1, t2_sext1) - t1_new.is_outside = t1.is_outside - t2_new = Triangle(s_new, t1_sext2, t2_sext2) - t2_new.is_outside = t2.is_outside - - self.triangles.append(t1_new) - self.triangles.append(t2_new) - - return t1_new, t2_new, s_new - def _ensure_edge_inner(self, edge: Edge) -> [TriangleEdge]: crossed_edges = self.search_edges_crossing(edge) diff --git a/src/db/unit_tests/dbTriangleTests.cc b/src/db/unit_tests/dbTriangleTests.cc index 7830c5726..0b326e9b7 100644 --- a/src/db/unit_tests/dbTriangleTests.cc +++ b/src/db/unit_tests/dbTriangleTests.cc @@ -356,6 +356,10 @@ TEST(TriangleEdge_triangles) EXPECT_EQ (e1->common_vertex (e2.get ()) == &v2, true); EXPECT_EQ (e2->common_vertex (e4.get ()) == 0, true); + + tri->unlink (); + EXPECT_EQ (e1->has_triangle (tri.get ()), false); + EXPECT_EQ (e1->has_triangle (tri2.get ()), true); } TEST(TriangleEdge_side_of)