Ejemplo n.º 1
0
    xyz, q, f, l, r = fd_numpy(vertices, edges, fixed, q, loads)
    for vkey, coordinates in zip(sorted(list(mesh.vertices())), xyz):
        mesh_move_vertex_to(mesh, coordinates, vkey)


def load_path(mesh):
    return sum([mesh.edge_length(*edge) for edge in mesh.edges()])


def func(t, mesh, polyline_points):
    fix_boundaries(mesh, polyline_points, t)
    find_form(mesh)
    return load_path(mesh)


mesh = Mesh.from_json('/Users/Robin/Desktop/simple_mesh.json')
mesh = conway_gyro(mesh)
polyline_points = [[2.6063381123514175, 40.935946423181882, 0.0],
                   [3.9369282045788494, 42.327616276045276, 0.0],
                   [5.760612811568148, 42.957179887931325, 0.0],
                   [7.677141583573143, 42.741476009840468, 0.0],
                   [9.249202441569466, 41.636074033399247, 0.0],
                   [10.099070540147636, 39.901842354098889, 0.0],
                   [10.445234328797181, 37.988992350564551, 0.0],
                   [10.832127422110238, 36.086128649415919, 0.0],
                   [12.034580052260155, 34.611669302310716, 0.0],
                   [13.872402034803775, 34.000898316364172, 0.0],
                   [15.793258601276873, 33.693072434788895, 0.0],
                   [17.697244927994845, 33.299890980625278, 0.0],
                   [19.435815699891037, 32.455904337698669, 0.0],
                   [20.426594142557271, 30.827275105478869, 0.0],
Ejemplo n.º 2
0
    def from_skeleton(cls, lines, radius=1):

        network = Network.from_lines(lines)

        tube_extremities = {}

        nodes = []
        for vkey in network.vertices():
            if len(network.vertex_neighbors(vkey)) > 1:

                points = [
                    network.edge_point(vkey,
                                       nbr,
                                       t=float(radius) /
                                       network.edge_length(vkey, nbr))
                    for nbr in network.vertex_neighbors(vkey)
                ]
                faces = convex_hull(points)
                mesh = cls.from_vertices_and_faces(points, faces)

                meshes = []

                for fkey in mesh.faces():
                    vertices = [
                        mesh.edge_midpoint(u, v)
                        for u, v in mesh.face_halfedges(fkey)
                    ]
                    faces = [[0, 1, 2]]
                    meshes.append(cls.from_vertices_and_faces(vertices, faces))

                for vkey_2 in mesh.vertices():
                    tops = []
                    bottoms = []
                    n = normalize_vector(
                        subtract_vectors(mesh.vertex_coordinates(vkey_2),
                                         network.vertex_coordinates(vkey)))
                    for i in range(len(mesh.vertex_neighbors(vkey_2))):
                        pt_0 = mesh.edge_midpoint(
                            vkey_2,
                            mesh.vertex_neighbors(vkey_2, ordered=True)[i - 1])
                        bottoms.append(pt_0)
                        pt_1 = mesh.edge_midpoint(
                            vkey_2,
                            mesh.vertex_neighbors(vkey_2, ordered=True)[i])
                        pt_2 = midpoint_line([pt_0, pt_1])
                        pt_2 = add_vectors(
                            scale_vector(n, distance_point_point(pt_0, pt_1)),
                            pt_2)
                        tops.append(pt_2)
                        vertices = [pt_0, pt_2, pt_1]
                        faces = [[0, 1, 2]]
                        meshes.append(
                            cls.from_vertices_and_faces(vertices, faces))
                    for i in range(len(tops)):
                        vertices = [tops[i - 1], tops[i], bottoms[i]]
                        faces = [[0, 1, 2]]
                        meshes.append(
                            cls.from_vertices_and_faces(vertices, faces))
                    #print network.vertex_neighbors(vkey), network.vertex_neighbors(vkey)[vkey_2]
                    tube_extremities[(
                        vkey, network.vertex_neighbors(vkey)[vkey_2])] = tops

                mesh = meshes_join_and_weld(meshes)

                #dense_mesh = trimesh_subdivide_loop(mesh, k = 3)

                nodes.append(mesh)

        return nodes[0]

        meshes_2 = []
        for u, v in network.edges():
            if len(network.vertex_neighbors(u)) > 1 and len(
                    network.vertex_neighbors(v)) > 1:
                #print len(tube_extremities[(u, v)])
                #print len(tube_extremities[(v, u)])
                if len(tube_extremities[(u, v)]) == len(tube_extremities[(v,
                                                                          u)]):
                    n = len(tube_extremities[(u, v)])
                    l = network.edge_length(u, v) - 2 * radius
                    m = math.floor(l / radius) + 1
                    pt_uv = tube_extremities[(u, v)]
                    pt_vu = list(reversed(tube_extremities[(v, u)]))
                    dmin = -1
                    imin = None
                    for i in range(n):
                        distance = sum([
                            distance_point_point(pt_uv[j],
                                                 pt_vu[i + j - len(pt_vu)])
                            for j in range(n)
                        ])
                        if dmin < 0 or distance < dmin:
                            dmin = distance
                            imin = i
                    pt_vu = [pt_vu[imin + j - len(pt_vu)] for j in range(n)]
                    array = [pt_uv]
                    for i in range(int(m)):
                        polygon = []
                        for j in range(int(n)):
                            u = pt_uv[j]
                            v = pt_vu[j]
                            polygon.append(
                                add_vectors(
                                    scale_vector(u, (float(m) - 1 - float(i)) /
                                                 float(m - 1)),
                                    scale_vector(v,
                                                 float(i) / float(m - 1))))
                        array.append(polygon)
                    array.append(pt_vu)
                    #print len(array), len(array[0]), len(array[1]), len(array[2]), len(array[3])
                    for i in range(int(n)):
                        for j in range(int(m)):
                            vertices = [
                                array[i - 1][j - 1], array[i - 1][j],
                                array[i][j]
                            ]
                            faces = [[0, 1, 2]]
                            meshes_2.append(
                                Mesh.from_vertices_and_faces(vertices, faces))

        vertices, faces = join_and_weld_meshes(meshes_2)

        #meshes_2 = rs.AddMesh(vertices, faces)

        meshes = []
        for node in nodes:
            vertices, faces = node.to_vertices_and_faces()
            meshes.append(rs.AddMesh(vertices, faces))
Ejemplo n.º 3
0
	# 	(1, 2),
	# 	(2, 3),
	# 	(3, 4),
	# 	(4, 5),
	# 	(5, 0),
	# 	(0, 3),
	# 	(2, 5)
	# ]

	# adjacency = adjacency_from_edges(edges)
	# print(adjacency)
	
	# t0 = time.time()
	# print(is_adjacency_two_colorable(adjacency))
	# t1 = time.time()
	# print(t1 - t0)

	mesh = Mesh.from_obj(compas.get('faces.obj'))

	t0 = time.time()
	print(is_adjacency_two_colorable(mesh.adjacency))
	t1 = time.time()
	print(t1 - t0)

	t0 = time.time()
	print(vertex_coloring(mesh.adjacency))
	t1 = time.time()
	print(t1 - t0)


Ejemplo n.º 4
0
        [0, 0, 0],
        [1, 0, 0],
        [2, 0, 0],
        [3, 0, 0],
        [3, 1, 0],
        [0, 1, 0],
        [0, 0.5, 0],
        [0, 0.25, 0],
        [4, 0, 0],
        [4, 1, 0],
    ]

    faces = [[0, 1, 2, 3, 4, 5, 6, 7], [3, 8, 9, 4]]

    sources = [1, 2, 6, 7]

    mesh = Mesh.from_vertices_and_faces(vertices, faces)

    #quadrangulate_face(mesh, 0, sources)
    quadrangulate_mesh(mesh, sources)
    # for vkey in mesh.vertices():
    # 	print 'vkey', vkey, mesh.vertex_faces(vkey)
    # for fkey in mesh.faces():
    # 	print 'fkey', fkey, mesh.face_vertices(fkey)

    plotter = MeshPlotter(mesh)
    plotter.draw_vertices(text='key')
    plotter.draw_edges()
    plotter.draw_faces(text='key')
    plotter.show()
