使用triangular_mesh生成半球形表面并在每个顶点处表示数据(作为值或颜色)

时间:2014-03-21 14:35:41

标签: python mayavi

我想生成一个看起来像半球的表面。到目前为止我所做的是读取已经存在的BEM网格并尝试在其上显示标量值。但现在我必须在半球而不是Bem网格上显示标量值。而且我不知道如何使用看起来像半球的三角形网格来生成。

这个半球需要包含一组N个点(x,y,z)[使用mlab.triangular_mesh]并且在每个顶点我需要将N个数据(浮点数)表示为值或使用变量colormap(例如:蓝色(数据的最低值)为红色(数据的最高值))。 data =一个大小为2562的数组,一组浮点值,可以随机生成,作为另一个代码的一部分。点也是另一组代码的一部分。形状(2562,3)。但形状不是半球形 这是我用于使用BEM表面查看的程序

fname = data_path + '/subjects/sample/bem/sample-5120-5120-5120-bem-sol.fif'
surfaces = mne.read_bem_surfaces(fname, add_geom=True)
print "Number of surfaces : %d" % len(surfaces) 
head_col = (0.95, 0.83, 0.83)  # light pink
colors = [head_col]
try:
     from enthought.mayavi import mlab
except:
     from mayavi import mlab
mlab.figure(size=(600, 600), bgcolor=(0, 0, 0))
for c, surf in zip(colors, surfaces):
    points = surf['rr']
    faces = surf['tris']
    s=data
    mlab.triangular_mesh(points[:, 0], points[:, 1], points[:, 2],faces,color=c, opacity=1,scalars=s[:,0])



#mesh= mlab.triangular_mesh(x,y,z,triangles,representation='wireframe',opacity=0)        #point_data=mesh.mlab_source.dataset.point_data
#point_data.scalars=t
#point_data.scalars.name='Point data'
#mesh2=  mlab.pipeline.set_active_attribute(mesh,point_scalars='Point data')

1 个答案:

答案 0 :(得分:0)

正如其他人已经指出你的问题不是很清楚,并且不包含一个容易重现的例子 - 你的例子需要相当多的工作才能让我们重现,而你没有详细描述你所采取的步骤。

尝试做什么很容易。可以为每个顶点(即每个VTK点)定义标量:

surf = mlab.triangular_mesh(x,y,z,triangles)
surf.mlab_source.scalars = t

你需要设置一个标志来让它们出现,我认为这可能是你的问题:

surf.actor.mapper.scalar_visibility=True

这是生成半球的一些代码。它产生一个VTK聚数据。我不是100%确定mayavi来源是否与triangular_mesh的源类型相同,但我认为是。

res = 250. #desired resolution (number of samples on sphere)
phi,theta = np.mgrid[0:np.pi:np.pi/res, 0:np.pi:np.pi/res]

x=np.cos(theta) * np.sin(phi)
y=np.sin(theta) * np.sin(phi)
z=np.cos(phi)

mlab.mesh(x,y,z,color=(1,1,1))