Commit cc6df16d authored by Teseo Schneider's avatar Teseo Schneider
Browse files

fixed table

parent f238913f
Loading
Loading
Loading
Loading
+283 −47
Original line number Diff line number Diff line
@@ -58,23 +58,23 @@ class CutTable():
        self.create_two_vertex_on_plane_cut(5)

        # [0, 1, 3, 5]
        self.create_three_edges_cut([1, 3, 5])
        self.create_three_edges_cut([0, 3, 5])
        self.create_three_edges_cut([0, 1, 5])
        self.create_three_edges_cut([0, 1, 3])
        self.create_three_edges_cut1([1, 3, 5])
        self.create_three_edges_cut2([0, 3, 5])
        self.create_three_edges_cut2([0, 1, 5])
        self.create_three_edges_cut1([0, 1, 3])

        # [1, 2, 3, 4]
        self.create_three_edges_cut([2, 3, 4])
        self.create_three_edges_cut([1, 3, 4])
        self.create_three_edges_cut([1, 2, 4])
        self.create_three_edges_cut([1, 2, 3])
        self.create_three_edges_cut1([2, 3, 4])
        self.create_three_edges_cut1([1, 3, 4])
        self.create_three_edges_cut1([1, 2, 4])
        self.create_three_edges_cut1([1, 2, 3])


        # [0, 2, 4, 5]
        self.create_three_edges_cut([2, 4, 5])
        self.create_three_edges_cut([0, 4, 5])
        self.create_three_edges_cut([0, 2, 5])
        self.create_three_edges_cut([0, 2, 4])
        self.create_three_edges_cut2([2, 4, 5])
        self.create_three_edges_cut2([0, 4, 5])
        self.create_three_edges_cut2([0, 2, 5])
        self.create_three_edges_cut2([0, 2, 4])



@@ -762,12 +762,11 @@ class CutTable():
            self.add_tet(index, conf, [ee2, tip5, 4+index5, 7], pts, [4, 5, 6], edges)


    def create_three_edges_cut(self, edges):

    def create_three_edges_cut1(self, edges):
        index = self.index_for_edges(edges)
        assert(self.table[index] is None)

        # print(flags, self.int_to_flags(index))

        e0 = self.edges[edges[0], :]
        e1 = self.edges[edges[1], :]
        e2 = self.edges[edges[2], :]
