第一堂课布置了一个Mission Impossible作业,要求学生们用Matlab制作一个动画,模拟小球的自由落体运动。

以下将整个任务的问题解决的过程分享如下:

步骤一,这是一个动画的制作过程,以 “Matlab” + "动画"为关键词先问一声度娘,得到线索“怎样用Matlab做动画演示”。

这个资料里有提到一种制作动画的方法getframe,每画一幅图片就getframe一次赋给一个变量,比如说M,最后的时候用movie(M,1)播放这个动画,或者用movie2avi函数将动画保存成一个avi文件。

步骤二,这时候问题转移到,如何制作每一帧图片。我们需要画一个画布,同时在画布上生成一个坐标对象,并且借助坐标把一个实心或者空心圆画上去。以 “Matlab” + "画图"为关键词再度娘,得到两个线索,第一个是Figure的机制,第二个是类似火星十一郎-张朋飞写的“Matlab绘图”,通过这些线索可以了解画图一般都会先设置一个Figure,然后在规定好X轴和Y轴的axis的指定位置上plot一个实心或者空心圆。

很显然,这一步是非常难的,因为大部分分享Matlab信息的网友很难从一个Matlab初学者的角度来思考,经常一上来就大谈特谈plot函数,很少有人会一开始就讲Figure机制(我们是需要一个画布的呀!),在Matlab里边作图需要借助特定的对象axis,然后才是plot函数的使用。

代码写出来会很简单:

figure;

axis([0 20 0 20]);

plot(10, 10, '-or');%坐标轴X为10,和Y为10的位置,画一个实线的(用'-'来表示)空心圆(用'o'来表示),颜色为红色(用'r'来表示)

这个坐标轴是动态的,需要借助一个set函数,将当前的axis的坐标轴属性固定住,代码如下:

set(gca,'nextplot','replacechildren','box','off','color','w','xgrid','off')

步骤三,掌握了画单个图片的方法,接下来就是要画自由落体的每一帧的图片了。这里的X可以固定起来,设为定值10;Y一开始是在最高的位置,设为H0 = 20,当球开始下落的时候这个Y值是随着时间t的变化而变化的,变化的速度又和加速度a有关,它具体指向自由落体的小球的高度:currentHeight = H0 - 0.5 * a * t * t  。这部分是高中物理知识,假定不考虑空气摩擦力的话,这里的加速度就可以用重力加速度g来表示,一般可以简单设为定值10。

这样,整个程序就写出来了:

% FileName is :: movieExample.m

% clear

clc; clear; close all;

figure('toolbar','none','menubar','none','NumberTitle','off','name','自由落体动画录制');

axis([0 20 0 20])

set(gca,'nextplot','replacechildren','box','off','color','w','xgrid','off')

%initialize, based on about 2s movie, 20 frame/s

tEnd = 2;

frameN_s = 20;

nFrame = tEnd * frameN_s;

zyltMovie = moviein(nFrame, gcf);  %初始化一个zyltMovie的矩阵

g = 10;

v0 = 0;

t0 = 0;

dt = 0.05;

h0 = 20;

% LOOP

for iFrame = 1:nFrame

t = t0 + dt * iFrame;

v = v0 + g * t;

currentHeight = h0 - 1/2 * v * t;

plot(10, currentHeight, '-or');

zyltMovie(:,iFrame) = getframe(gcf);

end

movie2avi(zyltMovie, 'AnimateEllipse.avi', 'compression', 'None');

如果能够让小球触地后反弹,动画会更生动有趣。在算法上,它只是涉及到对高中物理知识的运用,(1)当小球下落的时候,当高度currentH < 0 的时候,说明小球已经触地,需要将作用于小球的加速度反向,a = -g,同时小球的速度也要重新初始化,比如设 v0 = -0.67v  ;(2)当小球上升的时候,当速度 v > 0 的时候,说明小球已经到达最高点并开始下落,这个时候加速度再次变成 a = g。

修改过的版本如下:

% FileName is :: movieExample.m

% clear

clc; clear; close all;

figure('toolbar','none','menubar','none','NumberTitle','off','name','自由落体动画录制');

axis equal;

axis([0 20 0 20]);

set(gca,'nextplot','replacechildren','box','off','color','w','xgrid','off')

%initialize, based on about 8s movie, 20 frame/s

tEnd = 10;

frameN_s = 20;

nFrame = tEnd * frameN_s;

zyltMovie = moviein(nFrame, gcf);

g = 10;

a = g;

dt = 0.05;

v0 = 0;

t0 = 0;

h0 = 20;

Flag_Down = 1;

Flag_Up = 0;

currentFlag = Flag_Down;

for iFrame = 1:nFrame

if currentFlag == Flag_Down

t = dt * iFrame - t0;

v = v0 + a * t;

currentH = h0 - 0.5 * v * t;

if currentH < 0

plot(10, currentH, '.r', 'markersize', 50);

zyltMovie(:,iFrame) = getframe(gcf);

currentFlag = Flag_Up;

a = -g;

t0 = dt * iFrame;

v0 = -0.67 * v;

continue;

else

plot(10, currentH, '.r', 'markersize', 50);

zyltMovie(:,iFrame) = getframe(gcf);

end

end

if currentFlag == Flag_Up

t = dt * iFrame - t0;

v = v0 - a * t;

currentH = -v0 * t + 0.5 * a * t * t;

if v > 0

plot(10, currentH, '.r', 'markersize', 50);

