Quiero renderizar una malla tetraédrica usando algún software 3D. Sin embargo, no puedo cargar directamente la malla tetraédrica en el software de mi elección (por ejemplo, Blender) ya que el formato de archivo que tengo para las mallas tetraédricas no es compatible. Así que de alguna manera debería extraer yo mismo las caras con los índices de vértice correspondientes.

Para un cubo, mi archivo tetraédrico contiene ID de vértice para cada tetraedro que incluye 4 caras es el siguiente:

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

Sin embargo, no estoy seguro de cómo puedo extraer la malla de superficie dados estos datos. ¿Alguien sabe cómo puedo hacer esto o cuál es el algoritmo?

2
Amir 13 mar. 2021 a las 00:54

1 respuesta

La mejor respuesta

Aquí hay un método de fuerza bruta simplista. Para cada tetraedro, por ejemplo, mire el tercero, t: 1 2 4 7, al eliminar cada vértice, genere las cuatro combinaciones de tres vértices de los cuatro vértices tetraédricos, es decir,

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

Y ordenar las etiquetas de números enteros de cada triángulo en orden ascendente (por singularidad). De esta manera, puede generar la lista (o algún tipo de matriz) de todas las caras de todos los tetraédricos a partir de la malla tetraédrica.

Ahora ejecute un bucle sobre la lista de todas las caras de triángulos que acaba de generar, buscando duplicados. Siempre que un triángulo esté contenido dos veces en la lista de todas las caras de los triángulos, lo eliminas, porque es un triángulo interior, es decir, dos tetraédricos adyacentes comparten esta cara triangular, por lo que es una cara interior y no una de límite.

Lo que quede después de este procedimiento, son solo las caras del triángulo límite (es decir, la superficie) de la malla tetraédrica.

Aquí hay un ejemplo de este algoritmo escrito 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 mar. 2021 a las 21:20