[問題] 快速的方式畫出3D動畫圖
我覺得這圖很好
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
04/10 10:38, 2F
Python 近期熱門文章
PTT數位生活區 即時熱門文章