我正在嘗試使用 Mayavi 制作一個簡單的表面影片,但由于缺乏在線示例(少數非常不清楚或無用)和官方檔案,我很掙扎。我寫了一個非常簡單的代碼來顯示到目前為止我已經去了哪里
import numpy as np
from mayavi import mlab
import time
#Meshgrid u Surface
x = np.arange(0,1,0.1)
y = np.arange(0,1,0.1)
X,Y = np.meshgrid(x,y)
u = np.ones((10,10))
surf = mlab.mesh(X,Y,u)
#Surface animation
@mlab.animate(delay=1000)
def anim():
for n in range(1,10):
global u
print(n)
u = u 1
surf.mlab_source.scalars = u
yield
anim()
mlab.show()
非常簡單,每次迭代我都會從一個 10x10 的 1 矩陣傳遞到 10x10 的 2 矩陣,依此類推。
我遇到的問題是3
- 我真的不明白是什么
mlab_source.scalars:基本上我不知道如何告訴它 z 軸正在改變,并且這樣做它遵循u - Mayavi 打開了,但網格都是平面和黑色的,好像有一些問題
u - 我不明白是做什么的
yield:在我正在撰寫的實際代碼中,它會提前大量停止計算(比如在 300 步中它會在第 29 步停止),但我無法洗掉它
我真的無法理解,這是我努力的幾個星期,希望有人能提供幫助。提前致謝。
編輯:
我試圖在類似于我的情況下擴展@E.Klahn 代碼
import numpy as np
from mayavi import mlab
s = 0.01
x = np.arange(0,1,0.1)
y = np.arange(0,1,0.1)
X,Y = np.meshgrid(x,y)
Z = np.ones((10,10))
m = mlab.mesh(X, Y, Z)
@mlab.animate(delay=20)
def anim():
for i in range(1,100):
m.mlab_source.z = np.ones((10,10))*s*i
yield
anim()
mlab.show()
但我只得到一個向上的平面,而不是像他的代碼中那樣進化的三維物件。
編輯2:
這里的作業代碼只是復制@E.Klahn 的示例,我非常感謝
import numpy as np
from mayavi import mlab
x = np.arange(0,1,0.1)
y = np.arange(0,1,0.1)
X,Y = np.meshgrid(x,y)
X,Y=X.T,Y.T #seems an important command
u = np.ones((10,10))
surf = mlab.surf(X,Y,u)
@mlab.animate(delay=500)
def anim():
for n in range(1,10):
print(n)
surf.mlab_source.scalars = 1 np.sin(X)*np.sin(Y)*np.sin(n)
yield
anim()
mlab.show()
我只是列印它以使上面的代碼具有連續性并發現差異。
uj5u.com熱心網友回復:
在這里,我展示了繪制一個立方體并為其設定影片的代碼,以便它使用mlab.mesh. 是什么yield做的是,它回傳控制裝飾讓現場可以更新。
import numpy as np
from mayavi import mlab
s = 0.01
X = np.array([[0,0,1,1],[0,0,1,1],[0,0,0,0],[1,1,1,1]])
Y = np.array([[0,1,1,0],[0,1,1,0],[1,0,0,1],[1,0,0,1]])
Z = np.array([[0,0,0,0],[s,s,s,s],[0,0,s,s],[0,0,s,s]])
m = mlab.mesh(X, Y, Z)
@mlab.animate(delay=20)
def anim():
for i in range(1,101):
print(i, end='\r')
m.mlab_source.z = np.array([[0,0,0,0],[s*i,s*i,s*i,s*i],[0,0,s*i,s*i],[0,0,s*i,s*i]])
yield
anim()
mlab.show()
scalars如果該資料結構具有scalars屬性,則它是訪問底層資料結構的一種方式。但是,因為mesh沒有使用該屬性,而是您想要訪問z和設定這些值。u除非有可追溯的作業,否則我不知道您的具體問題是什么。與此相同yield- 我認為沒有理由該關鍵字會在任何特定步驟停止影片。
下面的代碼顯示了一個隨時間演變的表面,而不是一個隨時間演變的盒子。
import numpy as np
from mayavi import mlab
def evolving_function(X, Y, t, Lx=1, Ly=1):
return np.sin(X Lx*t)*np.sin(Y Ly*t)
Lx, Ly = 1,2
x = np.linspace(-10,10,100)
y = np.linspace(-10,10,100)
X,Y = np.meshgrid(x,y)
X, Y = X.T, Y.T
s = evolving_function(X, Y, 0, Lx=Lx, Ly=Ly)
m = mlab.surf(X, Y, s)
dt = 50
t = 10
steps = int(10*1000/dt)
@mlab.animate(delay=dt)
def anim():
for i in range(1,steps):
m.mlab_source.scalars = evolving_function(X, Y, dt*i, Lx=Lx, Ly=Ly)
yield
anim()
mlab.show()
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/408699.html
標籤:
