我一直在筛选Mayavi文档和谷歌,但我找不到任何关于IsoSurface类使用什么算法的声明。如果有帮助的话,我的源数据来自传递给mayavi.mlab.pipeline.scalar_field
函数的3D NumPy数组。下面是在包含3D立方体的图像上使用iso_surface函数的代码:
import numpy as np
from mayavi import mlab
img = np.pad(np.ones((5,5,5)), 1, mode='constant')
src = mlab.pipeline.scalar_field(img, figure=False)
iso = mlab.pipeline.iso_surface(src, contours=0.5)
iso_surface
函数生成一个IsoSurface实例。mayavimodulesiso_surface.py中的代码显示使用了mayavi.components.contour。mayavicomponents contourpy中的注释说明它包装了tvtk.ContourFilter。从我在本地安装的tvtktvtk_classes.ziptvtk_classescontour_filter.py中找到的代码中,我在ContourFilter
类的__init__
方法中发现了这一点:
tvtk_base.TVTKBase.__init__(self, vtk.vtkContourFilter, obj, update, **traits)
查看www.vtk.org上vtkContourFilter
的源代码和相关文档,我没有看到对出版物的引用或在那里实现的算法的名称。
正如您已经发现的,Mayavi的iso_surface
模块使用(最终)VTK的vtkContourFilter
。在"可视化工具包:面向对象的3D图形方法,第4版"(Schroeder, Martin and Lorensen)一书中有几句话谈到了vtkContourFilter
使用的算法。这是那本书的第198页
VTK中的轮廓是使用行进的变化来实现的立方体算法。[…例如,四面体细胞类型实现"行进四面体"并创建三角形基本类型,而三角形单元格类型实现了"移动"三角形",并生成线段。
还有一个vtkMarchingCubes
过滤器,这是特定于图像数据的情况下(在1d, 2d或3d网格上有规律间隔的数据);这本书继续比较了vtkMarchingCubes
和vtkContourFilter
在3d卷中的执行时间。