我正在使用Marching Cubes算法从一个体积数据中提取二维表面,这里是一个Gyroid。
import numpy as np
from numpy import sin, cos, pi
from skimage import measure
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
def gyroid(x, y, z, t):
return cos(x)*sin(y) + cos(y)*sin(z) + cos(z)*sin(x) - t
lattice_param = 1.0
strut_param = 0.0
resolution = 31j
x, y, z = pi*np.mgrid[-1:1:resolution, -1:1:resolution, -1:1:resolution] * lattice_param
vol = gyroid(x, y, z, strut_param)
verts, faces = measure.marching_cubes(vol, 0, spacing=(0.1, 0.1, 0.1)) # , normals, values
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_trisurf(verts[:, 0], verts[:, 1], faces, verts[:, 2], cmap='ocean', lw=1)
这一切都很好,但在很多地方网格质量很差。我无法在网格上运行任何有限元分析,因为许多单元/面积的面积接近零或高度扭曲。
有没有一种方法可以重新网格化给定的顶点并确保特定元素面/面度量(例如长宽比),或者强制Marching Cubes执行这样的操作?
只要网格是公平近似的,我不在乎移动顶点。