8

我正在使用mayavi (3.3.2) 来显示体积等值面。

通常,我的体积没有立方体素;例如,采样网格可能在 X 和 Y 方向为 1mm x 1mm,但在 Z 方向为 1.4mm。

如何使用 mayavimlab.contour3d或以正确的空间比例显示这些卷mlab.pipeline.iso_surface?我真的不希望将卷重新采样为立方网格。

说明问题的另一种方式:我可以做些什么来让下面的代码显示一个球体而不是一个扁平的椭球体(将volume其预期的 1:1:2 纵横比体素作为给定的,并且不重新生成或重新采样体积)。

import numpy as np
from enthought.mayavi import mlab

def sqr(x): return x*x

s=64
x,y,z = np.ogrid[0:s,0:s,0:s/2]

volume = np.sqrt(sqr(x-s/2)+sqr(y-s/2)+sqr(2*z-s/2))

isos = mlab.contour3d(volume,contours=[5,15,25],transparent=True)
mlab.show()

我猜应该有某种方法可以获取底层的 VTK 图形管道(它的变换等)并插入适当的各向异性缩放(如果没有某种方法可以通过 mlab API 更直接地做到这一点)。

4

1 回答 1

7

为此,scalar_field从输入数据显式创建对象是最简单的。

实际上,我经常这样做,因为我们喜欢在地质学中深入研究(积极向下)。这意味着您需要在 z 方向上进行负增量。如果它只是各种 mlab 函数的参数,那就太好了,但它仍然不太难做到。

from mayavi import mlab
import numpy as np

s=64
x,y,z = np.ogrid[0:s,0:s,0:s/2]

data = np.sqrt((x-s/2)**2 + (y-s/2)**2 + (2*z-s/2)**2)

grid = mlab.pipeline.scalar_field(data)
grid.spacing = [1.0, 1.0, 2.0]

contours = mlab.pipeline.contour_surface(grid, 
                         contours=[5,15,25], transparent=True)
mlab.show()

具有非立方体素的球壳

于 2011-05-24T04:00:59.917 回答