This commit is contained in:
Matthias Koefferlein 2023-08-12 20:27:05 +02:00
parent f86f56fbb0
commit 0941bc214c
4 changed files with 50 additions and 36 deletions

View File

@ -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
{

View File

@ -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; }

View File

@ -496,14 +496,39 @@ Triangles::fix_triangles (const std::vector<db::Triangle *> &tris, const std::ve
}
std::pair<std::pair<Triangle *, Triangle *>, TriangleEdge *> Triangles::flip(TriangleEdge *edge)
std::pair<std::pair<Triangle *, Triangle *>, 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<db::Triangle *>
Triangles::fill_concave_corners (const std::vector<db::TriangleEdge *> &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)

View File

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