Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

214
Visualizações
¿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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda