一、引言
Matlab具有强大的可视功能,也可以用其制作动画。最简单的实现动画的方法就是用设定好目标图元的动作路线,之后使用循环语句和暂停命令pause来实现更新图元的位置,这样动画就制作完成了。
本文以三只小燕子(可以理解为一家三口,哈哈)在某个区域内飞翔为例,带你一步一步学习简易动画的制作。
二、制作简易动画步骤
1、绘制动画的目标图形
1)绘制一只小燕子,可以使用正弦曲线拼接的方法(有点简单,像简易硬笔画),具体做法是:
取0~pi之间的正弦曲线做燕子的翅膀
0~pi/2之间的曲线当做右翅膀
pi/2~pi之间的曲线当做左翅膀
代码如下:

x1 = [ 0:0.01:1/2 ] * pi;%右侧翅膀横坐标
y1 = sin( x1 );          %右侧翅膀纵坐标
x2 = [ 1/2:0.001:1 ] * pi;%左侧翅膀横坐标
y2 = sin( x2 );           %左侧翅膀纵坐标
p1 = plot( (x1+pi)/2, (y1+3)/2, 'k' );%右翅膀在右侧,所以需要“+pi”
hold on
p2 = plot( x2/2, (y2+3)/2, 'k' );
axis( [ -8, 10, 0, 10 ] )

绘图结果:(有点孤单)


2)绘制另外两只小燕子,仿照上面的做法即可,代码如下:

p3 = plot( (x1+pi)/2+2, (y1+3)/3, 'k' );
p4 = plot( x2/2+2, (y2+3)/3 , 'k' );
p5 = plot( (x1+pi)/3-2, (y1+3)/3, 'k' );
p6 = plot( x2/3-2, (y2+3)/3, 'k' );

结果如下图所示:

到这里是不是发现了,画小燕子原来如此简单。当然了说是鸿雁那就更像了。
2、设定场景
1)给矩形区域增加背景色
%给矩形区域添加背景色

axis( [ -8, 10, 0, 10 ] )
set( gca, 'color', [ 1, 1, 0.9 ] );%gca表示当前图形区域

2)再画个红太阳

%绘制红太阳
t = (0:0.1:2) * pi;
x = 0.5 * cos(t) + 8;
y = 0.5 * sin(t) + 9;
fill( x, y, 'r' )
axis equal
axis( [ -8, 10, 0, 10 ] )%此语句是用来重新调整绘图区域

此时得到的图像窗口如下图所示:


3)再画两座上(这样看着是不是背景更丰富一点)
%绘制两座高山

xh = [ -8 : 0.2 : 8 ];
yh1 = 2 * exp( -(xh + 5).^2 / 2 );
fill( xh, yh1, 'b' )
hold on
yh2 = 1.5 * exp( -xh.^2 / 4 );
area( xh, yh2, 'FaceColor', [ 0.1, 0.1, 0.9 ] );

此时动画的背景就变成了如下图所示,看起来是不是比上一步的图好看了一点。当然了你也可设计的更漂亮一些。

3、规划运动路线
假设小燕子沿着正弦曲线或者余弦曲线运动

path_x = [-2 : 0.01 : 2] *pi;%横坐标
path_y1 = sin( dir );        %第一只小燕子的飞行路线
path_y2 = cos( dir );        %第二只小燕子的飞行路线
path_y3 = cos( fliplr(dir) );%第三只小燕子的飞行路线

4、运动设计
把三只小燕子分布放到指定的初始位置,然后用set命令修改每只小燕子对应的图像句柄(p1,p2)、(p3,p4)和(p5,p6)的位置坐标即可实现小燕子的位置改变了。再加上循环语句和暂停命令pause,就是可以实现小燕子的飞行动画。代码如下(以飞行5个周期为例,也可以修改周期的值,或者直接改为死循环也可以):

hight = 2;%设定小燕子的初始高度
period = 5; %运动周期
k = 0;
len = length( path_x );
while k < periodfor i = 1 : lenset( p1, 'Xdata', path_x(i) +(x1+pi)/2, 'Ydata', path_y1(i)+2  + (y1+3)/2 + hight );set( p2, 'Xdata', path_x(i) + x2/2, 'Ydata', path_y1(i) + 2 + (y2+3)/2 + hight );set( p3, 'Xdata', path_x(i)-2 + (x1+pi)/2, 'Ydata', path_y2(i)+2  + (y1+3)/3 + hight );set( p4, 'Xdata', path_x(i)-2 + x2/2, 'Ydata', path_y2(i) + 2 + (y2+3)/3 + hight );set( p5, 'Xdata', path_x(len-i+1) + (x1+pi)/3, 'Ydata', path_y3(i) + 2  + (y1+3)/3 + hight );set( p6, 'Xdata', path_x(len-i+1) + x2/3, 'Ydata', path_y3(i) + 2 + (y2+3)/3 + hight );pause(0.02);endpath_x = fliplr( path_x );%逆向返回飞行k = k + 1;
end

至此,关于小燕子在某个场景中飞行的简单动画就绘制完成了。
飞行中两个场景如下:


三、完整的代码

%取0~pi之间的正弦曲线做燕子的翅膀
%0~pi/2之间的曲线当做右翅膀
%pi/2~pi之间的曲线当做左翅膀
clear all
clc
x1 = [ 0:0.01:1/2 ] * pi;%右侧翅膀横坐标
y1 = sin( x1 );          %右侧翅膀纵坐标
x2 = [ 1/2:0.001:1 ] * pi;%左侧翅膀横坐标
y2 = sin( x2 );           %左侧翅膀纵坐标
p1 = plot( (x1+pi)/2, (y1+3)/2, 'k' );%右翅膀在右侧,所以需要“+pi”
hold on
p2 = plot( x2/2, (y2+3)/2, 'k' );
axis( [ -8, 10, 0, 10 ] ) %规划处矩形区域p3 = plot( (x1+pi)/2+2, (y1+3)/3 + 3, 'k' );
p4 = plot( x2/2+2, (y2+3)/3 + 3 , 'k' );p5 = plot( (x1+pi)/3-2, (y1+3)/3 + 1, 'k' );
p6 = plot( x2/3-2, (y2+3)/3 + 1, 'k' );%给矩形区域添加背景色
axis( [ -8, 10, 0, 10 ] )
%set( gcf, 'doublebuffer', 'on');
set( gca, 'color', [ 1, 1, 0.9 ] );%gca表示当前图形区域%绘制红太阳
t = (0:0.1:2) * pi;
x = 0.5 * cos(t) + 8;
y = 0.5 * sin(t) + 9;
fill( x, y, 'r' )
axis equal
axis( [ -8, 10, 0, 10 ] )
%绘制两座高山
xh = [ -8 : 0.2 : 8 ];
yh1 = 2 * exp( -(xh + 5).^2 / 2 );
fill( xh, yh1, 'b' )
hold on
yh2 = 1.5 * exp( -xh.^2 / 4 );
area( xh, yh2, 'FaceColor', [ 0.1, 0.1, 0.9 ] );%运动路线
path_x = [-2 : 0.01 : 2] *pi;%横坐标
path_y1 = sin( path_x );        %第一只小燕子的飞行路线
path_y2 = cos( path_x );        %第二只小燕子的飞行路线
path_y3 = cos( fliplr(path_x) );%第三只小燕子的飞行路线
set( gcf, 'doublebuffer', 'on');
hight = 2;%设定小燕子的初始高度
period = 5; %运动周期
k = 0;
len = length( path_x );
while k < periodfor i = 1 : lenset( p1, 'Xdata', path_x(i) +(x1+pi)/2, 'Ydata', path_y1(i)+2  + (y1+3)/2 + hight );set( p2, 'Xdata', path_x(i) + x2/2, 'Ydata', path_y1(i) + 2 + (y2+3)/2 + hight );set( p3, 'Xdata', path_x(i)-2 + (x1+pi)/2, 'Ydata', path_y2(i)+2  + (y1+3)/3 + hight );set( p4, 'Xdata', path_x(i)-2 + x2/2, 'Ydata', path_y2(i) + 2 + (y2+3)/3 + hight );set( p5, 'Xdata', path_x(len-i+1) + (x1+pi)/3, 'Ydata', path_y3(i) + 2  + (y1+3)/3 + hight );set( p6, 'Xdata', path_x(len-i+1) + x2/3, 'Ydata', path_y3(i) + 2 + (y2+3)/3 + hight );pause(0.02);endpath_x = fliplr( path_x );%逆向返回飞行k = k + 1;
end

