从 Mayavi 管道中提取数据——特别是点定义面的坐标

Extracting data from Mayavi pipeline -- specifically coordinates for a point-defined-surface

我是 运行 一个脚本,用于创建由一组点定义的圆柱面。我正在使用 Mayavi 来渲染可视化效果。对于以下脚本,如何找到每个点的坐标?似乎 Mayavi 在数据管道的幕后执行此操作,但我不太确定如何提取它。或者,我尝试做嵌套的 for 循环,但我还没有找到正确的算法……在此期间我会继续尝试。但是,如果有人知道如何从 Mayavi 管道中提取它们,那就太好了,因为我不必再增加任何计算时间。

import numpy as np
import mayavi
from mayavi import mlab

class cylinder:
  def __init__(self, radius, length):
    phi, x = np.mgrid[0:np.pi:50j, 0:length:50j]
    self.z = radius * np.sin(phi)
    self.y = radius * np.cos(phi)
    self.x = x
    self.mesh = mlab.points3d(self.x,self.y,self.z, mode = 'point')


def main():
  cylinder = cylinder(radius=1,length=2)
  mayavi.mlab.axes()
  mlab.show()


main()

你传递给mayavi的所有数据都会出现在相应的数据源中。但是,我要指出的是,我认为您不会经常想要对管道中的数据进行逆向工程,因为首先是您传递了这些数据(因此您应该能够跟踪无需深入研究低级 vtk 机制)。

无论如何,假设您的管道中只有一个场景和一个数据源:

engine = mlab.get_engine()
source = engine.scenes[0].children[0]
# choose a scene among engine.scenes if necessary
# choose a source among engine.scenes[0] if necessary

points_data = np.array(source.data.points)

在您的具体示例中,您将三个形状为 (50,50) 的数组传递给 points3d。我们得到的 points_data 是一个形状为 (2500,3) 的数组。可疑的。果然,我们可以将其reshape成合适的形状,以便重构原始数据:

x,y,z = points_data.T
# x,y,z have shape (2500,) now, no way to know the "true" original shape

# if we know what their shape _should_ be, we can fix that too:
x,y,z = points.data.reshape(50,50,3).transpose(2,0,1)

# compare to the original data
radius,length = 1,2
phi, x0 = np.mgrid[0:np.pi:50j, 0:length:50j]
z0 = radius * np.sin(phi)
y0 = radius * np.cos(phi)
print(np.array_equal(x, x0)) # True
print(np.array_equal(y, y0)) # True
print(np.array_equal(z, z0)) # True

由于输入数组的多维结构与 mayavi 无关,我不指望我们可以用正确的 shape 从管道。如果我是 mayavi,我会 ravel 所有输入数组丢失所有可能的多维结构,我很确定这正是发生的事情。