要想让图动起来,就需要一个容易操控的静态图,之后,改变其中的参数,使之伴随时间变化,就可以达到动画的效果,比如这样:
[ps,ts]=meshgrid(linspace(0,2*pi,100),linspace(0,pi,100));
xs=cos(ts);
ys=sin(ts).*cos(ps);
zs=sin(ts).*sin(ps);
l=xs.^2 ys.^2-zs.^2;
surf(xs,ys,zs,l);
axis equal
shading interp;
我们就画出了一个球体:
这里面用到了MATLAB四维作图,当然,第四维度没法直接画出来,MATLAB就用颜色来表示了,这也正好为我们观察乒乓球的旋转提供了方便。剩下的事情,便是做运算,而后控制动画的绘制,运算的方程在这里就不陈述了,大家可以翻前文来看哈!有一些难度的是动画的绘制。比如,我们想让这个球体转起来,怎么实现呢?我们能够直接想到的是用rotate命令。但是,这个命令有一个致命的缺点,就是要先画出原图形,再进行旋转。当使用循环画图的时候,图形窗口没有时间来相应rotate命令,就会出现图形颤动或者“看上去不旋转”的问题。
陷入麻烦之中……
但是,车到山前必有路。其实,我们完全可以不用MATLAB里面内置的指令,而是自己去写一个函数,让这个函数先将坐标“旋转”好,再用surf指令绘图。
就这么干!
MATLAB绘制乒乓球动态图
大家一定学过线性代数,知道若将一个点绕着某个轴旋转,可以由一个线性变换矩阵来实现,比如令其绕着
轴旋转,就是这样:
那么,令其绕着一条直线旋转呢?我们假设这条直线平行于轴,那么,决定这个直线的参数只有两个,便是这条直线的
坐标和
坐标。此时,旋转后的点就可以这样表示:
大家应该会发现,
,这也能看出直线的纵坐标对旋转没有影响,我们也就不需要传入直线的纵坐标参数了。考虑到要计算的数据是矩阵形式,我们把上面的矩阵等式写成三个数量等式,并使其返回值为旋转后的坐标。根据这个原理,我们就能做出乒乓球绕其瞬时轴旋转的动画啦!就像这样:[ps,ts]=meshgrid(linspace(0,2*pi,100),linspace(0,pi,100));
xs=cos(ts);
ys=sin(ts).*cos(ps);
zs=sin(ts).*sin(ps);
for t=1:1:180
[xl,yl,zl]=rotter(0,0,xs,ys,zs,t*3*pi/180);
l=xs.^2 ys.^2-zs.^2;
surf(xl,yl,zl,l);
axis equal;
shading interp;
pause(0.1)
drawnow;
end
function [xs,ys,zs]=rotter(xc,zc,x,y,z,th)
xs=xc cos(th)*(x-xc) sin(th)*(z-zc);
ys=y;
zs=zc-sin(th)*(x-xc) cos(th)*(z-zc);
end
↓~效果还不错~↓
就差把计算加入进去啦!只需要经历一段严谨的逻辑性的书写过程,程序就会大功告成!我们来看看最后的结果!
~回滚~
~继续向前滚动~
~停止滚动~
大功告成!效果还是很好的~
最后是彩蛋时间!这里有涂展春老师的比赛现场视频哟!还不来看?
↓ ↓ ↓ ↓ ↓