3

我正在使用行进立方体从体积中提取 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,因为许多元素/面的面积接近零或高度扭曲。

在此处输入图像描述

有没有办法在给定顶点的情况下重新划分网格并确保特定的元素面/面指标(例如纵横比)或强制行进立方体做这样的事情?

只要网格是一个公平的近似值,我就不会担心移动顶点。

4

4 回答 4

1

一种选择可能是使用表面网格划分包对行进立方体输出进行“重新网格划分”。本质上,这意味着行进立方体三角剖分将用作要重新三角剖分的初始表面定义。

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

  • JIGSAW: 一种受限正面-delaunay算法^^,通常会构建非常高质量的表面 Delaunay 三角剖分。对于显示的对象类型,我希望它能够正常工作。在包含(在 中提供)的演示中,MATLAB几个示例解决了行进立方体输出的重新网格化。
  • CGAL:一种受限delaunay-refinementJIGSAW方法,它也可以构建表面 Delaunay 三角剖分,但使用与CVT- 类型网格优化方案略有不同的算法。
  • MMG:一组重新划分网格/优化策略(据我所知),可用于通过局部修改的迭代应用来转换(并因此改进)初始网格。

^^我是作者JIGSAW,所以,这里基本上是无耻的宣传。

于 2018-06-14T12:01:06.003 回答
0

奇怪的三角形来自奇怪的数据,而不是用于三角测量的方法。

我可以说 Delaunay 三角剖分实现了最佳三角形面积/三角形周长比(最佳理论比率是等边三角形)。但是您不能将 if 用于您的网格,因为 Delaunay 三角剖分输出凸网格。

你有一项艰巨的任务。一些想法:

  • 在网格化之前删除 cuasi-duplicated 点。这将避免许多接近零面积的三角形。
  • 检测细三角形。将它们细分为更“规则”的三角形。
  • 您可以创建一个密集的规则网格。可以找到每个z遍历网格,直到找到包含x,y网格中点坐标的三角形,然后对z. 如果你有一些额外的信息,比如邻居或层次结构,搜索可以比检查每个三角形更快。对网格进行三角剖分非常简单。
于 2018-06-13T18:31:10.577 回答
0

使用也可以使用pygalmesh进行表面重新网格化。(这是一个易于使用的 CGAL 界面。)

import pygalmesh

# create verts, faces

meshio.write_points_cells("in.vtu", verts, [("triangle", faces)])

mesh = pygalmesh.remesh_surface(
    "in.vtu",
    edge_size=0.025,
    facet_angle=25,
    facet_size=0.1,
    facet_distance=0.001,
    verbose=False,
)
# mesh.points, mesh.cells
于 2020-02-20T11:19:29.670 回答
0

我建议使用带有平滑的 3d 自适应网格重新划分。Geogram 编程库 ( http://alice.loria.fr/software/geogram/doc/html/index.html ) 提供了一个很好的实现。请参阅:https ://twitter.com/brunolevy01/status/1132343120690122752?lang=en

于 2020-12-13T12:24:31.707 回答