生成半球面三角网格并在每个顶点表示数据(值或颜色)
我想生成一个看起来像半球的表面。目前我做的事情是读取一个已经存在的BEM网格,并尝试在上面显示标量值。但现在我需要在一个半球上显示这些标量值,而不是在BEM网格上。我不知道怎么用三角形网格生成一个看起来像半球的东西。
这个半球需要包含一组N个点(x,y,z)(使用mlab.triangular_mesh),在每个顶点上我需要表示N个数据(浮点数),可以用数值或者颜色变化来表示(比如:蓝色代表数据的最低值,红色代表最高值)。这些数据是一个大小为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
正如其他人所指出的,你的问题不太清楚,而且没有提供一个容易复现的例子——你的例子需要我们花费不少时间才能复现,而你也没有很清楚地描述你所采取的步骤。
你想要做的事情其实很简单。可以为每个顶点(也就是每个VTK点)定义标量值:
surf = mlab.triangular_mesh(x,y,z,triangles)
surf.mlab_source.scalars = t
而且你需要设置一个标志,让它们显示出来,我觉得这可能是你遇到的问题:
surf.actor.mapper.scalar_visibility=True
这里有一些代码可以生成一个半球体。它会产生一个VTK的多边形数据。我不太确定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))