@@ -820,15 +819,189 @@ class CutTable():
        for i in range(len(tmp)):
            if not tmp[i]:
                if len(tri4) <= 0:
                    tri4 = self.tet[i]
                    tri4 = self.tet[i].copy()
                    assert(len(tri5) <= 0)
                elif len(tri5) <= 0:
                    assert(len(tri4) > 0)
                    assert(len(tri5) <= 0)
                    tri5 = self.tet[i]
                    tri5 = self.tet[i].copy()

        p0 = (self.vertices[e0[0], :]+self.vertices[e0[1], :]) / 2
        p1 = (self.vertices[e1[0], :]+self.vertices[e1[1], :]) / 2
        p2 = (self.vertices[e2[0], :]+self.vertices[e2[1], :]) / 2


        self.new_points[index] = []


        q00 = list(set(quad0).intersection(tri4).intersection(tri5))[0]
        q10 = list(set(quad1).intersection(tri4).intersection(tri5))[0]

        # fix me tip
        tip = list(set(tri5).intersection(tri4))
        tip = tip[1]

        tri44 = list(tri4)
        tri55 = list(tri5)
        tri44.remove(tip)
        tri55.remove(tip)

        v1 = -1
        v2 = -1
        v3 = -1
        if tip in e0 and (tri44[0] in e0 or tri44[1] in e0):
            v1 = 4
            if tri44[0] in e0:
                v2 = tri44[0]
                v3 = tri44[1]
            else:
                v2 = tri44[1]
                v3 = tri44[0]
        elif tip in e1 and (tri44[0] in e1 or tri44[1] in e1):
            v1 = 5
            if tri44[0] in e1:
                v2 = tri44[0]
                v3 = tri44[1]
            else:
                v2 = tri44[1]
                v3 = tri44[0]
        elif tip in e2 and (tri44[0] in e2 or tri44[1] in e2):
            v1 = 6
            if tri44[0] in e2:
                v2 = tri44[0]
                v3 = tri44[1]
            else:
                v2 = tri44[1]
                v3 = tri44[0]
        else:
            assert(False)

        v5 = -1
        if v3 == tri55[0]:
            v5 = tri55[1]
        elif v3 == tri55[1]:
            v5 = tri55[0]


        v4 = -1

        if v3 in e0 and v5 in e0:
            v4 = 4
        elif v3 in e1 and v5 in e1:
            v4 = 5
        elif v3 in e2 and v5 in e2:
            v4 = 6
        else:
            assert(False)

        v6 = -1

        if v1 + v4 == 9:
            v6 = 6
        elif v1 + v4 == 10:
            v6 = 5
        elif v1 + v4 == 11:
            v6 = 4
        else:
            assert(False)

        self.add_tet(index, 0, [v3, v1, v6, v2], [p0, p1, p2], [4, 5, 6], edges)
        self.add_tet(index, 0, [v3, tip, v1, v6], [p0, p1, p2], [4, 5, 6], edges)
        self.add_tet(index, 0, [v6, tip, v4, v5], [p0, p1, p2], [4, 5, 6], edges)
        self.add_tet(index, 0, [v4, tip, v3, v6], [p0, p1, p2], [4, 5, 6], edges)

        self.add_edge(index, [[tip, v6], [v6, v3]])




        self.add_tet(index, 1, [v3, v1, v6, v2], [p0, p1, p2], [4, 5, 6], edges)
        self.add_tet(index, 1, [v1, v6, v5, v4], [p0, p1, p2], [4, 5, 6], edges)
        self.add_tet(index, 1, [v1, v5, tip, v4], [p0, p1, p2], [4, 5, 6], edges)
        self.add_tet(index, 1, [v3, v1, v6, v4], [p0, p1, p2], [4, 5, 6], edges)
        self.add_tet(index, 1, [tip, v3, v1, v4], [p0, p1, p2], [4, 5, 6], edges)

        self.add_edge(index, [[v1, v5], [v6, v3]])




        self.add_tet(index, 2, [v1, v6, v5, v4], [p0, p1, p2], [4, 5, 6], edges)
        self.add_tet(index, 2, [v1, v5, tip, v4], [p0, p1, p2], [4, 5, 6], edges)
        self.add_tet(index, 2, [v1, v6, v2, v4], [p0, p1, p2], [4, 5, 6], edges)
        self.add_tet(index, 2, [v2, v3, v4, tip], [p0, p1, p2], [4, 5, 6], edges)

        self.add_edge(index, [[v1, v5], [v4, v2]])



        self.add_tet(index, 3, [v1, v6, v2, v4], [p0, p1, p2], [4, 5, 6], edges)
        self.add_tet(index, 3, [v2, v3, v4, tip], [p0, p1, p2], [4, 5, 6], edges)
        self.add_tet(index, 3, [v1, v6, tip, v4], [p0, p1, p2], [4, 5, 6], edges)
        self.add_tet(index, 3, [tip, v6, v4, v5], [p0, p1, p2], [4, 5, 6], edges)

        self.add_edge(index, [[tip, v6], [v4, v2]])


    def create_three_edges_cut2(self, edges):
        index = self.index_for_edges(edges)
        assert(self.table[index] is None)


        e0 = self.edges[edges[0], :]
        e1 = self.edges[edges[1], :]
        e2 = self.edges[edges[2], :]

        quad0 = []
        tri0 = []
        quad1 = []
        tri1 = []

        tri4 = []
        tri5 = []

        face0 = -1
        face1 = -1

        quad, tri, face = self.get_quad(e0, e1, 4, 5)
        if len(quad) > 0:
            quad0 = quad
            tri0 = tri
            face0 = face

        quad, tri, face = self.get_quad(e0, e2, 4, 6)
        if len(quad) > 0:
            if len(quad0) > 0:
                assert(len(quad1) <= 0)
                quad1 = quad
                tri1 = tri
                face1 = face
            else:
                quad0 = quad
                tri0 = tri
                face0 = face

        quad, tri, face = self.get_quad(e1, e2, 5, 6)
        if len(quad) > 0:
            assert(len(quad0) > 0)
            assert(len(quad1) <= 0)
            quad1 = quad
            tri1 = tri
            face1 = face

        tmp = [False, False, False, False]
        tmp[face0] = True
        tmp[face1] = True

        # print(tri4, tri5)
        # print(ee1, ee2, tip4, tip5)
        for i in range(len(tmp)):
            if not tmp[i]:
                if len(tri4) <= 0:
                    tri4 = self.tet[i].copy()
                    assert(len(tri5) <= 0)
                elif len(tri5) <= 0:
                    assert(len(tri4) > 0)
                    assert(len(tri5) <= 0)
                    tri5 = self.tet[i].copy()

        p0 = (self.vertices[e0[0], :]+self.vertices[e0[1], :]) / 2
        p1 = (self.vertices[e1[0], :]+self.vertices[e1[1], :]) / 2
@@ -836,65 +1009,121 @@ class CutTable():


        self.new_points[index] = []
        new_p = (self.vertices[0,:]+self.vertices[1,:]+self.vertices[2,:]+self.vertices[3,:])/4
        self.new_points[index].append(new_p)


        q00 = list(set(quad0).intersection(tri4).intersection(tri5))[0]
        q10 = list(set(quad1).intersection(tri4).intersection(tri5))[0]

        # fix me tip
        tip = list(set(tri5).intersection(tri4))
        tip = tip[0]

        tri44 = list(tri4)
        tri55 = list(tri5)
        tri44.remove(tip)
        tri55.remove(tip)

        self.add_simple(index, 0, edges, tri0, tri1, tri4, tri5, [p0, p1, p2, new_p])
        v1 = -1
        v2 = -1
        v3 = -1
        if tip in e0 and (tri44[0] in e0 or tri44[1] in e0):
            v1 = 4
            if tri44[0] in e0:
                v2 = tri44[0]
                v3 = tri44[1]
            else:
                v2 = tri44[1]
                v3 = tri44[0]
        elif tip in e1 and (tri44[0] in e1 or tri44[1] in e1):
            v1 = 5
            if tri44[0] in e1:
                v2 = tri44[0]
                v3 = tri44[1]
            else:
                v2 = tri44[1]
                v3 = tri44[0]
        elif tip in e2 and (tri44[0] in e2 or tri44[1] in e2):
            v1 = 6
            if tri44[0] in e2:
                v2 = tri44[0]
                v3 = tri44[1]
            else:
                v2 = tri44[1]
                v3 = tri44[0]
        else:
            assert(False)

        self.add_tet(index, 0, [quad0[0], quad0[1], quad0[2], 7], [p0, p1, p2, new_p], [4, 5, 6], edges)
        self.add_tet(index, 0, [quad0[0], quad0[2], quad0[3], 7], [p0, p1, p2, new_p], [4, 5, 6], edges)
        v5 = -1
        if v3 == tri55[0]:
            v5 = tri55[1]
        elif v3 == tri55[1]:
            v5 = tri55[0]

        self.add_tet(index, 0, [quad1[0], quad1[1], quad1[2], 7], [p0, p1, p2, new_p], [4, 5, 6], edges)
        self.add_tet(index, 0, [quad1[0], quad1[2], quad1[3], 7], [p0, p1, p2, new_p], [4, 5, 6], edges)

        self.add_edge(index, [[quad0[0], quad0[2]], [quad1[0], quad1[2]]])
        v4 = -1

        if v3 in e0 and v5 in e0:
            v4 = 4
        elif v3 in e1 and v5 in e1:
            v4 = 5
        elif v3 in e2 and v5 in e2:
            v4 = 6
        else:
            assert(False)

        v6 = -1

        self.add_simple(index, 1, edges, tri0, tri1, tri4, tri5, [p0, p1, p2, new_p])
        if v1 + v4 == 9:
            v6 = 6
        elif v1 + v4 == 10:
            v6 = 5
        elif v1 + v4 == 11:
            v6 = 4
        else:
            assert(False)

        self.add_tet(index, 1, [quad0[0], quad0[1], quad0[3], 7], [p0, p1, p2, new_p], [4, 5, 6], edges)
        self.add_tet(index, 1, [quad0[1], quad0[2], quad0[3], 7], [p0, p1, p2, new_p], [4, 5, 6], edges)
        self.add_tet(index, 0, [v3, v1, v6, v2], [p0, p1, p2], [4, 5, 6], edges)
        self.add_tet(index, 0, [v3, tip, v1, v6], [p0, p1, p2], [4, 5, 6], edges)
        self.add_tet(index, 0, [v6, tip, v4, v5], [p0, p1, p2], [4, 5, 6], edges)
        self.add_tet(index, 0, [v4, tip, v3, v6], [p0, p1, p2], [4, 5, 6], edges)

        self.add_tet(index, 1, [quad1[0], quad1[1], quad1[2], 7], [p0, p1, p2, new_p], [4, 5, 6], edges)
        self.add_tet(index, 1, [quad1[0], quad1[2], quad1[3], 7], [p0, p1, p2, new_p], [4, 5, 6], edges)
        self.add_edge(index, [[tip, v6], [v6, v3]])

        self.add_edge(index, [[quad0[1], quad0[3]], [quad1[0], quad1[2]]])



        self.add_tet(index, 1, [v3, v1, v6, v2], [p0, p1, p2], [4, 5, 6], edges)
        self.add_tet(index, 1, [v1, v6, v5, v4], [p0, p1, p2], [4, 5, 6], edges)
        self.add_tet(index, 1, [v1, v5, tip, v4], [p0, p1, p2], [4, 5, 6], edges)
        self.add_tet(index, 1, [v3, v1, v6, v4], [p0, p1, p2], [4, 5, 6], edges)
        self.add_tet(index, 1, [tip, v3, v1, v4], [p0, p1, p2], [4, 5, 6], edges)

        self.add_simple(index, 2, edges, tri0, tri1, tri4, tri5, [p0, p1, p2, new_p])
        self.add_edge(index, [[v1, v5], [v6, v3]])

        self.add_tet(index, 2, [quad0[0], quad0[1], quad0[2], 7], [p0, p1, p2, new_p], [4, 5, 6], edges)
        self.add_tet(index, 2, [quad0[0], quad0[2], quad0[3], 7], [p0, p1, p2, new_p], [4, 5, 6], edges)

        self.add_tet(index, 2, [quad1[0], quad1[1], quad1[3], 7], [p0, p1, p2, new_p], [4, 5, 6], edges)
        self.add_tet(index, 2, [quad1[1], quad1[2], quad1[3], 7], [p0, p1, p2, new_p], [4, 5, 6], edges)

        self.add_edge(index, [[quad0[0], quad0[2]], [quad1[1], quad1[3]]])

        self.add_tet(index, 2, [v1, v6, v5, v4], [p0, p1, p2], [4, 5, 6], edges)
        self.add_tet(index, 2, [v1, v5, tip, v4], [p0, p1, p2], [4, 5, 6], edges)
        self.add_tet(index, 2, [v1, v6, v2, v4], [p0, p1, p2], [4, 5, 6], edges)
        self.add_tet(index, 2, [v2, v3, v4, tip], [p0, p1, p2], [4, 5, 6], edges)

        self.add_edge(index, [[v1, v5], [v4, v2]])

        self.add_simple(index, 3, edges, tri0, tri1, tri4, tri5, [p0, p1, p2, new_p])

        self.add_tet(index, 3, [quad0[0], quad0[1], quad0[3], 7], [p0, p1, p2, new_p], [4, 5, 6], edges)
        self.add_tet(index, 3, [quad0[1], quad0[2], quad0[3], 7], [p0, p1, p2, new_p], [4, 5, 6], edges)

        self.add_tet(index, 3, [quad1[0], quad1[1], quad1[3], 7], [p0, p1, p2, new_p], [4, 5, 6], edges)
        self.add_tet(index, 3, [quad1[1], quad1[2], quad1[3], 7], [p0, p1, p2, new_p], [4, 5, 6], edges)
        self.add_tet(index, 3, [v1, v6, v2, v4], [p0, p1, p2], [4, 5, 6], edges)
        self.add_tet(index, 3, [v2, v3, v4, tip], [p0, p1, p2], [4, 5, 6], edges)
        self.add_tet(index, 3, [v1, v6, tip, v4], [p0, p1, p2], [4, 5, 6], edges)
        self.add_tet(index, 3, [tip, v6, v4, v5], [p0, p1, p2], [4, 5, 6], edges)

        self.add_edge(index, [[quad0[1], quad0[3]], [quad1[1], quad1[3]]])
        self.add_edge(index, [[tip, v6], [v4, v2]])


    def create_two_edges_cut(self, edges):
        index = self.index_for_edges(edges)
        assert(self.table[index] is None)

        # print(flags, self.int_to_flags(index))

        e0 = self.edges[edges[0], :]
        e1 = self.edges[edges[1], :]

@@ -918,6 +1147,13 @@ if __name__ == '__main__':
    table = CutTable()
    print(table)

    for i in range(len(table.new_points)):
        p = table.new_points[i]
        if p is None:
            continue
        if len(p) > 0:
            print("iiii", i, p)

    for i in range(len(table.table)):
        confs = table.table[i]
        if confs: