admin 管理员组文章数量: 1087139
2024年3月6日发(作者:websocket文档)
MATLAB技术论坛
电子期刊
编辑:xiezhh
制作:MATLAB技术论坛
版权:MatlabSky©版权所有
网址:
第1期
2010.09No.1
中国权威MATLAB论坛核心期刊
MATLAB技术论坛简介
目 录
1 动画的制作
1.1 电影动画
1.1.1 电影动画演示实例(一)——千变万化的线条
1.1.2 电影动画演示实例(二)——跳动的红心
1.2 擦除动画
1.2.1 Matlab擦除重绘动画实例(一)——运动的小球
1.2.2 Matlab擦除重绘动画实例(二)——单摆横梁
1.2.3 Matlab擦除重绘动画实例(三)——时钟演示
1.2.4 Matlab擦除重绘动画实例(四)——小球绕跑道运动
1.3 质点动画
1.3.1 质点动画演示(一)
1.3.2 质点动画演示(二)——平抛运动
1.3.3 质点动画演示(三)——导弹发射
1.4 霓虹灯效果动画
1.4.1 霓虹灯效果动画实例(一)—— 霓虹闪烁的球体
1.4.2 霓虹灯效果动画实例(二)—— 一颗花心
1.5 GIF格式动画制作
1.5.1 GIF格式动画制作案例——绕螺旋线运动的小球
2 动画的保存
3 有关动画制作的实验报告
4 更多动画实例
4.1 电影动画演示——旋转的山峰
4.2 擦除动画实例——卫星绕地球运动(注释很详细)
4.3 擦除动画实例——太阳|地球|月亮|卫星,绕转演示动画(注释很详细)
5 光学夫朗和费衍射现象模拟MATLAB源代码
6 牛顿环动画演示MATLAB源代码
7 使用MATLAB绘制原子轨道和电子云图形
8 振动摆MATLAB动画源代码
MATLAB基础应用版块
Matlab中动画的实现、制作和保存
/
Matlab的确是一个很优秀的工程计算软件,除了强大的矩阵运算,仿真分析外,绘图功能也是相当的强大。
但是由于Matlab本身的多线程编程缺陷(所谓多线程,就是MATLAB没法同时执行多个回调,只能排队一个一个的按顺序运行,Timer对象除外,它是MATLAB中唯一能够执行多线程的方法),想要动态的画图,并且能够很好的在GUI中得到控制,还不是一件很容易的事情。
但是动画具有生动形象直观的好处,对我的教学、研究等都有不小的作用。那好,我在这里勉为其难的介绍下Matlab中是如何制作动画的。
1 动画的制作
Matlab中动画实现的方法主要有下面三种
1.1 电影动画
帖子地址:/
从不同的视角拍下一系列对象的图形,并保存到变量中,然后按照一定的顺序像电影一样播放。
电影动画的好处就是,运行一次可以多次播放,甚至可以直接生成avi文件,直接独立与Matlab环境播放。这是其它三种动画制作方法所不具备的。
MATLAB中,创建电影动画的过程分为以下四步:
step1:调用moviein函数对内存进行初始化(该步骤在Matlab5.3以上均可省略),创建一个足够大的矩阵,使之能够容纳基于当前坐标轴大小的一系列指定的图形(此处称为帧)。
step2:调用getframe函数生成每个帧。该函数返回一个列矢量,利用这个矢量,就可以创建一个电影动画矩阵。
getframe函数可以捕捉动画帧,并保存到矩阵中。一般将该函数放到for循环中得到一系列的动画帧。该函数格式有:
(1)F=gefframe,从当前图形框中得到动画帧
(2)F=gefframe(h),从图形句柄h中得到动画帧
(3)F=getframe(h,rect),从图形句柄h的指定区域rec中得到动画帧
step3:调用movie函数按照指定的速度和次数运行该电影动画。
当创建了一系列的动画帧后,可以利用movie函数播放这些动画帧。该函数的主要格式有:
(1)movie(M),将矩阵M中的动画帧播放一次
(2)movie(M,n),将矩阵M中的动画帧播放n次
(3)movie(M,n,fps),将矩阵M中的动画帧以每秒fps帧的速度播放n次
step4:调用movie2avi函数可以将矩阵中的一系列动画帧转换成视频文件avi文件。这样,即使脱离了matlab环境都可以播放动画。
该方法的经典格式是:
%录制电影动画
for j=1:n
%
%这里输入我们的绘图命令
%
M(j) = getframe;
end
movie(M)
%单帧显示方法
f = getframe(gcf);
colormap(ap);
image();
1.1.1 电影动画演示实例(一)——千变万化的线条
%by dynamic
%see also
%2008.7.12
close all
figure('toolbar','none','menubar','none','NumberTitle',...
'off','name','电影动画录制——Matlabsky');
axis equal
m=moviein(20,gcf);%在当前窗口下,截取20帧
set(gca,'nextplot','replacechildren','box','off','color','b','xgrid','on')
title('截图当前窗口的20帧动画')
for j=1:20
plot(fft(eye(j+16)))
m(:,j)=getframe(gcf); %截取动画帧,保存到m变量中
end
hh=figure('toolbar','none','menubar','none','NumberTitle',...
'off','name','电影动画播放——Matlabsky');
title('将截取的动画播放5遍')
set(gca,{'xtick','ytick','xticklabel','yticklabel'},{[],[],[],[]})
movie(hh,m,5)
1.1.2 电影动画演示实例(二)——跳动的红心
帖子地址:/?tid=9489
% by xiezhh
x = linspace(-2,2,100);
[X,Y,Z] = meshgrid(x,x,x);
I1 = (X.^2+9/4*Y.^2+Z.^2-1).^3-X.^2.*Z.^3-9/80*Y.^2.*Z.^3;
p = patch(isosurface(X,Y,Z,I1,0));
set(p, 'FaceColor', 'red', 'EdgeColor', 'none');
view(3);
axis equal ;
axis off;
light('Posi',[0 -2 3]); % 在(0,-2,3)点处建立一个光源
lighting phong
set(gca,'nextplot','replacechildren');
% 记录电影
XX = get(p,'XData');
YY = get(p,'YData');
ZZ = get(p,'ZData');
for j = 1:20
bili = sin(pi*j/20);
set(p,'XData',bili*XX,'YData',bili*YY,'ZData',bili*ZZ)
F(j) = getframe;
end
% 放映10次
movie(F,10)
1.2 擦除动画
帖子地址:/
画在图形窗口中按照一定的算法连续擦除和重绘图形对象,表现为动画,这个也是MATLAB中使用最多的方法。
使用Matlab的绘图函数不断重复绘制图形对象,重绘过程中递增式地改变图形对象位置将产生动画效果。在重绘对象的过程中之所以能产生动画效果是由于对原来的图形对象进行了擦除处理。
MATLAB中,创建擦除重绘动画的过程分为以下三步:
step1:设置重绘对象的擦除模式'EraseMode'模式
Matlab的图形绘制函数允许采用不同的擦除模式来擦除原来的对象,不同的擦除模式将产生不同的动画效果。擦除模式是通过没置“EraseMode”属性来完成的,一共有三种擦除模式:
none:重新绘制图形对象时不擦除原来的对象,这种模式可动态演示图形的生成过程,如曲线和旋转曲砸的生成过程
background:在重新绘制图形对象之前。用背景色重绘对象来达到擦除原来图形对象的目的。该模式会擦除任何对象和它下面的任何图形
Xor:在重新绘制图形对象之前,只擦除原来的对象,不会擦除其他对象或图形。这种模式能产生图形对象移动的效果
step2:在循环语句中使用set更改图形的xdata,ydata和zdata等坐标数据
step3:使用darwnow命令刷新屏幕
该方法的经典格式是:
%擦除重绘模式动画
%选择一个擦除模式
set(h,'erasemode',erasemode)%h是需要执行动画图像的句柄,一般都是由line或者plot创建
%
%需要执行一些图形计算命令
%
%循环语句中更新坐标数据,一般使用for或者while
for i=1:n
%
%必要的MATLAB命令
%
set(h,'xdata',xdata,'ydta',ydata)%更新图像的坐标数据
drownnow%刷新屏幕
%
%其它Matlab语句
%
end
1.2.1 Matlab擦除重绘动画实例(一)——运动的小球
function f=anim_ball(K,ki)
%
%演示红色小球沿一条封闭旋螺线运动的实时动画
% 仅演示实时动画的调用格式为 anim_ball(K)
% 既演示实时动画又拍摄照片的调用格式为 f=anim_ball(K,ki)
% K 红球运动的循环数(不小于 1 )
% ki 指定拍摄照片的瞬间,取 1 到 1034 间的任意整数
% f 存储拍摄的照片数据,可用 image() 观察照片
% 产生封闭的运动轨线
%
%
%by dynamic
%all rights reserved by
%2007.10.26
%
t1=(0:1000)/1000*10*pi;
x1=cos(t1);y1=sin(t1);z1=-t1;
t2=(0:10)/10;
x2=x1(end)*(1-t2);y2=y1(end)*(1-t2);z2=z1(end)*ones(size(x2));
t3=t2;
z3=(1-t3)*z1(end);x3=zeros(size(z3));y3=x3;
t4=t2;
x4=t4;y4=zeros(size(x4));z4=y4;
x=[x1 x2 x3 x4];y=[y1 y2 y3 y4];z=[z1 z2 z3 z4];
h=figure('numbertitle','off','name','擦除动画演示(运动的小球)——Matlabsky')
plot3(x,y,z,'b')
axis off
%绘制红点
%擦除模式设为xor
h=line('Color',[1
0],'Marker','.','MarkerSize',40,'EraseMode','xor');
n=length(x);
i=1;j=1;
%循环改变坐标,表现为小球运动
while 1
if ~ishandle(h),return,end
set(h,'xdata',x(i),'ydata',y(i),'zdata',z(i));
drawnow;
pause(0.0005) %这里设置小球运动速度
i=i+1;
if nargin==2 & nargout==1
if(i==ki&j==1);f=getframe(gcf);end %获取指定的帧,保存到f中
end
if i>n
0
%判断是否运行了一周,是将i设置为1,并将运行周数j加1
i=1;j=j+1;
%判断是否到指定的运行周数,是,退出
if j>K;break;end
end
end
1.2.2 Matlab擦除重绘动画实例(二)——单摆横梁
%挂摆横梁
%by dynamic
%see also
%2008.6.9
%
h=figure('numbertitle','off','name','擦除动画演示(挂摆横梁)——Matlabsky')
%绘制横梁
plot([-0.2;0.2],[0;0],'-k','linewidth',20);
%画初始位置的单摆
g=0.98;%重力加速度,可以调节摆的摆速
l=1;%摆长
theta0=pi/4;%初始角度
x0=l*sin(theta0);%初始x坐标
y0=-l*cos(theta0);%初始y坐标
axis([-0.75,0.75,-1.25,0]);
axis off
%创建摆锤
%擦除模式为xor
head=line(x0,y0,'color','r','linestyle','.','erasemode','xor','markersize',40);
%创建摆杆
body=line([0;x0],[-0.05;y0],'color','b','linestyle','-','erasemode','xor');
%摆的运动
t=0;%时间变量
dt=0.01;%时间增量
while 1
t=t+dt;
theta=theta0*cos(sqrt(g/l)*t);%单摆角度与时间的关系
x=l*sin(theta);
y=-l*cos(theta);
if ~ishandle(h),return,end
set(head,'xdata',x,'ydata',y);%改变擦除对象的坐标数据
set(body,'xdata',[0;x],'ydata',[-0.05;y]);
drawnow;%刷新屏幕
end
1.2.3 Matlab擦除重绘动画实例(三)——时钟演示
%将下列命令保存到M文件中,直接运行
%Matlab时钟动画演示
%rewrite by dynamic
%more information please go to
try
close all
hfig=figure('NumberTitle','off','name',...
'Clock Animation Demo--by MatlabSky','MenuBar','none');
theta=linspace(0,6.3,1000);
x1=8*cos(theta);y1=8*sin(theta);
plot(x1,y1,'b','linewidth',1.4)%绘制外表盘
hold on
axis equal
x2=7*cos(theta);y2=7*sin(theta);
plot(x2,y2,'y','linewidth',3.5)%绘制内表盘
fill(0.4*cos(theta),0.4*sin(theta),'r');%绘制指针转轴
axis off
axis([-10 10 -10 10])
set(gca,'position',[[0.13 0.05 0.775 0.815]])
title(date,'fontsize',18)
for k=1:12;
xk=9*cos(-2*pi/12*k+pi/2);
yk=9*sin(-2*pi/12*k+pi/2);
plot([xk/9*8 xk/9*7],[yk/9*8 yk/9*7],'color',[0.3 0.8 0.9]);
text(xk,yk,num2str(k),'fontsize',16,'color',...
[0.9 0.3 0.8],'HorizontalAlignment','center');%表盘时刻标度
end
% 计算时针位置
ti=clock;
th=-(ti(4)+ti(5)/60+ti(6)/3600)/12*2*pi+pi/2;
xh3=4.0*cos(th);
yh3=4.0*sin(th);
xh2=xh3/2+0.5*cos(th-pi/2);
yh2=yh3/2+0.5*sin(th-pi/2);
xh4=xh3/2-0.5*cos(th-pi/2);
yh4=yh3/2-0.5*sin(th-pi/2);
hh=fill([0 xh2 xh3 xh4 0],[0 yh2 yh3 yh4 0],[0.6 0.5 0.3]);
% 计算分针位置
tm=-(ti(5)+ti(6)/60)/60*2*pi+pi/2;
xm3=6.0*cos(tm);
ym3=6.0*sin(tm);
xm2=xm3/2+0.5*cos(tm-pi/2);
ym2=ym3/2+0.5*sin(tm-pi/2);
xm4=xm3/2-0.5*cos(tm-pi/2);
ym4=ym3/2-0.5*sin(tm-pi/2);
hm=fill([0 xm2 xm3 xm4 0],[0 ym2 ym3 ym4 0],[0.6 0.5 0.3]);
% 计算秒针位置
ts=-(ti(6))/60*2*pi+pi/2;
hs=plot([0 7*cos(ts)],[0 7*sin(ts)],'color','w','linewidth',2);
set(gcf,'doublebuffer','on');
while 1;
ti=clock;%每次读取系统时间,并进行运算
% 计算时针位置
th=-(ti(4)+ti(5)/60+ti(6)/3600)/12*2*pi+pi/2;
xh3=4.0*cos(th);
yh3=4.0*sin(th);
xh2=xh3/2+0.5*cos(th-pi/2);
yh2=yh3/2+0.5*sin(th-pi/2);
xh4=xh3/2-0.5*cos(th-pi/2);
yh4=yh3/2-0.5*sin(th-pi/2);
set(hh,'XData',[0 xh2 xh3 xh4 0],'YData',[0 yh2 yh3 yh4 0])
% 计算分针位置
tm=-(ti(5)+ti(6)/60)/60*2*pi+pi/2;
xm3=6.0*cos(tm);
ym3=6.0*sin(tm);
xm2=xm3/2+0.5*cos(tm-pi/2);
ym2=ym3/2+0.5*sin(tm-pi/2);
xm4=xm3/2-0.5*cos(tm-pi/2);
ym4=ym3/2-0.5*sin(tm-pi/2);
set(hm,'XData',[0 xm2 xm3 xm4 0],'YData',[0 ym2 ym3 ym4 0])
% 计算秒针位置
ts=-(ti(6))/60*2*pi+pi/2;
set(hs,'XData',[0 7*cos(ts)],'YData',[0 7*sin(ts)])
drawnow;
pause(0.09)
end
catch
['MatlabSky--打造最优、专业和权威的Matlab技术交流平台!更多信息参见:'...
' ">
return
end
href="matlab:web
1.2.4 Matlab擦除重绘动画实例(四)——小球绕跑道运动
%小球绕跑道运动
%rewrite by dynamic
%more information please go to
%
figure('numbertitle','off','name',...
'Matlab Animation Demo--by matlabsky','MenuBar','none')
prompt={'请输入速度v:','请输入长度L:','请输入半径r:'};
default={'5','10','2'};
v=5;L=10;r=2;
p=inputdlg(prompt,'输入参数',1,default);
v=str2double(p(1));
L=str2double(p(2));
r=str2double(p(3));
if v<=0|L<=0|r<=0
warndlg('Matlabsky提醒您:输入参数必须为整数','警告')
else
axis([0,2*r+L,0,2*r])
ox1=r;oy1=r;ox2=r+L;oy2=r;
x1=r:0.015*v:r+L;
y1=2*r*ones(size(x1));
thita=0:0.015*v/r:pi;
x2=sin(thita)*r+ox2;
y2=cos(thita)*r+oy2;
x3=r+L:-0.015*v:r;
y3=zeros(size(x3));
x4=-sin(thita)*r+ox1;
y4=-cos(thita)*r+oy1;
x=[x1 x2 x3 x4];
y=[y1 y2 y3 y4];
plot(x,y);
text(0,-2,['长度L=' num2str(L) ',' ...
'半径r=' num2str(r) ',' '速度v=' num2str(v)]);
axis equal
set(gca,'Visible','off')
hm=line(r,2*r,'color','red','marker','.','markersize',37,'erasemode','xor');
while 1
for i=1:length(x)
try
set(hm,'xdata',x(i),'ydata',y(i));
pause(0.0003)
drawnow
catch
['MatlabSky--打造最优、专业和权威的Matlab技术交流平台!'...
']
return
end
end
end
end
'">
1.3 质点动画
帖子地址:/
用comet()等函数绘制彗星图,它能演示一个质点的运动。质点运动轨迹动画方式是最简单的动画产生方式,顾名思义,就是产生一个顺着曲线轨迹运动的质点来操作。
Matlab中提供了comet和comet3命令来实现质点运动轨迹动画的绘制,其常用格式为:
comet(xdata,ydata,p) % p是指彗星的尾巴的长度,可以是常数或者size(x)大小的向量
其他具体格式大家可以参考doc comet帮助系统
该方法的使用一般使用步骤如下:
step1:求解出质点完整的运动轨迹坐标x,y和z
step2:使用comet或者comet3直接绘制动点
1.3.1 质点动画演示(一)
%by dynamic
%see also
%2008.6.23
%
t=0:pi/50:10*pi;
x=30*sin(t);
y=30*cos(t);
z=t;
plot3(x,y,z);
hold on
%axis equal
comet3(x,y,z,0.5)
1.3.2 质点动画演示(二)——平抛运动
%by dynamic
%see also
%2008.6.23
%
vx = 40;
t = 0:0.01:10;
x = vx*t;
y = -9.8*t.^2/2;
comet(x,y)
1.3.3 质点动画演示(三)——导弹发射
%by dynamic
%see also
%2008.6.13
%
vx = 100*cos(1/4*pi);
vy = 100*sin(1/4*pi);
t = 0:0.001:15;
x = vx*t;
y = vy*t-9.8*t.^2/2;
comet(x,y)
1.4 霓虹灯效果动画
帖子地址:/
如今繁华大都市的夜色中,霓虹闪烁,煞是好看,调用MATLAB中的spinmap函数可以做出这种效果的动画,它是通过旋转颜色映像的方式来呈现这种霓虹闪烁的动画效果。spinmap函数的调用格式如下:
spinmap % 旋转颜色映像约5秒钟
spinmap(t) % 旋转颜色映像约t秒钟,具体时间取决于硬件
spinmap(t,inc) % 旋转颜色映像约t秒钟,并设置增量参数inc,该参数用来调整闪烁频率
spinmap('inf') % 不限时旋转颜色映像,若需终止,请按Ctrl+C键
1.4.1 霓虹灯效果动画实例(一)—— 霓虹闪烁的球体
% by xiezhh
sphere; % 绘制单位球面
axis equal; % 设置坐标显示比例相同
axis off; % 隐藏坐标轴
spinmap(20,1); % 设置增量参数为1,旋转颜色映像约20秒
1.4.2 霓虹灯效果动画实例(二)—— 一颗花心
帖子地址:/?tid=9489
% by qibbxxt
clear;clc;close all
c=5;
t=linspace(-c,c);
[x,y]=meshgrid(t);
z=17*x.^2-16*abs(x).*y+17*y.^2-225;
pcolor(x,y,z);
shading interp
pause(2);
spinmap(10)
1.5 GIF格式动画制作
帖子地址:/
GIF格式动画以其小巧受到大家的广泛欢迎,本贴以案例形式做一个总结。
制作GIF动画要用到getframe、frame2im、rgb2ind和imwrite函数,getframe函数用来抓取当前图形窗口中的图像,frame2im函数和rgb2ind函数用来将抓取的图像转为索引图像,imwrite函数用来将索引图像写入GIF格式动画,需要注意的是imwrite函数不能将真彩图像写入GIF格式动画。关于这些函数的具体用法,这里不再详述,请版友自行查阅帮助。下面只给出案例。
1.5.1 GIF格式动画制作案例——绕螺旋线运动的小球
% by xiezhh
filename = '';
z = linspace(0, 10*pi, 100); %产生一个行向量
x = [20*sin(z),zeros(1,10)];
y = [20*cos(z),20*ones(1,10)];
z = [z,linspace(10*pi,0,10)];
plot3(x, y, z, 'r', 'linewidth', 2); %绘制螺旋线
hold on %图形保持
h = plot3(0,20,0, '.' , 'MarkerSize' ,40, 'EraseMode' , 'xor' );
xlabel('X'); ylabel('Y'); zlabel('Z'); %添加坐标轴标签
axis([-25 25 -25 25 0 40]); %设置坐标轴范围
view(-210,30); %设置视角
for i = 1:length(x)
set(h, 'xdata' ,x(i), 'ydata' ,y(i), 'zdata' ,z(i));
drawnow; % 刷新屏幕
pause(0.05)
f = getframe(gcf);
imind = frame2im(f);
[imind,cm] = rgb2ind(imind,256);
if i == 1
'Loopcount',inf,'DelayTime',0.1);
else
imwrite(imind,cm,filename,'gif',
imwrite(imind,cm,filename,'gif','WriteMode','append','DelayTime',0.1);
end
end
2 动画的保存
帖子地址:/
下面再讲述下生成的动画如何保存。动画保存,只有对电影动画而言才有意义,其他两种谈不上保存,因为他们都是实时的,眨眼就过的。而电影动画是先将动画一帧一帧的保存下来,在使用movie函数播放。它的好处是,运行一次MATLAB程序就可以播放无数次,只要你的帧数据还在。
但是这还是不方便,由于它没法脱离MATLAB环境,很讨厌。还好MATLAB为我们提供了movie2avi函数,它可以把动画直接转换成avi文件,而avi文件则可以脱离Matalb环境而在其他地方运行了。
请教如何保存matlab的动画?
前几天刚答辩完,给你贴上。
function avimake
warning off;
load data
[M,N,K]=size(data);
data=data/(max(abs(data(:))));
aviobj = avifile('','fps',10);
for kk=1:10:K
imagesc(data(:,:,kk));
set(gca,'clim',[-1 1]);
colormap(hsv(128))
frame = getframe(gca);
aviobj = addframe(aviobj,frame);
end
aviobj = close(aviobj);
直接保存gif动画
m(:,k)=getframe;
%%%构造gif图像的帧,
nn(:,:,:)=getframe;
%%转换为可以直接输出的格式(这会是图像丢失)
%如果要制作彩色的图像,你只能把生成的彩色图像单独制作(使用其他软件)
nn1=;
nn1=rgb2gray(nn1);
imwrite(nn1,'','gif','WriteMode','append')
3 有关动画制作的实验报告
帖子地址:/
设计题目:三维与抛物动画仿真
姓 名:
学 号:
院 系:
专 业:
指导教师:
一.课程设计目的:
1.熟悉课程设计的基本流程;
2:掌握MATLAB语法结构及调试方法;
3:熟悉MATLAB函数调用,熟练二维画图;
4:掌握MATLAB语言在控制方面的运用;
5:学会用MATLAB进行基本仿真;
6:掌握MATLAB编程技巧,提高编程水平。
二.系统分析与设计
该动画仿真开始时是一个三维动画旋转13次,旋转完后将出现另一个窗口继续进行抛物线旋转动画。抛物线旋转26次后结束旋转,此时动画结束,最后关闭动画窗口,返回MATLAB语言环境。
设计要求:第一个动画是三维图形在空中旋转, 第二个是抛物线按照一定的规则旋转,旋转出 一个有形的三维空间多边形。
此MATLAB动画有两个小动画组成,总体为自动弹出式,即,第一个三维动画结束,自动弹出第二个窗口实现抛物线旋转动画。
第一个三维动画运用figure命令创建图形窗口,创建帧矩阵,填充颜色。用movie命令控制转动次数。
第二个动画同样运用figure命令创建一个信的窗口,当第一个动画结束自动由figure命令弹出第二个窗口运行动画。主要是画出三维空间曲线,利用语句控制其旋转方式,并用语句控制旋转次数,由pause控制每次旋转所停顿的时间,最后旋转出所设计的空间图形。
MATLAB动画源程序清单:
%Animation:rotate peak
%by dynamic
%see also
%
figure('name','三维动画 旋转的山峰——Matlabsky');
%绘制三维曲面
[X,Y,Z]=peaks(14);
surfl(X,Y,Z);
axis([-4 4 -4 4 -11 11]); %建立坐标系
axis off; %去除三维网格线
shading interp;
colormap spring;
m=moviein(13); %创建帧矩阵m
for i=1:12 %命令生成图形
view(-37.5+30*(i-1),25);
m(:,i)=getframe; %捕获动画帧
end
movie(m); %回放动画
%Animation:rotate paraboloid
%by dynamic
%see also
%
h0=figure('name','三维动画 旋转抛物面——Matlabsky');
axis([-5 10 -5 10 -10 80]) %建立坐标系
hold on %保持当前图形的所有特性
%定义三组坐标曲线
a=0:0.5:10;
b=zeros(size(a));
c=a.^2;
theta=pi/20;
xx=a; %设置三维长轴坐标数据
yy=b; %设置三维宽轴坐标数据
zz=c; %设置三维高度数据
%画旋转抛物面
for i=1:40
M=[tan(i*theta) cos(i*theta) 0;-cos(i*theta) sin(i*theta) 0;0 0 1];
temp=M*[a;b;c];
xx(i+1,:)=temp(1,:);yy(i+1,:)=temp(2,:);zz(i+1,:)=temp(3,:);
mesh(xx,zz,yy); %绘制三维网格曲面
axis off %去掉三维网格线
pause(0.1) %每次旋转停顿0.1秒
if i==26 %设置旋转次数
break
end
end
三.系统调试过程中出现的主要问题:
1:程序程序出错,常会出现未定义变量:Error: Missing variable or function.使用非英文符号时有Error: "End of Input" expected, ":" found.
2:路径出现错误,会出现程序无相应
3:程序运行时,不能显示出动画图形,只有三维坐标
4:运行一个动画后,不能弹出第二个窗口运行动画
5:没有规定运行次数,会出现不断旋转,无法停止
6:语句运用错误,运行的动画与理论不符
7:常常出现函数调用错误
8:不能熟悉及正确使用各种语句
9:没有掌握matlab语句用法,编程时出现很多的用法及运用的错误
四.系统运行报告与结论:
此动画仿真是由两个单独的动画经过修改后组成的,并在两个不同的窗口依次运行动画。经过调试,三维图形转动,没有出现语法错误,而且符合设计要求。抛物线旋转动画中,运用figure语句创建新的窗口,由抛物线按要求旋转,最后转出实际要求的三维空间图形。两幅图形都准确显示,整个程序运行正常。
开始设计时,是想做出有规则的动画,第二个开始想的是最后旋转出有规则的三维图形。但由于学会的知识太少,不能实现。
五.总结:
Matlab语言是一种广泛应用于工程计算及数值分析 领域的新型高级语言,Matlab功能强大、简单易学、编程效率高;MATLAB语言不同于其他计算机语言,它是一种解释语言,即解释一条就执行一条!而且严格的区分中英文!所以,在编制程序时必须细心!这使我们在编制程序的过程中对MATLAB有了一个深层次的理解!
经过此次MATLAB课程设计,我学到了更多MATLAB的知识。为了完美的完成这次课程设计,查阅资料看了很多MATLAB语言的运用方法,也查阅了很多关于MATLAB的书籍,同时我也掌握了很多新知识,特别是了解了许多MATLAB函数。在设计过程中,我也碰到了许多问题,走了很多弯路,主要是因为对MATLAB还较不熟练,犯了一些常规错误,但最后通我查阅相关书籍和请教同学,问题都解决了。在解决问题过程中,学会了很多MATLAB的知识,最重要的是学会了自己解决问题的能力,知道怎么去处理发生的错误。
总之,通过MATLAB课程设计,我熟悉了课程设计的流程,掌握了MATLAB语言的基本语句 ,学会了独立思考和查阅资料解决问题的能力!
六.致谢:
在这里, 多谢老师为我们给我们讲解知识,并且给了我们这次自己动手做动画的机会,使我发现了做动画的乐趣,从而促使我更进一步的学习MATLAB语言,并将知识应用与实际问题的解决!增添了生活的丰富。特别感谢Matlabsky联盟的【MATLAB动画制作、实现和保存】教程的详细讲解。
七.参考资料:
1.张平编著《MATLAB基础与应用》
2.杨杰,阙大顺编著:《Matlab语言基础及使用入门》
sky技术论坛,
4 更多动画实例
帖子地址:/
更多的MATLAB实例等着大家自己去开发,我们这里提供了一些,大家可以依葫芦画瓢一样学习下,希望起一个抛砖引玉的作用
在本帖中我们提供了如下MATLAB动画实例:电影动画、擦除动画和质点动画。
4.1 电影动画演示——旋转的山峰
%by dynamic
%see also
%2008.6.12
%
figure('toolbar','none','NumberTitle','off','name',...
'电影动画(Rotate Peak)——Matlabsky');
[X,Y,Z]=peaks(30);
surfl(X,Y,Z);
axis([-3 3 -3 3 -10 10]);
axis off;
shading interp;
colormap hot;
m=moviein(15);
for i=1:15
view(-37.5+24*(i-1),30);
m(:,i)=getframe;
end
movie(m);
4.2 擦除动画实例——卫星绕地球运动(注释很详细)
%by dynamic
%see also
%2008.12.23
%
h=figure('numbertitle','off','name','卫星绕地球旋转演示动画——Matlabsky');%设置标题名字
s1=0:.01:2*pi;
hold on;
axis equal;%建立坐标系
axis off;%除掉Axes
r1=10;%地球到太阳的平均距离
r2=3;%卫星的轨道半径
w1=1;%设置地球公转角速度
w2=12;%设置卫星绕地球公转角速度
t=0;%初始时刻
pausetime=.002;%设置视觉暂留时间
sita1=0;
sita2=0;%设置开始它们都在水平线上
set(gcf,'doublebuffer','on') %消除抖动
plot(-20,18,'color','r','marker','.','markersize',40);
text(-17,18,'太阳');%对太阳进行标识
plot(-20,16,'color','b','marker','.','markersize',20);
text(-17,16,'地球');%对地球进行标识
plot(-20,14,'color','w','marker','.','markersize',13);
text(-17,14,'卫星');%对卫星进行标识
plot(0,0,'color','r','marker','.','markersize',60);%画太阳
plot(r1*cos(s1),r1*sin(s1));%画地球公转轨道
set(gca,'xlim',[-20 20],'ylim',[-20 20]);
%画地球初始位置
p1=plot(r1*cos(sita1),r1*sin(sita1),'color','b','marker','.','markersize',30);
l1=plot(r1*cos(sita1)+r2*cos(s1),r1*sin(sita1)+r2*sin(s1));%画卫星绕地球的公转轨道
p2x=r1*cos(sita1)+r2*cos(sita2);
p2y=r1*sin(sita1)+r2*sin(sita2);
p2=plot(p2x,p2y,'w','marker','.','markersize',20);%画卫星的初始位置
orbit=line('xdata',p2x,'ydata',p2y,'color','r');%画卫星的运动轨迹
while 1
if ~ishandle(h),return,end
set(p1,'xdata',r1*cos(sita1),'ydata',r1*sin(sita1));%设置地球的运动过程
%设置卫星绕地球的公转轨道的运动过程
set(l1,'xdata',r1*cos(sita1)+r2*cos(s1),'ydata',r1*sin(sita1)+r2*sin(s1));
ptempx=r1*cos(sita1)+r2*cos(sita2);
ptempy=r1*sin(sita1)+r2*sin(sita2);
set(p2,'xdata',ptempx,'ydata',ptempy);%设置卫星的运动过程
p2x=[p2x ptempx];
p2y=[p2y ptempy];
set(orbit,'xdata',p2x,'ydata',p2y);%设置卫星运动轨迹的显示过程
sita1=sita1+w1*pausetime;%地球相对太阳球转过的角度
sita2=sita2+w2*pausetime;%卫星相对地球转过的角度
pause(pausetime); %视觉暂停
drawnow %刷新屏幕,重绘
end
4.3 擦除动画实例——太阳|地球|月亮|卫星,绕转演示动画(注释很详细)
%by dynamic
%see also
%2008.12.6
%
clear; clc;close all
%定义几组变量.分别代表的含义是:
%相对圆心坐标 半径 最近距离 最远距离 周期 角速度 旋转角度
x0=0; y0=0; r0=80; Lmin0=0; Lmax0=0; T0=2160; w0=0*pi/T0; q0=0;
x1=0; y1=0; r1=40; Lmin1=25; Lmax1=30; T1=1080; w1=pi/T1; q1=0;
x2=0; y2=0; r2=20; Lmin2=8; Lmax2=10; T2=180; w2=pi/T2; q2=0;
x3=0; y3=0; r3=10; Lmin3=3; Lmax3=05; T3=30; w3=pi/T3; q3=0;
%初始化
hh=figure('numbertitle','off','name',...
'太阳|地球|月亮|卫星,绕转演示动画——Matlabsky');
%设置擦除方式
sun=line(0 ,0 ,'color','r','linestyle','.','erasemode',...
'xor','markersize',r0); %太阳
earth=line(x0,y0,'color','k','linestyle','.','erasemode',...
'xor','markersize',r1); %地球
moon=line(x1,y1,'color','b','linestyle','.','erasemode','xor',...
'markersize',r2); %月亮
satellite=line(x2,y2,'color','g','linestyle','.','erasemode',...
'norm','markersize',r3); %卫星
%添加标注
axis off
title('太阳|地球|月亮|卫星',...
'fontname','宋体','fontsize',9,'FontWeight','demi','Color','black');
text(-20,50,'——更多精彩参见');
text(-50,50,'太阳'); %对太阳进行标识
line(-55,50,'color','r','marker','.','markersize',80);
text(-50,40,'地球'); %对地球进行标识
line(-55,40,'color','k','marker','.','markersize',40);
text(-50,30,'月亮'); %对月亮进行标识
line(-55,30,'color','b','marker','.','markersize',20);
text(-50,20,'卫星'); %对卫星进行标识
line(-55,20,'color','g','marker','.','markersize',10);
%绘制轨道
s1=[0:.01:2*pi];
line(Lmax1*cos(s1),Lmin1*sin(s1),'linestyle',':'); %画地球的轨迹,是个椭圆
axis([-60,60,-60,60]); %调整坐标轴
%开始画图
t =0;
while 1
if ~ishandle(hh),return,end
q0=t*w0; q1=t*w1; q2=t*w2; q3=t*w3; t=t+1; %设置运动规律
if t >= 4320; t = 0; end %到了一个周期就重置
%设置太阳圆心的坐标(在这个程序里,太阳圆心的坐标是不变的,所以可以省略)
x0 = Lmax0 * cos(q1); y1 = Lmin0 * sin(q1);
x1 = x0 + Lmax1 * cos(q1); y1 = y0 + Lmin1 * sin(q1); %设置地球圆心的坐标
x2 = x1 + Lmax2 * cos(q2); y2 = y1 + Lmin2 * sin(q2); %设置月亮圆心的坐标
x3 = x2 + Lmax3 * cos(q3); y3 = y2 + Lmin3 * sin(q3); %设置卫星圆心的坐标
set(sun,'xdata',x0,'ydata',y0); %画太阳
set(earth,'xdata',x1,'ydata',y1); %画地球
set(moon,'xdata',x2,'ydata',y2); %画月亮
set(satellite,'xdata',x3,'ydata',y3); %画卫星
line('xdata',x2,'ydata',y2,'color','y'); %设置月亮的轨迹
line('xdata',x3,'ydata',y3,'color','r'); %设置卫星的轨迹
drawnow;
end
5 光学夫朗和费衍射现象模拟Matlab源代码
帖子地址:/
%Fraunhofer Diffraction of a Round Hole
%弗朗和费衍射模拟Matlab源代码
%rewrite by dynamic
%all rights reserved by
%2008.12.3
close all
figure('numbertitle','off','name','弗朗和费衍射模拟--by Matlabsky',...
'toolbar','none','position',[217 266 694 244]);
axes('position',[0.05,0.08,0.6,0.8]);hold on;
title('Fraunhofer Diffraction of a Round Hole',...
'fontsize',14)
set(gcf,'doublebuffer','on');
axis([-4,12,-5,5]);
rectangle('position',[0,1,0.2,3],'FaceColor',[0.1,0.3,0.4]);
rectangle('position',[0,-4,0.2,3],'FaceColor',[0.1,0.3,0.4]);
rectangle('position',[3.8,-4,0.4,8],'FaceColor',...
[0.4,0.3,0.4],'Curvature',[1,1]);
rectangle('position',[11,-5,0.4,10],'FaceColor',[0.1,0.3,0.4]);
h1=plot([-4,-4],[-0.7,-0.7]);
h2=plot([-4,-4],[0,0]);
h3=plot([-4,-4],[0.7,0.7]);
for k=-4:.1:0;
pause(0.05);
try
set([h1,h2,h3],'xdata',[-4,k]);
catch
return
end
end
y=-4:.1:4;
a=linspace(-atan(4/11),atan(4/11),length(y));
a=10*sin(a);
II=abs(sinc(a)).^2*6;
x=11-II;
plot(x,y,'r')
K=find(diff(sign(diff(II)))==-2)+1;
yyN=y(K);
P=zeros(3,5); yN=[-0.7,0,0.7];H=P;
for m=1:3;
for n=1:5;
p=polyfit([0,11],[yN(m),yyN(n)],1);
P(m,n)=complex(p(1),p(2));
H(m,n)=plot(0,yN(m));
end
end
for Q=0:.1:11;
pause(0.05)
for w=1:15;
[m,n]=ind2sub([3,5],w);
Y=polyval([real(P(w)),imag(P(w))],Q);
try
set(H(w),'xdata',[0,Q],'ydata',[yN(m),Y]);
catch
return
end
end
end
axes('position',[0.65,0.08,0.3,0.8])
a=linspace(-atan(4/11),atan(4/11),300);
[X,Y]=meshgrid(a);
r=sqrt(X.^2+Y.^2);
R=10*sin(r);
II=abs(sinc(R)).^2*6;
imshow(II);
disp(['MatlabSky--打造最优、专业和权威的Matlab技术交流平台!更多信息'...
'参见:">'])
6 牛顿环动画演示Matlab源代码
帖子地址:/
7 使用MATLAB绘制原子轨道和电子云图形
帖子地址:/
8 振动摆MATLAB动画源代码
帖子地址:/
版权声明:本文标题:MATLAB 动画图 作动态图 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/p/1709735268a544814.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论