2 votes

Sélection des faces d'un maillage à partir des coordonnées des sommets en numpy

J'ai deux tableaux numpy, l'un pour les sommets 3D d'un maillage, je l'appelle vert et un autre pour les faces triangulaires, que l'on appelle faces :

El vert est un N x 3 tableau de formes de float donc N points tridimensionnels. Le site x Les coordonnées de chaque point peuvent avoir des valeurs positives et négatives. A titre d'exemple pur, cela peut être le vert le tableau :

[[  2.886495  24.886948  15.909558]
 [ -13.916695 -58.985245  19.655312]
 [ 40.415527   8.968353   8.515955]
 ...
 [ 13.392465 -58.20602   18.752457]
 [ -12.504704 -58.307934  18.912386]
 [ 13.322185 -58.52817   19.165733]]

Comme la maille est centrée, le gauche est celle dont la composante x est positive et les indices des sommets correspondants sont trouvés par une fonction np.where

i_vert_left = np.where(vert[:,0]>0)[0]

Je voudrais maintenant filtrer les faces constituées de triangles dont les coordonnées sont entièrement dans le positif. x axe.

Cependant, j'ai un problème en faisant cela indexation fonctionnement correct. Ma première tentative a été de sous-ensembler les faces de telle sorte que les sommets correspondants ont x>0

faces_left = np.asarray([f for f in faces if np.all(np.isin(i_vert_left,f)) ])

mais l'opération est incroyablement lente sur les grandes mailles. Comment puis-je exploiter une indexation intelligente des faces ?

1voto

jdehesa Points 22254

En supposant que faces est un Nx3 tableau d'entiers indexant les trois sommets de chaque triangle, je pense que vous devriez juste avoir besoin :

# Check whether each vertex is left or not
vert_left_mask = vert[:, 0] > 0
# Check whether each face has all vertices on left or not
faces_left_mask = np.all(vert_left_mask[faces], axis=1)
# Select resulting left faces
faces_left = faces[faces_left_mask]

Le principal "truc" ici est dans vert_left_mask[faces] qui remplace chaque numéro de sommet entier par un booléen indiquant si le sommet est gauche ou non, de sorte qu'il est facile de dire quelle face est entièrement gauche avec np.all .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X