生成半球面三角网格并在每个顶点表示数据(值或颜色)

0 投票
1 回答
703 浏览
提问于 2025-04-17 23:18

我想生成一个看起来像半球的表面。目前我做的事情是读取一个已经存在的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))

撰写回答