任何人都可以建议在python/numpy中使用与matlab的“isosSurface”函数等价的函数。MatLab等值面返回面和顶点。我需要面和顶点来创建.stl文件。Matlab等值面函数如下所示:
[f,v] = isosurface(X,Y,Z,V,isovalue)
在Python中,我在Plotly中找到了这个方法,它的工作原理如下:
import plotly.graph_objects as go
import numpy as np
X, Y, Z = np.mgrid[-5:5:40j, -5:5:40j, -5:5:40j]
# ellipsoid
values = X * X * 0.5 + Y * Y + Z * Z * 2
fig = go.Figure(data=go.Isosurface(
x=X.flatten(),
y=Y.flatten(),
z=Z.flatten(),
value=values.flatten(),
isomin=10,
isomax=40,
caps=dict(x_show=False, y_show=False)
))
fig.show()
这种方法的问题是,它只绘制等值面,而不像MatLab等值面函数那样返回面和顶点,我需要这些面和顶点。
任何帮助都将不胜感激。
2条答案
按热度按时间pobjuy321#
尽管PyVista不在您的目标库中,但基于VTK构建的PyVista可以帮助您轻松完成这项工作(免责声明:我是开发人员之一)。既然你在评论中似乎接受了基于PyVista的解决方案,下面是你会怎么做:
1.为您的数据类型定义网格,通常为
StructuredGrid
,尽管示例中的等距网格甚至可以与UniformGrid
一起使用,1.用
contour
滤镜计算其等值面,1.使用包含等值面的网格的
save
方法另存为.stl
文件。交互绘图如下所示:
颜色对应于从标量数组中选取并由标量条指示的等值线。
如果我们从文件加载回网格,我们将得到结构,但不会得到标量:
缺少标量的原因是无法将数据数组导出为
.stl
文件:虽然原始等值面的每个都有绑定到它们的等值(提供了第一张图中看到的颜色Map),以及点和单元法线(由于某种原因调用
.save()
来计算),但在后一种情况下没有数据。尽管如此,因为您正在寻找顶点和面,所以这样做应该很好。如果需要,还可以在PyVista一侧访问这些内容,因为等值面网格是
PolyData
对象:现在,这些面孔的后勤工作有点棘手。它们都以一维整数数组的形式进行编码。在一维数组中,您总是有一个整数
n
告诉您给定面的大小,然后n
与Points数组中的点相对应的从零开始的索引。上述等值面完全由三角形组成:这就是为什么你会看到
你可以做
isos.faces.reshape(-1, 4)
得到一个二维数组,其中每一行对应一个三角面(第一列是常量3)。iq0todco2#
在PYTHON/NumPy中没有与matlab的“isosSurface”函数等价的函数。你需要来自Scikit-Image的行进立方体来返回面和顶点。
Https://scikit-image.org/docs/stable/api/skimage.measure.html?highlight=marching%20cube#skimage.measure.marching_cubes