Je veux rendre un maillage tétraédrique en utilisant un logiciel 3D. Cependant, je ne peux pas charger directement le maillage tétraédrique dans le logiciel de mon choix (par exemple Blender) car le format de fichier que j'ai pour les maillages tétraédriques n'est pas pris en charge. Je devrais donc en quelque sorte extraire moi-même les faces avec les indices de sommet correspondants.

Pour un cube, mon fichier tétraédrique contient les ID de sommet pour chaque tétraèdre qui comprend 4 faces est le suivant:

v 0.41 0.41 0.41
v 0.41 0.41 -0.41
v 0.41 -0.41 0.41
v 0.41 -0.41 -0.41
v -0.41 0.41 0.41
v -0.41 0.41 -0.41
v -0.41 -0.41 0.41
v -0.41 -0.41 -0.41
t 0 1 2 4
t 5 1 4 7
t 1 2 4 7
t 3 1 7 2
t 6 4 2 7

Cependant, je ne sais pas comment extraire le maillage de surface compte tenu de ces données. Est-ce que quelqu'un sait comment je peux faire cela ou quel est l'algorithme?

2
Amir 13 mars 2021 à 00:54

1 réponse

Meilleure réponse

Voici une méthode simpliste de force brute. Pour chaque tétraèdre, par exemple regardez le troisième, t: 1 2 4 7, en supprimant chaque sommet, générez les quatre combinaisons de trois sommets sur les quatre sommets tétraédriques, c'est-à-dire

face[t][0]: 1 2 4,  face[t][1]: 1 2 7,  face[t][2]: 1 4 7, face[t][3]: 2 4 7

Et trier les étiquettes entières de chaque triangle dans l'ordre croissant (pour l'unicité) De cette façon, vous pouvez générer la liste (ou une sorte de tableau) de toutes les faces de tous les tétraèdres à partir du maillage tétraédrique.

Maintenant, exécutez une boucle sur la liste de toutes les faces triangulaires que vous venez de générer, à la recherche de doublons. Chaque fois qu'un triangle est contenu deux fois dans la liste de toutes les faces du triangle, vous le supprimez, car il s'agit d'un triangle intérieur, c'est-à-dire que deux tétraédriques adjacents partagent cette face triangulaire, donc c'est une face intérieure et non une frontière.

Ce qui reste après cette procédure, ce ne sont que les faces triangulaires de frontière (c'est-à-dire la surface) du maillage tétraédrique.

Voici un exemple de cet algorithme écrit en python

import numpy as np

def list_faces(t):
  t.sort(axis=1)
  n_t, m_t= t.shape 
  f = np.empty((4*n_t, 3) , dtype=int)
  i = 0
  for j in range(4):
    f[i:i+n_t,0:j] = t[:,0:j]
    f[i:i+n_t,j:3] = t[:,j+1:4]
    i=i+n_t
  return f

def extract_unique_triangles(t):
  _, indxs, count  = np.unique(t, axis=0, return_index=True, return_counts=True)
  return t[indxs[count==1]]

def extract_surface(t):
  f=list_faces(t)
  f=extract_unique_triangles(f)
  return f

V = np.array([
[ 0.41,  0.41,  0.41],
[ 0.41,  0.41, -0.41],
[ 0.41, -0.41,  0.41],
[ 0.41, -0.41, -0.41],
[-0.41,  0.41,  0.41],
[-0.41,  0.41, -0.41],
[-0.41, -0.41,  0.41],
[-0.41, -0.41, -0.41]])

T = np.array([
              [0, 1, 2, 4],
              [5, 1, 4, 7],
              [1, 2, 4, 7],
              [3, 1, 7, 2],
              [6, 4, 2, 7]])


F_all = list_faces(T)
print(F_all)
print(F_all.shape)

F_surf = extract_surface(T)
print(F_surf)
print(F_surf.shape)
1
Futurologist 14 mars 2021 à 21:20