[問題] 快速的方式畫出3D動畫圖

看板Python作者 (@ Home)時間13年前 (2012/03/25 14:18), 編輯推噓1(101)
留言2則, 2人參與, 最新討論串1/1
我覺得這圖很好 http://matplotlib.sourceforge.net/trunk-docs/examples/animation/simple_3danim.html 或是這個影片(有一個物件在裡面動,外面有個額外視窗可以看軌跡) http://www.youtube.com/watch?v=0GzCw92Q7a4
希望用類似這code的方式畫出我生產出來的三維data import matplotlib import time import math import matplotlib as mpl from mpl_toolkits.mplot3d import Axes3D import matplotlib.animation as animation import mpl_toolkits.mplot3d.axes3d as p3 import numpy as np import matplotlib.pyplot as plt import numpy from pylab import * class vec(object): def __init__(self, x, y, z): self.vec=(x, y, z) def unit(self, vec): dist=math.sqrt(vec[0]**2+vec[1]**2+vec[2]**2) u=(vec[0]/dist,vec[1]/dist,vec[2]/dist) return u def add(self, vector1, vector2): summation=(vector1[0]+vector2[0], vector1[1]+vector2[1], vector1[2]+vector2[2]) return summation def addfour(self, vec1, vec2, vec3, vec4): comebine1=vector.add(vec1,vec2) comebine2=vector.add(vec3,vec4) outcome=vector.add(comebine1, comebine2) return outcome def smultiply(self,scalar, vec): product=(scalar*vec[0],scalar*vec[1],scalar*vec[2]) return product def innerproduct(self, vec1, vec2): result=(vec1[0]*vec2[0]+vec1[1]*vec2[1]+vec1[2]*vec2[2]) return result def crossproduct(self, vec1, vec2): res=(vec1[1]*vec2[2]-vec1[2]*vec2[1], vec1[2]*vec2[0]-vec1[0]*vec2[2], vec1[0]*vec2[1]-vec1[1]*vec2[0]) return res def function(self, vec1, vec2): coef1=c1*inner(vec2, vec2) term1=self.smultiply(coef1, vec2) term2=self.smultiply(c2,self.crossproduct(vec2,vec1)) term3=self.smultiply(c3,(0,0,1)) term4=self.smultiply(c4*vec1[2],vec1) sumoffour=self.addfour(term1,term2,term3,term4) out=self.smultiply(h, sumoffour) return out def rungekutta1(self,vec1,vec): k11=self.smultiply(h,vec) k11_half=self.smultiply(.5, k11) y12=self.add(vec, k11_half) k12=self.smultiply(h,y12) k12_half=self.smultiply(.5, k12) y13=self.add(vec, k12_half) k13=self.smultiply(h,y13) y14=self.add(vec, k13) k14=self.smultiply(h,y14) k12_double=self.smultiply(2.0, k12) k13_double=self.smultiply(2.0, k13) k1s=self.addfour(k11, k12_double, k13_double, k14) n_next=self.add(vec1, self.smultiply(1.0/6, k1s)) return n_next def rungekutta2(self, vec1, vec2): k21=self.function(vec1, vec2) n22=self.add(vec1,self.smultiply(.5*h,(1,1,1))) d_n22=self.add(vec2,self.smultiply(.5,k21)) k22=self.function(n22,d_n22) n23=self.add(vec1,self.smultiply(.5*h,(1,1,1))) d_n23=self.add(vec2,self.smultiply(.5,k22)) k23=self.function(n23,d_n23) n24=self.add(vec1,self.smultiply(h,(1,1,1))) d_n24=self.add(vec2,k23) k24=self.function(n24,d_n24) k22_double=self.smultiply(2.0,k22) k23_double=self.smultiply(2.0,k23) k2s=self.addfour(k21, k22_double, k23_double, k24) d_n_next=self.add(vec2, self.smultiply(1.0/6, k2s)) return d_n_next fig = plt.figure() ax = p3.Axes3D(fig) c1=-1.0 c2=-3.0 c3=4.0 c4=-5.0 h=.01 vector=vec(1,2,3) allone=vec(1.0,1.0,0.0) n=(1.0,1.0,.0) d_n=(1.0,-1.0,.0) n=vector.unit(n) d_n=vector.unit(d_n) for i in arange(1,100): n=vector.rungekutta1(n, d_n) n=vector.unit(n) d_n=vector.rungekutta2(n, d_n) d_n=vector.unit(d_n) x = n[0] y = n[1] z = n[2] d_x=d_n[0] d_y=d_n[1] d_z=d_n[2] 主要其實就在最後這部分,生產出一堆向量n & d_n, 希望是邊算邊畫出來位置在跑的狀況,理想上還要把跑的速度(d_n)給顯示出來 不過我想先試試看有沒有簡單的指令,可以做到把點(n, position)的改變 重複描繪在同一個3d圖裡面?或是其實如果只有更新的點也可以 (不過那樣的話要有夠明顯的標示) 我有嘗試加上 ax.plot(x,y) plt.show() 或是 ax.plot3d(x,y,z) plt.show() 沒效果 能提供一點建議嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.24.62.187 ※ 編輯: Strogatz 來自: 114.24.62.187 (03/25 14:51)

04/01 15:50, , 1F
慘 沒人理我 不過我想我應該是搞得出來拉
04/01 15:50, 1F

04/10 10:38, , 2F
如果是要畫單純的3D圖形,可以考慮用Vpython試試看
04/10 10:38, 2F
文章代碼(AID): #1FRhYQi8 (Python)
文章代碼(AID): #1FRhYQi8 (Python)