Matlab|Matlab绘制简单动画

偶然间发现matlab很万能,平时用matlab做实验显得有点敷衍了,今天学习了一点做简单动图的东西,语法很简单,实际就是要有深厚的数学功底哇!
一、运动的余弦函数 打开了matlab,新建文件animation1.m, 开始第一个简单的练手工作,要想运动,就得先做一个余弦函数
先定义其X的定义域,再令Y=sin(X);即可有如下效果

X = -2*pi : 0.1 : 2*pi; Y = sin(X); plot(X,Y)

Matlab|Matlab绘制简单动画
文章图片

而我们要实现运动的效果,实际就是所有的点向右平移了,所有定义域就要发生改变,这里定义平移的尺度为0.1,对应的值也要发生相应改变,这里注意set的用法,它重新设定了新值,即把我们新的X,Y的值赋给h,而drawnow表示绘制这时候的图形
X = X + 0.1; Y = sin(X); set(h, 'XData', X, 'YData', Y); drawnow;

这样我们就能得到一个平移了0.1的余弦图形了,怎么样才能一直平移呢,就是让他一直循环下去,利用while true即可实现
while true X = X + 0.1; Y = sin(X); set(h, 'XData', X, 'YData', Y); drawnow; end

一个移动的图就得到了。
这里再提供一种更简单的方法。
while true X = X + 0.1; Y = sin(X); plot(X,Y); getframe; end

这里的getframe可以实现set的功能。
Matlab|Matlab绘制简单动画
文章图片

再注意一下,我们的代码停止运行的话会产生如下错误,但没有影响的。
Matlab|Matlab绘制简单动画
文章图片

这是由于我们关掉了窗口,绘制图形就识别不到了我们的参数,所有报错了。
二、会动的弹簧 同样我们先做一个不会动的弹簧,怎么做一个螺旋型的呢,就需要我们的两个方向的余弦,正弦函数,再绘制一个三维图即可,为了使弹簧形状更美观,这里设置了其坐标轴标度。
theta = -10*pi : 0.1 : 10*pi; X = cos(theta); Y = sin(theta); Z = theta; plot3(X, Y, Z); axis( [-2, 2, -2, 2, -10*pi, 10*pi]);

Matlab|Matlab绘制简单动画
文章图片

注意一下这里的Z轴决定了它的高度。
为了压缩,那就是要乘以一个系数就好,不停压缩的话就是不停乘以系数,给予合适的压缩次数,而要弹回来,那就要除以我们的系数,达到增大高度的目的。
压缩弹簧
for i = 1: 100 Z = 0.98*Z; set(h, 'XData', X, 'YData', Y, 'ZData', Z); drawnow; end

弹回去
for i = 1: 100 Z = Z/0.98; set(h, 'XData', X, 'YData', Y, 'ZData', Z); drawnow; end

我们这里选定次数为100次,然后再用一个总的while true循环包括这两部分就可以实现我们的不停的跳动了。
Matlab|Matlab绘制简单动画
文章图片

一定要设定坐标轴固定,不然跳动的效果会受影响。
三、会转的时钟 做完两个是不是就已经套路是啥了呢,时钟就是确定原点为中心,画一个圆,一根会转的线,圆的话用我们的余弦函数就好了
t = 0 : pi/50 : 2*pi; X = cos(t); Y = sin(t); plot(X,Y); hold on; axis equal;

注意这里时间的划分,是pi/50,跨度越小,越接近于完美的圆,同时说明两个地方的用法(如果这里跨度取0.1的话,会看到圆的右侧有个缺口)
hold on 帮助我们保持住我们的圆,不被我们后面要画的直线覆盖住
axis equal 保持我们的两个坐标轴刻度相同,使圆更圆
那我们接下来就是画线了,我们知道一条直线实际上就是一个向量,确定两个点就可以了,我们这里一个是原点,一个假定为(1,0),那我们就可以得到X轴上的线了
lineX = [0 ,1]; lineY = [0 ,0]; h = plot(lineX, lineY);

Matlab|Matlab绘制简单动画
文章图片

那如何让这根线转动呢,那就是要将我们的(1,0)坐标换成很多个与角度有关的点就可以了
theta = 0; while true theta = theta + 0.1; lineX(2)= cos(theta); lineY(2)= sin(theta); set(h, 'XData', lineX, 'YData', lineY); drawnow; end

先令角度theta为0,然后慢慢增加,令坐标为cos(theta)和sin(theta)即可,其余按套路来即可。注意这里的矩阵表示法lineX(2)和lineY(2)都是表示第二个元素。
效果图如下:
Matlab|Matlab绘制简单动画
文章图片

然后可以自己再加几根线上去,做成一个完整的时钟哦!
四、密集的三维波形图 【Matlab|Matlab绘制简单动画】这个图形密集恐惧症勿进哈!
X = -10 : 0.2 : 10; Y = -10 : 0.2 : 10; [X,Y] = meshgrid(X,Y); Z = sin(X) + cos(Y); h = surf(X,Y,Z); axis([-10 , 10, -10, 10, -20, 20]); while true for i = 1 : 100 Z = Z*0.97; set(h, 'XData',X, 'YData', Y, 'Zdata',Z); drawnow; endfor i = 1 : 100 Z = Z/0.97; set(h, 'XData',X, 'YData', Y, 'Zdata',Z); drawnow; end end


这里我们的meshgrid用来生成x,y平面即根据x y 生成网格得到坐标点集合(X, Y),surf用来绘制三个方向的图,其余和前面一样哦!可以先自己动手试试
五、可以吃的曲奇饼 话不多说,直接上饼来恰!
R1 = 2; t = 0 : 0.1 : 10; for n = 1: length(t) theta = 0 : pi/50 : 2*pi; phi = 0 : pi/50 : 2*pi; [theta, phi] = meshgrid(theta, phi); R2= 1+ 0.2*cos(8*(phi-theta-t(n))); X = (R1 + R2.*cos(theta)).*cos(phi); Y = (R1 + R2.*cos(theta)).*sin(phi); Z = R2.*sin(theta); surf(X, Y, Z); axis equal; axis([-3.5, 3.5, -3.5, 3.5, -1.5, 1.5]); shading interp M(n) = getframe; end

Matlab|Matlab绘制简单动画
文章图片

提供一下思路:
做一个圆,使其围绕Z轴旋转,但要注意不是规则的旋转,故肯定会有两个角度,这和我们建立球坐标系原理是一样的,主要是X,Y,Z的坐标如何设定,然后为了让他运动,就要改变它的R2,使其随时间变化即可!
今天学完之后真开心!

    推荐阅读