这里有一种简单的暴力方法。对于每个四面体,例如看第三个,t: 1 2 4 7
,通过移除每个顶点,生成所有四个四面体顶点中的三个顶点的四种组合,即
face[t][0]: 1 2 4, face[t][1]: 1 2 7, face[t][2]: 1 4 7, face[t][3]: 2 4 7
并按升序对每个三角形的整数标签进行排序(以确保唯一性)。这样,您就可以生成所有四面体网格中所有面的列表(或某种数组)。
现在,在刚刚生成的所有三角形面的列表上运行一个循环,查找重复项。每当一个三角形在所有三角形面的列表中出现两次时,将其删除,因为它是内部三角形,即相邻的两个四面体共享此三角形面,因此它是内部面而不是边界面。
经过此过程后,剩下的只有四面体网格的边界(即表面)三角形面。
以下是使用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)
v
行的含义,但不确定如何从每个t
行中获取 4 个面。 - Amir