Ejemplo n.º 5
0
    def from_quad_mesh(cls,
                       quad_mesh,
                       collect_strips=True,
                       collect_polyedges=True,
                       attribute_density=True):
        """Build coarse quad mesh from quad mesh with density and child-parent element data.

		Parameters
		----------
		quad_mesh : QuadMesh
			A quad mesh.
		attribute_density : bool, optional
			Keep density data of dense quad mesh and inherit it as aatribute.

		Returns
		----------
		coarse_quad_mesh : CoarseQuadMesh
			A coarse quad mesh with density data.
		"""

        polyedges = quad_mesh.singularity_polyedge_decomposition()

        # vertex data
        vertices = {
            vkey: quad_mesh.vertex_coordinates(vkey)
            for vkey in quad_mesh.vertices()
        }
        coarse_vertices_children = {
            vkey: vkey
            for polyedge in polyedges for vkey in [polyedge[0], polyedge[-1]]
        }
        coarse_vertices = {
            vkey: quad_mesh.vertex_coordinates(vkey)
            for vkey in coarse_vertices_children
        }

        # edge data
        coarse_edges_children = {(polyedge[0], polyedge[-1]): polyedge
                                 for polyedge in polyedges}
        singularity_edges = [(x, y) for polyedge in polyedges
                             for u, v in pairwise(polyedge)
                             for x, y in [(u, v), (v, u)]]

        # face data
        faces = {
            fkey: quad_mesh.face_vertices(fkey)
            for fkey in quad_mesh.faces()
        }
        adj_edges = {(f1, f2)
                     for f1 in quad_mesh.faces()
                     for f2 in quad_mesh.face_neighbors(f1)
                     if f1 < f2 and quad_mesh.face_adjacency_halfedge(f1, f2)
                     not in singularity_edges}
        coarse_faces_children = {}
        for i, connected_faces in enumerate(
                connected_components(adjacency_from_edges(adj_edges))):
            mesh = Mesh.from_vertices_and_faces(
                vertices, [faces[face] for face in connected_faces])
            coarse_faces_children[i] = [
                vkey for vkey in reversed(mesh.boundaries()[0])
                if mesh.vertex_degree(vkey) == 2
            ]

        coarse_quad_mesh = cls.from_vertices_and_faces(coarse_vertices,
                                                       coarse_faces_children)

        # attribute relation child-parent element between coarse and dense quad meshes
        coarse_quad_mesh.data['attributes'][
            'vertex_coarse_to_dense'] = coarse_vertices_children
        coarse_quad_mesh.data['attributes']['edge_coarse_to_dense'] = {
            u: {}
            for u in coarse_quad_mesh.vertices()
        }
        for (u, v), polyedge in coarse_edges_children.items():
            coarse_quad_mesh.data['attributes']['edge_coarse_to_dense'][u][
                v] = polyedge
            coarse_quad_mesh.data['attributes']['edge_coarse_to_dense'][v][
                u] = list(reversed(polyedge))

        # collect strip and polyedge attributes
        if collect_strips:
            coarse_quad_mesh.collect_strips()
        if collect_polyedges:
            coarse_quad_mesh.collect_polyedges()

        # store density attribute from input dense quad mesh
        if attribute_density:
            coarse_quad_mesh.set_strips_density(1)
            for skey in coarse_quad_mesh.strips():
                u, v = coarse_quad_mesh.strip_edges(skey)[0]
                d = len(
                    coarse_edges_children.get((u, v),
                                              coarse_edges_children.get((v, u),
                                                                        [])))
                coarse_quad_mesh.set_strip_density(skey, d)

        # store quad mesh and use as polygonal mesh
        coarse_quad_mesh.set_quad_mesh(quad_mesh)
        coarse_quad_mesh.set_polygonal_mesh(quad_mesh.copy())

        return coarse_quad_mesh