Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 重划分三维三角化曲面以获得更好的网格质量_Python_Mesh_Scikit Image_Triangulation_Marching Cubes - Fatal编程技术网

Python 重划分三维三角化曲面以获得更好的网格质量

Python 重划分三维三角化曲面以获得更好的网格质量,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) +

我使用移动立方体从体积中提取二维曲面。在这种情况下,一个陀螺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) + 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
    进行插值。如果你有一些额外的信息,比如邻居或等级,搜索可以比检查每个三角形更快。对网格进行三角剖分非常简单

一个选项是使用曲面网格化包对行进立方体输出进行“重新网格化”。本质上,这意味着marching cubes三角剖分将用作要重新三角剖分的初始曲面定义

有许多技术可以用来做到这一点。一些可能有用的选项(所有
C++/C
实现):

  • :一种受限的正面delaunay算法^^^^,通常会构建非常高质量的曲面delaunay三角剖分。对于显示的对象类型,我希望它能正常工作。在包含的演示中(在
    MATLAB
    中提供),有几个示例介绍了marching cubes输出的重新网格划分
  • :一种受限制的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自适应平滑重划。”这是一个有效的答案。