偶然间发现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,使其随时间变化即可!
今天学完之后真开心!