zyltMovie(:,iFrame) = getframe(gcf);

currentFlag = Flag_Down;

a = g;

t0 = dt * iFrame;

v0 = 0;

h0 = currentH;

continue;

else

plot(10, currentH,'.r', 'markersize', 50);

zyltMovie(:,iFrame) = getframe(gcf);

end

end

end

movie2avi(zyltMovie, 'AnimateEllipse.avi', 'compression', 'None');

matlab小球水平抛出,如何用Matlab制作小球自由落体运动的动画相关推荐

  1. matlab 地形模拟程序,MATLAB模拟小球自由落体运动

    大部分朋友学习MATLAB,需要一个学习示例用来参考,有一个比较经典的题目就是如何利用Matlab模拟小球自由落体运动,这可能会是你的某次课后作业,这个程序的编写过程可以分为三个步骤: 第一部分,设置 ...

  2. ae制作小球轨迹运动_利用Ae制作出自由落地运动小球的详细步骤

    各位知道在Ae中如何制作出自由落地运动小球呢?不太会操作的用户可以去下文学习下利用Ae制作出自由落地运动小球的详细步骤. 我们先准备好小球图片素材,背景颜色为黑色.导入素材,新建合成.将素材拖拽的合成 ...

  3. 自由落体matlab代码,应用MATLAB辅助自由落体运动教学

    Vd.27 No.4 (2006) 物理教师 PHYSICS TEACHER 第27卷第4期 2006年 ·现代教学技术· 应用MATLAB辅助"自由落体运动"教学 林德志 (北京 ...

  4. 模拟自由落体运动的小球

    基于VS2019   EasyX插件   C/C++ 生成一个模拟自由落体运动的小球 #include <iostream> #include <graphics.h> #in ...

  5. 第1关:小球自由落体运动-------C语言程序设计技术(循环结构程序设计1)

    第1关:小球自由落体运动-------C语言程序设计技术(循环结构程序设计1) #include<stdio.h> #include<math.h>int main(void) ...

  6. matlab 无穷符号,如何用matlab进行级数或数列的符号求和?matlab符号求和指令分享...

    如何进行级数或数列的求和,在高中<数学>课上的数列和大学<高等数学>中的级数都有有遇到过这种问题,这如果用人脑来计算的话非常耗时,难度较大.但是用matlab就可以轻松解决.下 ...

  7. matlab基带信号速率,如何用MATLAB产生25Gbaud的基带QPSK调制信号

    如何用MATLAB产生25Gbaud的基带QPSK调制信号 包括生成随机符号序列,进行QPSK调制,过采样,脉冲成型滤波和降采样.有错误敬请指正. 参数设置:symbol rate=25Gbaud D ...

  8. matlab excel 排序,“如何用matlab处理多个excel表格中的数据“excel怎么排序

    请问如何在matlab gui界面中插入excel表格并可进行编辑 最简单的方法,gui界面上一个table控件,放置两个按钮. 按钮名字分别改为打开和保存,table的属性里,把columnname ...

  9. matlab求和脚本,如何用matlab进行级数或数列的符号求和?matlab符号求和指令分享...

    如何进行级数或数列的求和,在高中<数学>课上的数列和大学<高等数学>中的级数都有有遇到过这种问题,这如果用人脑来计算的话非常耗时,难度较大.但是用matlab就可以轻松解决.下 ...

最新文章

  1. 机器学习中的各种距离
  2. tensorflow中的seq2seq例子为什么需要bucket? 有关tensorflow 的sequence2sequence例子,为什么需要用到buckets,rnn不是可以处理任意长度的数据吗
  3. “欢迎光临”用其他各国语言怎么写、怎么说?
  4. SAP UI5 初学者教程之四:XML 视图初探试读版
  5. 单自由度系统的振动的幅频特性曲线及相频特性曲线及matlab分析,实验四 线性系统的频域分析...
  6. 简要分析电话光端机的常见问题
  7. IaaS、PaaS、SaaS、BaaS、FaaS、APaaS、IPaaS、IDaaS、DaaS
  8. numpy 一些知识
  9. TinyML与Tensor Flow Lite的关系
  10. Android学习之Activity生命周期
  11. 关于Linux系统之VM安装配置(每一个步骤都超级详细的哦!)
  12. 【测试沉思录】7. 测试左移的一点思考
  13. “快易需求系统”数据库设计心得
  14. vue实现 可拖拽的div
  15. python 检验两个样本均值是否相同_假设检验|第四章:置信区间和置信水平
  16. 【Android Jetpack】Room——基本使用篇
  17. 疫情又又又来了,看我爬取京东6000款口罩,来看看那一款最适合你
  18. IDL编译器系列-入门篇
  19. 中国科学院计算机所张浩,航天科技集团调研组到计算所交流
  20. 基于协同过滤算法为电视产品制订个性化推荐

热门文章

  1. Android:滤镜效果ColorMatrix用法一
  2. 数字电子技术设计--彩灯控制电路的设计与制作
  3. 【浏览器兼容】火狐浏览器滚动条不出现问题
  4. couchbase_Couchbase评论:智能NoSQL数据库
  5. mencoder的配置文件
  6. 计算并输出正整数n的各位数字之积
  7. CH3NH3PbBr2I(MAPbBr2I ) 甲胺铅溴碘盐1472068-58-8
  8. 万字长文---手把手教你加固内核安全配置
  9. 程序猿赚的那点钱算个P啊!
  10. 综测仪 之 IQxel使用方法介绍