mirror of https://github.com/KLayout/klayout.git
WIP
This commit is contained in:
parent
f86f56fbb0
commit
0941bc214c
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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; }
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in New Issue