实验三  动画技术:电偶极子辐射的动态仿真
一、实验目的
    物理过程或物理现象通常都是动态过程,因此对于物理过程的仿真或模拟应该也是动态。通过对物理过程的动态仿真能够近似地还原物理过程,帮助我们更好的理解物理现象和物理过程,揭示蕴藏其中的规律性东西。本次实验将以电偶极子天线的电磁波辐射动态仿真为例,介绍MATLAB的动画技术,以期实现如下目的:
1. 掌握两种MATLAB的动画制作的技术:影片动画和实时动画;
2. 掌握矢量场力线图的制作方法,并了解电偶极子辐射的规律,以便更好的理解《电磁场与电磁波》课程中的相关知识点,也为进一步学习其他专业课程(如天线原理、天线技术)建立基础。
二、实验预备知识
1.  MATLAB动画技术
MATLAB提供了两种制作动画的方法:影片动画和实时动画。
(1) 影片动画
这种动画技术类似于电影的制作,其原理是首先对仿真的过程按时间次序进行“拍照”,获得一帧一帧的画面(称为帧),并将之存档,然后再按时间顺序以高于视觉暂留的帧频率播放帧,即可获得类似于电影的动画效果。这种动画技术适用于难以实时快速绘制的复杂画面,计算量大,占用内存较多。MATLAB提供了下列几种函数用于实现影片动画:
moviein函数    该函数将产生一个结构体数组(structure,以下称帧结构体)来存放动画的帧(即所拍摄的一幅幅画面),每帧画面作为结构体的一个元素保存。调用格式
      fmat = moviein (N)
产生一个能存放N个帧的(1×N)结构体数组fmat。该结构体包含两个域cdatacolormap,前者存放帧的图像数据,后者存放帧使用的颜表。
getframe函数    该函数作用是对当前的图像进行快照(“抓拍”),通常有两种使用格式:
  getframe    “抓拍”当前坐标轴(一种图形对象)里的内容;
  getframe(h)  “抓拍”某个图形窗口或坐标轴里的内容,该图形窗口或坐标轴以句柄h标识(图形窗口和坐标轴都是一种图形对象,每一种图形对象都有自己特有的句柄handle,即标识,类似于“身份证”)。例如
>> fmat(1) = getframe (gcf) 
抓拍当前图形窗口下的内容,并将该帧画面存放于帧结构体fmat的第一个元素中;gcfGet handle to current figure的缩写,意思是获取当前图形窗口的句柄。在命令窗口中输入gcf可显示当前图形窗口的句柄值,是个整数。再如
>> fmat(1) = getframe (gca)
抓拍当前坐标轴内的内容,并将该帧画面存放于帧结构体fmat的第一个元素中;gca的意思是获取当前坐标轴(axis)的句柄(是双精度数)
注意,两种格式所“拍摄”的画面一般是不一样的。
matlab等高线间隔 movie函数    作用是按顺序回放帧结构体fmat中的各帧画面。通用格式
movie (h, famt, n, fps, loc)
是播放动画的图形窗口或坐标轴的句柄,缺省时表示在当前的坐标轴中播放动画;
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=30oMATLAB中对方位角和仰角的定义及正方向规定如图示。在上例中,若保持仰角不变,不断改变观察者的方位角az,则可获得球体转动的效果。
(2) 实时动画
实时动画的原理是保持图形窗口中绝大部分的像素颜不变,而只更新部分像素的颜构成运动图像。这种动画适用于每次变化少、图形精确度要求不高的场合。
如何显示新对象、擦除旧对象而又不破坏背景图案,在一般的编程语言中不太容易实现,而
MATLAB图形系统提供的擦除属性EraseMode可以使上述过程较容易实现。MATLAB的绘图命令都可以带擦出属性EraseMode,其格式为:
Command (…, ’EraseMode’,’属性值’)
command 代表相应的绘图命令,比如plotmesh等,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小时内删除。