0

我想获得类似于此 stackoverflow question的横截面图像。但是当我尝试做同样的事情时,我无法获得情节的轮廓,但我得到了mayavi iso-surface plot 和 scalar_cut_planeplot opacity=0.0

但是我想要一个像stackoverflow exstackoverflow ex image2这样的横截面图像

可重现的代码:

import numpy as np
from numpy import cos
from mayavi.mlab import contour3d
from mayavi import mlab

fig = mlab.figure(size=(800, 600), fgcolor=(0, 0, 0),bgcolor=(0.5,0.5,0.5))
x, y, z = np.ogrid[-3:3:60j, -3:3:60j, -3:3:60j]
t = 0

H1   =   0.45+((x*cos(t))*(x*cos(t)) + (y*cos(t))*(y*cos(t))-(z*cos(t))*(z*cos(t)))
obj1 = contour3d(H1, contours=[0], transparent=False, opacity=1.0)

H1_handle=mlab.gcf()
mlab.outline(obj1,figure=fig)

plane=mlab.pipeline.scalar_cut_plane(obj1.module_manager.source, plane_orientation='z_axes', figure=fig, )
plane.implicit_plane.widget.enabled = True
mlab.show()

上面提到的问题也没有回答。在获得交叉图像后,我想进一步处理它,因此在这方面的任何帮助也将不胜感激。

提前致谢!!

4

1 回答 1

1

终于找到了使用这个答案这个问题的解决方案。

诀窍是将 mayavi mlab.contour3d 数据转换为 vtkPolyData。其余的我使用与上述问题相同的方法。

代码:

from mayavi import mlab
import numpy as np
from numpy import cos
from tvtk.api import tvtk
from mayavi.mlab import contour3d

fig = mlab.figure(size=(800, 600), bgcolor=(1, 1, 1), fgcolor=(0, 0, 0))
ap = tvtk.AppendPolyData()

x, y, z = np.ogrid[-3:3:60j, -3:3:60j, -3:3:60j]
t = 0

H1   =   0.45+((x*cos(t))*(x*cos(t)) + (y*cos(t))*(y*cos(t))-(z*cos(t))*(z*cos(t)))
src = contour3d(H1, contours=[0], transparent=False,opacity=0.0)


fig.remove_child(fig.children[0])
data_out = src.module_manager.source.get_output_dataset()
actor = src.actor.actors[0]
polydata = tvtk.to_vtk(actor.mapper.input)
ap.add_input_data(polydata)
ap.update()

surf = mlab.pipeline.surface(ap.output, figure=fig)
surf.visible = False
vcp = mlab.pipeline.scalar_cut_plane(ap.output, plane_orientation='z_axes', figure=fig)
outline = mlab.outline(surf, figure=fig)

mlab.show()
于 2019-07-29T02:53:07.390 回答