mayavi.mlab.pipeline.iso_surface.IsoSurface使用什么算法?
我一直在查找Mayavi的文档和Google,但找不到IsoSurface类使用的算法的相关说明。如果有帮助的话,我的源数据来自一个3D的NumPy数组,这个数组是通过mayavi.mlab.pipeline.scalar_field
函数传入的。下面是使用iso_surface函数处理一个包含3D立方体的图像的代码:
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的实例。在mayavi\modules\iso_surface.py中的代码显示,使用了mayavi.components.contour。mayavi\components\contour.py中的注释说明它是对tvtk.ContourFilter的封装。从我本地安装的tvtk\tvtk_classes.zip\tvtk_classes\contour_filter.py中的代码来看,我在ContourFilter
类的__init__
方法中发现了这些内容:
tvtk_base.TVTKBase.__init__(self, vtk.vtkContourFilter, obj, update, **traits)
查看vtkContourFilter
的源代码,链接在这里code,以及在www.vtk.org上的相关文档,我没有看到提到任何出版物或实现的算法名称。
1 个回答
正如你已经发现的,Mayavi的iso_surface
模块最终是使用VTK的vtkContourFilter
。在《可视化工具包:面向对象的3D图形方法,第4版》(Schroeder, Martin和Lorensen)这本书中,有几句话提到了vtkContourFilter
使用的算法。这段话摘自书的第198页:
在VTK中,等高线绘制是通过变种的“行进立方体”算法来实现的,之前已经介绍过。[...] 比如,四面体单元类型实现了“行进四面体”,并创建三角形原始图形,而三角形单元类型则实现了“行进三角形”,生成线段。
此外,还有一个vtkMarchingCubes
过滤器,专门用于图像数据(在1维、2维或3维网格上均匀分布的数据);书中还比较了vtkMarchingCubes
和vtkContourFilter
在处理3D体积数据时的执行时间。