zl程序教程

您现在的位置是:首页 >  后端

当前栏目

MATLAB基础入门之动画

2023-09-14 09:16:38 时间
  • 正弦波动画

先来画一个静态的正弦波图形 ,定义x的范围从-2*pi到2*pi,每0.1步画一个点

x = -2*pi : 0.1 : 2*pi;

计算出y的值

y = sin(x);

使用plot画出图形

plot(x,y);

x = -2*pi:0.1:2*pi;
y = sin(x);
plot(x,y);

 

那么要想波形动起来,x点要移动某个单位值,然后重新计算y的值,再将这些点重绘

先将绘制的点保存起来

h = plot(x,y);

x的值递增0.1并重新计算y的值

x = x+0.1;

y = sin(x);

将新的值重新设置好,使用set函数来实现

set(h,'XData',x,'YData',y);

然后调用drawnow命令来重绘窗口

drawnow;

最后得使用循环不停地执行上面的语句,实现波形动画效果

完整代码如下:

x = -2*pi:0.1:2*pi;
y = sin(x);
h = plot(x,y);

while true
    x = x+0.1;
    y = sin(x);
    set(h,'XData',x,'YData',y);
    drawnow;
end

 

  • 螺旋弹簧动画 

先来画一个静态的螺旋弹簧,定义一个theta的范围从-10*pi到10*pi,分别计算出x,y,z的值

theta = -10*pi:0.1:10*pi;

x = cos(theta);

y = sin(theta);

z = theta;

使用plot3函数画出图形

plot3(x,y,z); 

theta = -10*pi:0.1:10*pi;
x = cos(theta);
y = sin(theta);
z = theta;
plot3(x,y,z);

 

如果想要让弹簧动起来,需要不停地压缩弹簧z轴及伸张z轴,先看压缩弹簧,假如将z軕每次压缩0.98,压缩前将plot3函数绘

制的点保存在h中

 h = plot3(x,y,z);

使用循环压缩200次

for i=1:200

    z = z*0.98; 

  set(h,'XData',x,'YData',y,'ZData',z);

 drawnow;

end

完整代码如下:

theta = -10*pi:0.1:10*pi;
x = cos(theta);
y = sin(theta);
z = theta;
h = plot3(x,y,z);

for i=1:200
    z = z*0.98;
    set(h,'XData',x,'YData',y,'ZData',z);
    drawnow;
end

 

 会发现压缩时z轴的坐标也会发生改变,如何将这些坐标固定呢,使用axis函数,将6个点范围写进去,

x轴cos的取值范围是-1到1,y轴sin的取值范围是-1到1,z轴的取值范围是-10*pi到10*pi

axis([-1,1,-1,1,-10*pi,10*pi]);

theta = -10*pi:0.1:10*pi;
x = cos(theta);
y = sin(theta);
z = theta;
h = plot3(x,y,z);
axis([-1,1,-1,1,-10*pi,10*pi]);
for i=1:200
    z = z*0.98;
    set(h,'XData',x,'YData',y,'ZData',z);
    drawnow;
end

 

压缩完后重新伸张开,只需要将z轴除以0.98即可

for i=1:200

    z = z/0.98;

   set(h,'XData',x,'YData',y,'ZData',z);

   drawnow;

end

最后使用一个大循环while将压缩和伸张两部分一直执行下去,达到动画效果

最终代码如下:

theta = -10*pi:0.1:10*pi;
x = cos(theta);
y = sin(theta);
z = theta;
h = plot3(x,y,z);
axis([-1,1,-1,1,-10*pi,10*pi]);
while true
    for i=1:200
        z = z*0.98;
        set(h,'XData',x,'YData',y,'ZData',z);
        drawnow;
    end

    for i=1:200
        z = z/0.98;
        set(h,'XData',x,'YData',y,'ZData',z);
        drawnow;
    end
end

 

  • 时钟效果动画 

要实现时钟效果动画,首先画时钟圆框,也就是画一个圆形图

 t的取值取0到2*pi,计算出x,y的值

t = 0:pi/50:2*pi;

x = cos(t);

y = sin(t);

plot(x,y);

t = 0:pi/50:2*pi;
x = cos(t);
y = sin(t);
plot(x,y);

上图的圆有点偏,那如何让它看起来比较圆呢,使用axis equal命令来实现

t = 0:pi/50:2*pi;
x = cos(t);
y = sin(t);
plot(x,y);
axis equal;

 

写指针,要从圆心开始画,画到圆边结束,定位两个点,圆心坐标是0,0,假定画到0,1这个位置,如何实现呢

先定义两个坐标点

LineX = [0,0];

LineX = [0,1];

plot(LineX ,LineY);

t = 0:pi/50:2*pi;
x = cos(t);
y = sin(t);
plot(x,y);
hold on;
axis equal;

LineX = [0,0];
LineY = [0,1];
plot(LineX,LineY);

 

要让指针动起来,每次都要改变一个角度,假定每次改变0.1,然后重新计算LineX第2个值和LineY第2个值

theta = 1;

theta = theta-0.01;

LineX(2) = cos(theta);

LineY(2)=sin(theta);

然后用set函数将新值设置回去,调用drawnow命令重绘,为了让动画持续下去,使用while循环让其一起运行

完整代码如下:

t = 0:pi/50:2*pi;
x = cos(t);
y = sin(t);
plot(x,y);
hold on;
axis equal;

LineX = [0,0];
LineY = [0,1];
h = plot(LineX,LineY);

theta = 1;
while true
    theta = theta-0.1;
    LineX(2) = cos(theta);
    LineY(2) = sin(theta);
    set(h,'XData',LineX,'YData',LineY);
    drawnow;
end