matlab动画

本文介绍了使用Matlab进行动画制作的方法,包括通过getframe命令创建简单动画和利用图形的EraseMode属性提升动画效率。同时提供了布朗运动和圆形路径动画的具体实现案例。
动画制作通常有两种方法:一种是预先将图形制作好,并放到图形缓冲区内,然后
一帧一帧地播放。另一种方法是保持整个背景图案不变,只更新运动部分的图案,以便
加快每幅图的实时生成速度。
1.简单动画制作
在 getframe 命令下,可以完成动态数据到动态画面的制作。其使用格式及制作步
骤一般为:
for j=1:n
plot_command
M(j) = getframe;
end
movie(M,n)
其中M(j)=getframe 将当前图形窗口中的画面作为第j 帧存入矩阵M,movie(M,n)将按
-307-
顺序放映矩阵M 中存储的画面,并重复n 次。

x=-3:0.1:3;
[x,y]=meshgrid(x);
z=sin(x.*y).*exp(x.*y/5);
for j=1:30
mesh(cos(4*pi*j/30)*z,z)
m(j)=getframe
end
movie(m,10)
例 模拟 6 个移动物体
x0=[150 85 150 145 130 0];
y0=[140 85 155 50 150 0];
q=[243 236 220.5 159 230 52]*pi/180;
t=0:0.05:2*pi;
for i=0:280
pause(0.01);
for j=1:5
axis([0 160 0 160]);
fill(x0(j)+0.8*i*cos(q(j))+4*cos(t),y0(j)+0.8*i*sin(q(j))+4*sin(t),'b')
hold on;
end
fill(x0(6)+0.8*i*cos(q(6))+4*cos(t),y0(6)+0.8*i*sin(q(6))+4*sin(t),'r')
hold off;
end
2.其它例子
在 Matlab 里利用图形的“EraseMode”属性可以实现显示新对象,擦除旧对象,而
又不破坏背景图案。图形的“EraseMode”属性有以下四种:
normal 方式
重绘整个显示区,这种方式产生的图形最准确,但较慢。
none 方式
不做任何擦除,直接在原来图形上绘制。
xor 方式
对象的绘制和擦除由背景颜色和屏幕颜色的异或而定。只擦除和屏幕颜色不一致
的旧对象的点,只绘制和屏幕颜色不一致的新对象的点。
background 方式
把旧对象的颜色变为背景色,这种方式影响被擦除对象下面的对象。
当新对象的属性修改后,应刷新屏幕,使新的对象显示出来。Matlab 里屏幕刷新
的命令是drawnow。drawnow 命令使Matlab 暂停目前的任务而去刷新屏幕。若不使用
drawnow 命令,Matlab 则等到任务序列执行完后才刷新。
例 布朗运动
(1)先确定布朗运动的点数n 和一个温度s(或速度)。比如n=20,s=0.002。达
到最好的动画效果的n、s 与使用的计算机的性能有关。在以原点为中心、边长为1 的
正方形内产生n 个位置随机分布的点。
-308-
(2)在单位正方形里绘制所有的点。设置图形的“EraseMode”属性为异或(xor),
即当图形的某个点的位置变化时,不用全部重绘图形,而只绘制不相同的部分,这将大
大提高绘图速度。
(3)用while 循环实现动画效果,在每一次循环中给点的坐标加上一些正态分布
的噪声,这样整个图形中只有点的坐标发生变化,而不用全部重绘整个图形。
程序如下:
clc,clear
n=20;s=0.002;
axis square
grid off
x=rand(n,1)-0.5;y=rand(n,1)-0.5;
h=plot(x,y,'.');
set(h,'EraseMode','xor','MarkerSize',18)
while 1
x=x+s*rand(n,1);y=y+s*rand(n,1)
set(h,'Xdata',x,'Ydata',y)
if all(x>1) & all(y>1)
break
end
drawnow
end
例 制作一幅钻石沿着圆周运动的动画。
程序如下:
t=0:pi/200:pi*2;
x=sin(t);y=cos(t);
axis square
plot(x,y,'b')
n=length(t);
h=line('color','red','marker','diamond','erasemode','xor');
i=1;j=1;
while 1
set(h,'xdata',x(i),'ydata',y(i))
drawnow
i=i+1;j=j+1;
if i>n
i=1;
end
if j>2*n
break
end
end
### 如何在 MATLAB 中创建动画 MATLAB 提供了多种方法用于创建动画,主要分为两种方式:实时绘制动画和录制并生成影片。以下是详细的教程以及示例代码。 #### 实时绘制动画 对于简单的动画场景,可以采用逐更新的方式,在每次迭代中重新绘制图形的一部分或全部内容。这种方法适合于计算量较小、动画复杂度不高的场合[^1]。 ```matlab % 初始化参数 figure; axis([0, 10, 0, 10]); hold on; for t = 1:100 % 更新数据 x = sin(t/10); y = cos(t/10); % 绘制当前 plot(x, y, 'o', 'MarkerSize', 10, 'Color', 'r'); % 设置绘图属性 drawnow; % 刷新画面 end ``` 上述代码展示了如何通过 `drawnow` 函数实现实时刷新效果。每一步都会清除上一帧的内容,并重绘新的位置点。 #### 录制并生成影片 当动画较为复杂或者需要保存为视频文件时,推荐使用 `getframe` 和 `VideoWriter` 来捕获每一帧图像并将其合成电影文件。这种方式允许更灵活的操作,比如调整分辨率、速率等。 ```matlab % 初始化变量 fig = figure; set(fig,'Position',[100 100 800 600]); % 调整窗口大小 h = animatedline('Color','b'); % 创建一条蓝色线条对象 xlim([-pi, pi]); ylim([-1, 1]); % 开始捕捉 vidObj = VideoWriter('sine_wave.mp4'); % 定义输出视频名称 open(vidObj); x = linspace(-pi, pi, 200); y = zeros(size(x)); for i = 1:length(x) yi = sin(i / length(x) * 2*pi); addpoints(h,x(i),yi); % 获取当前 frame = getframe(gcf); writeVideo(vidObj, frame); % 将写入视频 % 可选进度条显示 disp(['Processing Frame ', num2str(i)]); end close(vidObj); % 关闭视频流 disp('Animation saved as sine_wave.mp4.'); ``` 此脚本利用 `animatedline` 对象逐步构建曲线路径,并借助 `getframe` 抓取屏幕上的渲染结果作为单张图片存储到内存缓冲区里;最后调用 `writeVideo` 方法把这些静态拼接成动态影像序列。 #### 总结 无论是简单还是复杂的动画需求,都可以基于以上介绍的技术实现。前者侧重快速原型开发,后者则提供了更高的定制化可能性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值