# -*- coding: utf-8 -*- # Max-Planck-Gesellschaft zur Förderung der Wissenschaften e.V. (MPG) is # holder of all proprietary rights on this computer program. # You can only use this computer program if you have closed # a license agreement with MPG or you get the right to use the computer # program from someone who is authorized to grant you that right. # Any use of the computer program without a valid license is prohibited and # liable to prosecution. # # Copyright©2020 Max-Planck-Gesellschaft zur Förderung # der Wissenschaften e.V. (MPG). acting on behalf of its Max Planck Institute # for Intelligent Systems. All rights reserved. # # Code from Chumpy and OpenDR. Placed here to avoid chumpy dependency # The original code can be found in https://github.com/MPI-IS/mesh import numpy as np import scipy.sparse as sp def row(A): return A.reshape((1, -1)) def col(A): return A.reshape((-1, 1)) def get_vert_connectivity(mesh_v, mesh_f): """Returns a sparse matrix (of size #verts x #verts) where each nonzero element indicates a neighborhood relation. For example, if there is a nonzero element in position (15,12), that means vertex 15 is connected by an edge to vertex 12.""" vpv = sp.csc_matrix((len(mesh_v), len(mesh_v))) # for each column in the faces... for i in range(3): IS = mesh_f[:, i] JS = mesh_f[:, (i + 1) % 3] data = np.ones(len(IS)) ij = np.vstack((row(IS.flatten()), row(JS.flatten()))) mtx = sp.csc_matrix((data, ij), shape=vpv.shape) vpv = vpv + mtx + mtx.T return vpv def get_vertices_per_edge(mesh_v, mesh_f): """Returns an Ex2 array of adjacencies between vertices, where each element in the array is a vertex index. Each edge is included only once. If output of get_faces_per_edge is provided, this is used to avoid call to get_vert_connectivity()""" vc = sp.coo_matrix(get_vert_connectivity(mesh_v, mesh_f)) result = np.hstack((col(vc.row), col(vc.col))) result = result[result[:, 0] < result[:, 1]] # for uniqueness return result