Извлечение данных из трубопровода Mayavi - в частности, координаты для определенной поверхности

Я запускаю сценарий для создания цилиндрической поверхности, определяемой набором точек. Я использую Mayavi для визуализации визуализаций. Для следующего скрипта, как я могу найти координаты каждой точки? Кажется, что Mayavi делает это за кулисами в конвейере данных, но я не слишком уверен, как его извлечь. В качестве альтернативы я попытался выполнить вложенные циклы, но я не определился с правильным алгоритмом... Тем временем я продолжу попытки. Однако, если кто-то знает, как извлечь их из конвейера 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()

1 ответ

Решение

Все данные, которые вы передаете в 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), Подозрительно. Конечно же, мы можем изменить его в соответствующую форму, чтобы восстановить исходные данные:

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, я не думаю, что мы можем восстановить оригинал x,y,z массивы правильной формы из конвейера. Если бы я был майяви, я бы ravel все входные массивы теряют всю возможную многомерную структуру, и я почти уверен, что именно так и происходит.

Другие вопросы по тегам