2014-07-20 264 views
1

我一直在浏览Mayavi文档和Google,但是我找不到关于IsoSurface类使用什么算法的任何声明。如果有帮助,我的源数据来自传递给mayavi.mlab.pipeline.scalar_field函数的3D NumPy数组。下面是使用含有3D立方体的图像上的iso_surface功能的代码:mayavi.mlab.pipeline.iso_surface.IsoSurface使用什么算法?

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函数生成等值面的一个实例。 mayavi \ modules \ iso_surface.py中的代码显示使用mayavi.components.contour。 mayavi \ components \ contour.py中的注释表明它包装了tvtk.ContourFilter。从发现的代码TVTK \ tvtk_classes.zip \ tvtk_classes \ contour_filter.py在我的本地安装,我发现这个在__init__方法为ContourFilter类:

tvtk_base.TVTKBase.__init__(self, vtk.vtkContourFilter, obj, update, **traits) 

查看源codevtkContourFilter及相关文件在www.vtk.org我没有看到对发布的引用或在那里实现的算法的名称。

+0

它是开源的,去找你自己。 –

+1

这没有帮助,因为它的文档很稀少。我正在寻找一个名称或引用该算法首次发布的出版物。我最终从源代码中发现IsoSurface不使用Marching Cubes,但我的原始问题仍未得到答复。 – chippies

+0

我想发布说代码不会伤害然后:) –

回答

2

正如你已经发现的,Mayavi的iso_surface模块使用(最终)VTK的vtkContourFilter。在“Visualization Toolkit:面向对象的3D图形方法,第4版”(Schroeder,Martin和Lorensen)一书中,有几句话讲述了vtkContourFilter使用的算法。这是从该书的第198页开始的:

VTK中的轮廓是使用前面介绍的行进 多维数据集算法的变体实现的。 [...]例如,四面体单元类型实现“行进四面体”并创建三角形基元,而三角形单元类型实现“行进 三角形”并生成线段。

还有一个vtkMarchingCubes过滤器,它特定于图像数据的情况(1d,2d或3d网格上的等间距数据);本书继续比较vtkMarchingCubesvtkContourFilter之间对3d音量的执行时间。

+0

是否有这本书的电子版免费提供?自从我转而使用'vtkMarchingCubes',与'iso_surface'相比,它产生了一个更简单的网格。这是正常的吗? – chippies

+0

回复:电子版。我不知道,恐怕。对于第二个问题:我真的不知道它是否正常(我最好只是一个偶然的VTK用户),但这听起来很合理:我的理解是,通用算法首先对所有事物进行三角化,然后进行行进四面体;我希望花费更长的时间,并提供更复杂的网格。 –