MATLAB制作简易小动画入门详解相关推荐

  1. 利用MATLAB实现图片切换动画效果详解

    内容摘要:本博文介绍MATLAB图片切换动画效果的制作以及GIF文件保存,并结合具体代码详细解释.介绍了利用MATLAB编程进行几幅图片的轮流切换,切换时实现与幻灯片切换相似的炫酷的图片切换特效.其中 ...

  2. 用matlab画椭圆曲线方程,椭圆曲线入门详解

    转载请注明http://blog.csdn.net/boksic 如有疑问欢迎留言 如果不知道数学上的群.循环群等概念,可以先了解ElGamal加密算法 后再回过来椭圆曲线加密 这两个算法有共通之处, ...

  3. MATLAB绘制平面填充图入门详解

    一.引言 在画图的时候,为了让图形更加清晰突出,往往需要对某一条或几条曲线围成的区域进行填冲颜色,以得到填充图.对于平面图形的填充,可以matlab的命令fill和area等实现. 二.fill命令的 ...

  4. MATLAB程序设计之循环结构入门详解

    一.引言 Matlab可以类似C/C++语言或者Python语言一样可以编写程序以完成某些功能.Matlab程序包含三大程序结构,分别是顺序结构.选择结构和循环结构.本文主要给出了Matlab程序的循 ...

  5. 利用Animation控件制作帧动画过程详解

    利用Animation控件制作帧动画过程详解 前言 通过Animation控件来达到序列图的播放(素材和示例视频在文章末尾) 一.序列图 (此素材为已经分割好的序列图) 如若序列图在一张图片上,请参考 ...

  6. Matlab S-Function函数入门详解

    Matlab S-Function函数入门详解 Part I: 所谓s函数是system Function的简称, 用它来写自己的simulink模块. s函数可以用matlab.C.C++.Fort ...

  7. Unity动画系统详解5:BlendTree混合树是什么?

    摘要:"Animator中有一个功能,用来解决多个动画之间的混合,经常用于移动动画之间的混合,这个功能叫做BlendTree,混合树." 洪流学堂,让你快人几步.你好,我是跟着大智 ...

  8. unity velocity_Unity动画系统详解5:BlendTree混合树是什么?

    摘要:"Animator中有一个功能,用来解决多个动画之间的混合,经常用于移动动画之间的混合,这个功能叫做BlendTree,混合树." 洪流学堂,让你快人几步.你好,我是跟着大智 ...

  9. T4M插件放入unity后怎么找不到_Unity动画系统详解4:如何用代码控制动画?

    摘要:通过上一篇咱们知道了播放动画需要使用Animator,那么如何用代码控制动画呢? 洪流学堂,让你快人几步.你好,我是跟着大智学Unity的萌新,我叫小新,这几周一起来复(yu)习(xi)动画系统 ...

  10. Jetpack Compose入门详解(实时更新)

    Jetpack Compose入门详解 前排提醒 前言(Compose是什么) 1.实战准备 一.优势与缺点 二.前四课 三.标准布局组件 1.Column 2.Row 3.Box 四.xml和com ...

最新文章

  1. 解决:Error: Aesthetics must be either length 1 or the same as the data (5): fill
  2. 轻松易懂的缓存雪崩、穿透、击穿以及解决方案
  3. 【alibaba-cloud】Gateway网关
  4. 云技术概况:云计算的优点/特点/类型/服务模式
  5. Nginx教程系列四:实现反向代理配置
  6. 基于display:table的CSS布局
  7. 记一次node项目重构改进
  8. 调用远程接口上传文件
  9. String s String s=null和String s=a区别
  10. leetcode之String to Integer (atoi)
  11. java正则表达式版本_java 正则表达式 版本号_java正则表达式?=.*_密码的正则表达式java...
  12. 【推荐系统】特征值分解(谱分解)和奇异值分解(SVD),即在PCA上的应用
  13. “U盘写保护”什么解除
  14. 折腾了好久 ORA-00904: : 无效的标识符
  15. python 制作刷题程序
  16. cad批量选择相同块_cad怎么快速选择相同图形/块?
  17. 海马汽车何以“焕新春”?
  18. Supervisor安装、管理守护进程
  19. Neutrino追问AMA第13期|DOS NETWORK 王琦 :预言机只是一个数据的搬运工,而非产生者
  20. 【图形学】向量的点乘和叉乘

热门文章

  1. Apizza-流程测试模式
  2. java jni 傻瓜教程
  3. 微信公众平台开发进阶篇资源集锦
  4. 文QT5下载安装教程
  5. [网络安全自学篇] 五十六.i春秋老师分享小白渗透之路及Web渗透技术总结
  6. webstorm主题
  7. 鸟哥的linux私房菜 简书,《鸟哥的linux私房菜》学习笔记
  8. 基于Servlet面试题进行JavaWeb入门学习
  9. 基础面试题:JSP和Servlet
  10. 智鹰科技——无人机线路巡检系统商业计划书