Я использую марширующие кубы, чтобы извлечь двумерную поверхность из объема.В этом случае 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 на сетках, так как многие элементы / грани имеют близкую к нулю область или сильно искажены.
Есть ли способили пересмешивание заданных вершин и обеспечение определенных метрик элементного лица / фасета (таких как соотношение сторон) или принуждение марширующих кубов к таким вещам?
Меня не беспокоит перемещение вершин, если сетка является хорошим приближением.