Matlab绘制简单动画

偶然间发现matlab很万能,平时用matlab做实验显得有点敷衍了,今天学习了一点做简单动图的东西,语法很简单,实际就是要有深厚的数学功底哇!


一、运动的余弦函数

打开了matlab,新建文件animation1.m, 开始第一个简单的练手工作,要想运动,就得先做一个余弦函数
先定义其X的定义域,再令Y=sin(X);即可有如下效果

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

在这里插入图片描述
而我们要实现运动的效果,实际就是所有的点向右平移了,所有定义域就要发生改变,这里定义平移的尺度为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的功能。

在这里插入图片描述
再注意一下,我们的代码停止运行的话会产生如下错误,但没有影响的。
在这里插入图片描述
这是由于我们关掉了窗口,绘制图形就识别不到了我们的参数,所有报错了。


二、会动的弹簧

同样我们先做一个不会动的弹簧,怎么做一个螺旋型的呢,就需要我们的两个方向的余弦,正弦函数,再绘制一个三维图即可,为了使弹簧形状更美观,这里设置了其坐标轴标度。

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]);

在这里插入图片描述
注意一下这里的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循环包括这两部分就可以实现我们的不停的跳动了。
在这里插入图片描述
一定要设定坐标轴固定,不然跳动的效果会受影响。


三、会转的时钟

做完两个是不是就已经套路是啥了呢,时钟就是确定原点为中心,画一个圆,一根会转的线,圆的话用我们的余弦函数就好了

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);

在这里插入图片描述
那如何让这根线转动呢,那就是要将我们的(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)都是表示第二个元素。
效果图如下:
在这里插入图片描述
然后可以自己再加几根线上去,做成一个完整的时钟哦!


四、密集的三维波形图

这个图形密集恐惧症勿进哈!

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;
    end

    for 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

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


今天学完之后真开心!

发布了78 篇原创文章 · 获赞 179 · 访问量 8309

猜你喜欢

转载自blog.csdn.net/qq_44790423/article/details/104599054
今日推荐