Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

212
Vistas
¿Cómo extraer triángulos de superficie de una malla tetraédrica?

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. Entonces, de alguna manera debería extraer 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 con estos datos. ¿Alguien sabe cómo puedo hacer esto o cuál es el algoritmo?

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Aquí hay un método de fuerza bruta simplista. Para cada tetraedro, por ejemplo, observe el tercero, t: 1 2 4 7 , al eliminar cada vértice, genere las cuatro combinaciones de tres vértices a partir 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 ordene las etiquetas de enteros de cada triángulo en orden ascendente (para singularidad) De esta manera, puede generar la lista (o algún tipo de matriz) de todas las caras de todos los tetraédricos de la malla tetraédrica.

Ahora ejecute un ciclo sobre la lista de todas las caras de triángulos que acaba de generar, buscando duplicados. Cada vez que un triángulo está contenido dos veces en la lista de todas las caras del triángulo, lo elimina 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 frontera.

Lo que quede después de este procedimiento, son solo las caras triangulares del 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)
over 4 years ago · Santiago Trujillo Denunciar

0

Un método muy eficiente es usar hashsets (también conocido como set en python, std::unordered_set en c++, HashSet en rust)

El principio de recuperar un sobre de un volumen de tetraedros es el mismo que recuperar el contorno de una superficie de triángulos ( como puede encontrar aquí )

Esto da en python el siguiente código, fácil de traducir en cualquier idioma con hashsets (en python aquí, para simplificar):

 envelope = set() for tet in tetraedrons: for face in ( (tet[0], tet[1], tet[2]), (tet[0], tet[2], tet[3]), (tet[0], tet[3], tet[2]), (tet[1], tet[3], tet[2]) ): # if face has already been encountered, then it's not on the envelope # the magic of hashsets makes that check O(1) (eg. extremely fast) if face in envelope: envelope.remove(face) # if not encoutered yet, add it flipped else: envelope.add((face[2], face[1], face[0])) # there is now only faces encountered once (or an odd number of times for paradoxical meshes) return envelope
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda