实验三 动画技术:电偶极子辐射的动态仿真
一、实验目的
物理过程或物理现象通常都是动态过程,因此对于物理过程的仿真或模拟应该也是动态。通过对物理过程的动态仿真能够近似地还原物理过程,帮助我们更好的理解物理现象和物理过程,揭示蕴藏其中的规律性东西。本次实验将以电偶极子天线的电磁波辐射动态仿真为例,介绍MATLAB的动画技术,以期实现如下目的:
1. 掌握两种MATLAB的动画制作的技术:影片动画和实时动画;
2. 掌握矢量场力线图的制作方法,并了解电偶极子辐射的规律,以便更好的理解《电磁场与电磁波》课程中的相关知识点,也为进一步学习其他专业课程(如天线原理、天线技术)建立基础。
二、实验预备知识
1. MATLAB动画技术
MATLAB提供了两种制作动画的方法:影片动画和实时动画。
(1) 影片动画
这种动画技术类似于电影的制作,其原理是首先对仿真的过程按时间次序进行“拍照”,获得一帧一帧的画面(称为帧),并将之存档,然后再按时间顺序以高于视觉暂留的帧频率播放帧,即可获得类似于电影的动画效果。这种动画技术适用于难以实时快速绘制的复杂画面,计算量大,占用内存较多。MATLAB提供了下列几种函数用于实现影片动画:
① moviein函数 该函数将产生一个结构体数组(structure,以下称帧结构体)来存放动画的帧(即所拍摄的一幅幅画面),每帧画面作为结构体的一个元素保存。调用格式
fmat = moviein (N)
产生一个能存放N个帧的(1×N)结构体数组fmat。该结构体包含两个域cdata和colormap,前者存放帧的图像数据,后者存放帧使用的颜表。
② getframe函数 该函数作用是对当前的图像进行快照(“抓拍”),通常有两种使用格式:
getframe “抓拍”当前坐标轴(一种图形对象)里的内容;
getframe(h) “抓拍”某个图形窗口或坐标轴里的内容,该图形窗口或坐标轴以句柄h标识(图形窗口和坐标轴都是一种图形对象,每一种图形对象都有自己特有的句柄handle,即标识,类似于“身份证”)。例如
>> fmat(1) = getframe (gcf)
抓拍当前图形窗口下的内容,并将该帧画面存放于帧结构体fmat的第一个元素中;gcf为Get handle to current figure的缩写,意思是获取当前图形窗口的句柄。在命令窗口中输入gcf可显示当前图形窗口的句柄值,是个整数。再如
>> fmat(1) = getframe (gca)
抓拍当前坐标轴内的内容,并将该帧画面存放于帧结构体fmat的第一个元素中;gca的意思是获取当前坐标轴(axis)的句柄(是双精度数)。
注意,两种格式所“拍摄”的画面一般是不一样的。
③matlab等高线间隔 movie函数 作用是按顺序回放帧结构体fmat中的各帧画面。通用格式:
movie (h, famt, n, fps, loc)
h 是播放动画的图形窗口或坐标轴的句柄,缺省时表示在当前的坐标轴中播放动画;
famt 是帧结构体,不可省去; n 是重复播放的次数,缺省时,只播放一次;
fps 代表每秒播放的帧数(帧频),应快于视觉暂留,缺省时系统默认fps=12。
loc 指定动画播放在图形窗口或坐标轴内的具体位置,为4元素的行向量[x,y,0,0],头两个元素指定动画播放的相对位置(相对于由h标识的图形窗口或坐标轴的左下角来计算)。
在动画播放前,movie函数首先将每帧图像的数据载入内存(此时图像会一帧一帧的显示出来),然后再按照用户设定的参数(重复次数n、帧频fps等)播放动画。
除了movie函数,MATLAB还提供了一个函数movie2avi,该函数能够在当前的工作目录下创建一个avi视频格式的动画文件。一般的调用格式:
movie2avi (fmat, filename)
famt 为前述的帧结构体,filename是字符串,指定avi格式的文件名。
例1:模拟地球自转
[XE,YE,ZE] = sphere(200); % 产生单位球数据
surf(XE,YE,ZE); % 绘球体
shading interp; % 插值方式着,并去掉格线
axis image vis3d; % 带参数vis3d 能避免旋转球体时,图形忽大忽小
axis off;
hold on
h=plot3([0 0],[0 0],[1.3 -1.3],'Linewidth',2,'Color','k'); % 地轴
rotate(h,[0 0],10); % 围绕x轴将地轴转动10度,h是图形对象plot3的句柄
delta_fi=12; % 每次旋转球体的角度,单位: 度
N=360/delta_fi; % 转动次数,也即拍摄次数
m=moviein(N); % 创建N个元素的帧结构体
for i=1:N
view(-37.5+delta_fi*(i-1),30); % 通过改变视角,获得转动效果;
% 其中仰角保持默认的30度不变,方位角每次增加delta_fi
m(i)=getframe(gcf); % 在当前图形窗口下抓拍帧
end
movie(gcf,m,10,15,[0 0 0 0]);
image(m(2).cdata); % 展示某一帧(第2帧)图像
程序中为了获得地球自转的效果,使用了view函数,其作用是指定3D图的观察角度,调用格式:view (az, el),参数az代表观察的方位角(Azimuth),默认值az =-37.5o; el 代表观察的仰角(Elevation),默认值el=30o;MATLAB中对方位角和仰角的定义及正方向规定如图示。在上例中,若保持仰角不变,不断改变观察者的方位角az,则可获得球体转动的效果。
(2) 实时动画
实时动画的原理是保持图形窗口中绝大部分的像素颜不变,而只更新部分像素的颜构成运动图像。这种动画适用于每次变化少、图形精确度要求不高的场合。
如何显示新对象、擦除旧对象而又不破坏背景图案,在一般的编程语言中不太容易实现,而
MATLAB图形系统提供的擦除属性EraseMode可以使上述过程较容易实现。MATLAB的绘图命令都可以带擦出属性EraseMode,其格式为:
Command (…, ’EraseMode’,’属性值’)
command 代表相应的绘图命令,比如plot、mesh等,EraseMode属性的可选值如下表:
可选值 | 含义 |
normal (默认值) | 计算整个画面的数据,重画整个图形。这种模式生成的图形最精确、但速度最慢 |
background | 将旧对象的颜变为背景颜,实现擦除。这种模式将损坏被擦对象下面的对象,但新对象总能正确着。 |
none | 对旧对象不做任何擦除,只更新新对象。 |
xor | 异或方式:对象的绘制和擦除由该对象颜与屏幕颜的异或运算结果而定,即只画与屏幕不一致的新对象点,只擦除与屏幕不一致的旧对象点。该方式不损害被擦对象下面的其他对象。 |
当新对象的属性设置后,应使用命令drawnow立即刷新屏幕,使新对象立即显示出来。drawnow命令迫使MATLAB暂停目前的任务序列而去刷新屏幕;若没有drawnow命令,MATLAB要等任务序列执行完后才会去刷新屏幕。
例2:在实验二的基础上,进一步动态模拟卫星的轨道运动。
G=6.672e-11;
Me=5.97e24; % G 有引力常数,Me 地球质量
Vx0=0;Vy0=4000;x0=-4.2e7;y0=0; %设置初始条件
t0=0; tf=60*60*24*9;
tspan=t0:1600:tf; % tspan为等间隔的时间向量,则ode45输出对应时间的解
y0=[x0 y0 Vx0 Vy0]'; % 初始向量
options=odeset('Events','on');
[t Y Te Ye Ie]=ode45('odefile',tspan,y0,options,G,Me,y0);
% 下面在 3D 坐标上画地球
[XE,YE,ZE] = sphere(30); % 产生单位球数据
RE=0.64e7*2; % 将地球半径放大一倍
XE=RE*XE;YE=RE*YE;ZE=RE*ZE;
surf(XE,YE,ZE);
shading interp;
colormap('hot');
hold on;
% 下面画轨道
plot(Y(:,1),Y(:,2),'b','Linewidth',2);
axis image off;
title('地球卫星轨道运行动态模拟’,’color’,’r,’ ,'FontSize',15,... 'FontName','隶书');
% 标记远地点和近地点
plot(Ye(2,1),Ye(2,2),'rv','Linewidth',2,'MarkerSize',8)
text(1.05*Ye(2,1),Ye(2,2),'远地点','FontWeight','Bold');
plot(Ye(3,1),Ye(3,2),'r^','Linewidth',2,'MarkerSize',8)
text(Ye(3,1)-3.0e7,Ye(3,2)-2e7,'近地点','FontWeight','Bold');
% 下面画卫星
[XWE,YWE,ZWE] = sphere(10); % 产生单位球数据
RE=0.64e7;
XWE=RE*XWE;YWE=RE*YWE;ZWE=RE*ZWE;
h=surf(XWE+Y(1,1),YWE+Y(1,2),ZWE,'EraseMode','normal');
% 擦除模式为normal,绘图命令surf返回句柄h
shading interp;
% 下面实现卫星动态运动
m=size(Y,1); % 计算解矩阵Y的行数
for k=1:4 % 重复动画k次
for i=2:m
set(h,'xdata',XWE+Y(i,1),'ydata',YWE+Y(i,2));
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论