【问题标题】:How to create an adjacency matrix from VTK / STL file?如何从 VTK / STL 文件创建邻接矩阵?
【发布时间】:2022-06-10 16:39:03
【问题描述】:

我有一个带有 N 个点和 F 个多边形(三角形)面的 .vtk 网格,我想构建一个 N x N 邻接矩阵来表示点之间的连通性。

我试过mesh.GetLines().GetData() 但是,这会返回一个空数组。我也尝试过mesh.GetPolys().GetData(),这给出了一个 4 x F 元素的平面数组。

通过检查 .vtk 文件,我知道每个面都以3, point1, point2, point3 给出,我假设 3 表示面是三角形的。从这里可以通过遍历列表来创建邻接矩阵,但是我想知道是否有任何内置的 VTK 函数可以为我完成这项工作。

如果有帮助,我也有 .stl 格式的网格。

谢谢

【问题讨论】:

    标签: mesh vtk adjacency-matrix


    【解决方案1】:

    可以通过迭代 vtk 多边形面并为每个边连接在空矩阵中添加 1 来创建 adj 矩阵,如下所示:

    polygons = vtk_to_numpy(mesh.GetPolys().GetData())
    adj = np.zeros((len(coords), len(coords)))
    print('ADJACENCY MATRIX SHAPE: ',adj.shape)
    
    for i in range(0, int(len(polygons)), 4):
        line = polygons[i:i+4] # 3, point1, point2, point3
        face = line[1:] # point1, point2, point3
        n1, n2, n3 = face[0], face[1], face[2]
        adj[n1,n2] = 1
        adj[n2,n1] = 1
        adj[n1,n3] = 1
        adj[n3,n1] = 1
        adj[n2,n3] = 1
        adj[n3,n2] = 1
    

    或者,如果使用.stl 文件,可以使用 trimesh 和 networkx 包来完成,如下所示:

    mesh = trimesh.load_mesh('mesh.stl')
    adj = networkx.adjacency_matrix(trimesh.graph.vertex_adjacency_graph(mesh)) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-21
      • 2018-05-16
      • 1970-01-01
      相关资源
      最近更新 更多