我正在使用行进立方体从体积中提取 2D 表面。在本例中为 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)
这一切都很好,但网格质量在很多地方都令人震惊。我无法在网格上运行任何 FEA,因为许多元素/面的面积接近零或高度扭曲。
有没有办法在给定顶点的情况下重新划分网格并确保特定的元素面/面指标(例如纵横比)或强制行进立方体做这样的事情?
只要网格是一个公平的近似值,我就不会担心移动顶点。