回顾一下昨天和前天的学习,简单的来说就是学习了Matplotlib库以及其中较为重要的操作,matplotlib库非常适合二维图样
的绘制工作,但是,一旦我们上升到3维空间,matplotlib就不太好用了,所以这个时候我们就要重新想办法来绘制三维图像,今天,就来开始学习三维图像的绘制。
先来了解一个概念:降维:
我们用的视频显示装置(VDU)都是二维的,所以,三维或者是更高维度的图像的绘制和表示,我们都需要降维度到二维空间,,假设有一个维度为(x,y,z,...)的图像,要将他显示出来,最常用,最简单的有两种方法:
- 截面技术
这个就是说,我们对一个空间或者是更高维度的物体,在特定的位置曲截面,如取x=10的这个截面,这个时候我们只需要输出该物体X=10的一个切片就好:
图一:3D图片
就比如说图一,这个是个3d的吧,我们就可以用切片的方式来显示(当然,这会别说是这个3d的能显示的出来,这是ppt自带的,你自己写程序的话,你不切片,怎么搞):
图二:图一切片
好,切片之后,就获得了他的二维图像
- 投影技术:
这个更简单,就是用一个投影算子
来在一张2D图片上显示3D影像:
举个最形象的例子:三视图,分别是左投影和上投影,实在不行了,你就想想你拿着杨桃在手里转了一圈,分别看到的样子
图三:三视图
ok简单的讲解了之后,我们来看看可视化软件,最有名的有HDF(分层数据格式)和VTK(可视化工具包),还有很多,比如说mayavi、paraview这些,他们都有python接口,都是免费的,效果还都很不错,书里面主要讲的是Malab,那么就用这个吧。
首先,跟着书上的讲解来做一个孤立波的可视化:Korteweg-de Vries方程,具体的公式自己查去,不想写了,就写个孤立波:
这里,考虑三个截面,就是假设u是x的函数,但u取决于t、c这两个三叔,改变t、c的数字,输出图形,这就是交互时操作任务
先敲一敲书上的代码:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider,Button,RadioButtons
def solwave(x,t,c):
return c/(2*np.cosh(np.sqrt(c)*(x-c*t)/2)**2)
fig,ax=plt.subplots()
plt.subplots_adjust(left=0.15,bottom=0.30)
plt.xlabel("x")
plt.ylabel("u")
x=np.linspace(-5.0,20.0,1001)
t0=5.0
c0=1.0
line,=plt.plot(x,solwave(x,t0,c0),lw=2,color="blue")
plt.axis([-5,20,0,2])
axcolor="lightgoldenrodyellow"
axtime=plt.axes([0.2,0.15,0.65,0.03],fc=axcolor)
axvely=plt.axes([0.2,0.15,0.65,0.03],fc=axcolor)
stime=Slider(axtime,'Time',0.0,20.0,valinit=t0)
svely=Slider(axvely,'Vely',0.1,3.0,valinit=c0)
def update(val):
time=stime.val
vely=svely.val
line.set_ydata(solwave(x,time,vely))
fig.canvas.draw_idle()
svely.on_changed(update)
stime.on_changed(update)
resetax=plt.axes([0.75,0.025,0.1,0.04])
button=Button(resetax,'reset',color=axcolor,hovercolor='0.975')
def reset(event):
svely.reset()
stime.reset()
button.on_clicked(reset)
plt.show()
书上直接做了一种类似GUI的,这里有个错误请大家不要忽视,plt.axes这个函数中的axisbg命令已经被弃置了,现在是fc=axcolor,给大家看一看我截取的几幅图:
图四
图五
图六
能把这个吃透,就已经很不错了,之后的交互式操作才能做的更好
然后是做个动画任务:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider,Button,RadioButtons
from JSAnimation import IPython_display
def solwave(x,t,c=1):
return c/(2*np.cosh(np.sqrt(c)*(x-c*t)/2)**2)
# Initializayion
fig=plt.figure()
ax=plt.axes(xlim=(-5,20),ylim=(0,0.6))
line,=ax.plot([],[],lw=2)
t=np.linspace(-10,25,91)
x=np.linspace(-5,20.0,101)
def init():
line.set_data([],[])
return line,
def animate(i):
y=solwave(x,t[i])
line.set_data(x,y)
return line,
animation.FuncAnimation(fig,animate,init_func=init,frames=90,interval=30,blit=True)
很奇怪,第20行是显示输出的,但是显示不了,试了好几种方法,不是闪退就是输出空白,有个人解决了这个问题,大家可以看一看他的博客:解决方案:python FuncAnimation 无法显示动画_funcanimation显示不出来_宇内虹游的博客
最后就是电影任务,两个步骤,组建一组帧文件,然后组合
import numpy as np
import matplotlib.pyplot as plt
import os
c=1
def solwave(t,x):
return c/(2*np.cosh(np.sqrt(c)*(x-c*t)/2)**2)
def plot_solwave(t,x):
fig=plt.figure()
ax=fig.add_subplot(1,1,1)
ax.plot(x,solwave(t,x))
ax.set_ylim(0,0.6*c)
ax.text(-4,0.55*c,"t="+str(t))
ax.text(-4,0.50*c,"c="+str(c))
x=np.linspace(-5,20.0,101)
t=np.linspace(-10,25,701)
for i in range(len(t)):
file_name="_temp%05d.png"%i
plot_solwave(t[i],x)
plt.clf()
os.system("rm_movie.mpg")
os.system("C:/Users/L/AppData/Local/Programs/Python/Python310/Lib/site-packages/ffmpeg -r 25"+" -i _temp%05d.png -b: v 1800 _movie.mpg")
os.system("rm_temp*.png")
呃,的确是运行成功没问题,但我真的很想知道,输出到哪去了。。。
咱就说,害怕不,找不到这个电影去哪了。