Изменение количества точек в анимации Mayavi - PullRequest
0 голосов
/ 05 марта 2019

Вот простой анимационный скрипт на Python Mayavi:

from mayavi import mlab
import numpy as np

alpha = np.linspace(0, 2*np.pi, 100)
beta = np.linspace(0, np.pi, 100)

x = np.sin(beta) * np.cos(alpha)
y = np.sin(beta) * np.sin(alpha)
z = np.cos(beta)

plt = mlab.points3d(x, y, z)

@mlab.animate(delay=100)
def anim():
    global x, y, z

    f = mlab.gcf()
    for _ in range(100):
        # x = np.concatenate((x, [np.random.random()]))
        # y = np.concatenate((y, [np.random.random()]))
        # z = np.concatenate((z, [np.random.random()]))

        x = 1.1 * x

        plt.mlab_source.set(x=x, y=y, z=z)
        f.scene.render()
        yield


anim()
mlab.show()

Это хорошо работает, и точки перемещаются. Тем не менее, я хотел бы раскомментировать np.concatenate строки так, чтобы количество точек менялось во время анимации ... Mayavi, похоже, не поддерживает это?

Я думаю, что это ограничение связано с эффективностью обновления сюжета, но я бы хотел, чтобы вышесказанное сработало и не обращало внимания на скорость.

Есть идеи?

Я пытался просто реплотировать mlab.points3d(x, y, z) после mlab.clf(), но анимация не отображается - только последний кадр.

Заранее спасибо.

1 Ответ

1 голос
/ 13 марта 2019

Вы должны использовать reset() вместо set() на документы :

x, y = np.mgrid[0:3:1,0:3:1]
s = mlab.surf(x, y, np.asarray(x*0.1, 'd'),
            representation='wireframe')
# Animate the data.
fig = mlab.gcf()
ms = s.mlab_source
for i in range(5):
    x, y = np.mgrid[0:3:1.0/(i+2),0:3:1.0/(i+2)]
    sc = np.asarray(x*x*0.05*(i+1), 'd')
    ms.reset(x=x, y=y, scalars=sc)
    fig.scene.reset_zoom()
...