Python 重划分三维三角化曲面以获得更好的网格质量
我使用移动立方体从体积中提取二维曲面。在这种情况下,一个陀螺IDPython 重划分三维三角化曲面以获得更好的网格质量,python,mesh,scikit-image,triangulation,marching-cubes,Python,Mesh,Scikit Image,Triangulation,Marching Cubes,我使用移动立方体从体积中提取二维曲面。在这种情况下,一个陀螺ID 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) +
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,因为许多元素/面具有接近零的面积或高度扭曲
有没有一种方法可以对给定的顶点进行重新划分&确保特定的elementface/facet度量(例如纵横比)或强制行进立方体执行这样的操作
只要网格是一个合理的近似值,我就不担心移动顶点。奇怪的三角形来自奇怪的数据,而不是来自用于三角剖分的方法。 我可以说Delaunay三角剖分实现了最佳的三角形面积/三角形周长比(最佳的三角形周长比是等边三角形)。但不能对网格使用if,因为Delaunay三角剖分会输出凸网格 你面前的任务很紧迫。一些想法:
- 啮合前删除cuasi重复点。这将避免许多接近零区域的三角形
- 检测薄三角形。将它们细分为更多的“规则”三角形李>
- 可以创建密集的规则栅格。每个
都可以通过网格找到,直到找到包含网格中点的z
坐标的三角形,然后对x,y
进行插值。如果你有一些额外的信息,比如邻居或等级,搜索可以比检查每个三角形更快。对网格进行三角剖分非常简单z
C++/C
实现):
- :一种受限的正面delaunay算法^^^^,通常会构建非常高质量的曲面delaunay三角剖分。对于显示的对象类型,我希望它能正常工作。在包含的演示中(在
中提供),有几个示例介绍了marching cubes输出的重新网格划分李>MATLAB
- :一种受限制的delaunay细化方法,它也可以构建曲面delaunay三角剖分,但使用稍微不同的算法来
,还包括JIGSAW
类型的网格优化方案CVT
- :一组重新网格划分/优化策略(据我所知),可用于通过迭代应用局部修改来转换(并因此改进)初始网格
^
我是《拼图》(JIGSAW)的作者,因此,这里基本上是无耻的促销。使用也可以用于表面重划。(这是一个易于使用的CGAL接口。)
导入pygalmesh
#创建顶点、面
在单元格(“in.vtu”,顶点,[(“三角形”,面)]中写入点
网格=pygalmesh.remesh_曲面(
“in.vtu”,
边缘尺寸=0.025,
面_角=25,
面_尺寸=0.1,
面_距离=0.001,
冗长=错误,
)
#mesh.points,mesh.cells
我建议使用带平滑的3d自适应重网格。Geogram编程库()提供了一个很好的实现。请参阅:鼓励链接到外部资源,但请确保您的其他用户了解它是什么,以及它为什么存在。始终引用重要链接中最相关的部分,以防无法访问目标站点或永久脱机。其他评论员请注意,我没有标记这个答案。“我建议使用3d自适应平滑重划。”这是一个有效的答案。