基于双缓存技术的雷达图像多图层设计与仿真
2015-10-20张亚臣王根荣
张亚臣+王根荣
摘 要:传统雷达模拟器图像生成多是采用扫描线求交算法,该算法一定程度上会增加计算机CPU的额外运算,浪费系统资源,而且雷达ARPA图像生成速率低,图像质量差,不便于新功能的添加。为提高雷达ARPA图像逼真度和方便功能扩展,以扫描的高效性和代码的易维护性为前提,基于双缓存技术对雷达图像的生成进行了多图层设计,并基于多图层设计提出了更为简单的每帧雷达图像和ARPA符号的生成算法。以不同显示模式下的雷达图像进行了仿真,验证了算法的可行性,相关算法已经成功应用到了雷达模拟器中雷达ARPA图像的仿真。
关键词:雷达图像 双缓存技术 多图层设计 生成算法
1.前言
以前的雷达模拟器图像的生成多是采用扫描线求交算法,即无论是雷达回波还是ARPA符号都随着扫描线的旋转与扫描线求交计算后再绘制出来。这种方法虽有其优点,但也存在明显的不足之处。首先ARPA符号是随着扫描线旋转与扫描线求交后再绘制,这使计算机CPU作了额外的运算,浪费了系统的资源,从而使岸线回波和ARPA符号的生成速率降低。而且扫描线求交算法有时不适合新的功能的添加,如同频干扰图像的生成不容易用很好的数学方法去描述,使求交点变得很难。其次扫描线求交算法生成的ARPA符号,如固定距标圈、电子方位线等,图像质量差,圆周不连续,直线不平直。由于扫描线扫描一周大概3秒钟,所以符号显示的响应慢。为了提高图像的逼真度和方便增加其他的功能,只有采用新的设计模式,鉴于真实雷达上的ARPA符号的显示和岛岸回波并不在一层上,活动距标圈和电子方位线的拖动并不会擦除固定距标圈。本着在保持扫描性能和代码的易维护性基础上尽量采取简单方便的方法和原则,本文应用双缓存技术提出了雷达图像的多图层显示模式,将每帧图像分层绘制。
2.双缓存技术应用
利用计算机进行图形绘制时,对图元进行的任何操作,譬如拉伸、填充、添加或删除等操作都必须通过刷新屏幕才能显示出来。传统的绘图方法都是写好专门用来绘图的函数,然后通过函数的调用将图形显示在屏幕上。之后每次对图元进行的修改等操作都必须刷新屏幕才能显示出来。因此,屏幕的刷新过程是很缓慢的。而且当显示画面由于某种原因需要重新绘制时,还需要将原有图像用背景色进行擦除,之后再通过调用绘图函数进行绘制。基本上绘图过程可分为绘制—擦除—重绘三部分。其中擦除窗口显示区域是必须的,因为若重绘时没有对原有图像进行擦除,那么就会导致原来的图形和新画的图形混叠在一起,使显示区域杂乱无章。如果图形比较复杂,图元数目比较繁多,就会消耗系统大量的内存。绘图时间也会有一定的延长,这样就可能会产生不断地交替显示背景和图形的闪烁画面。雷达图像包含的信息较多,除了雷达回波需要绘制外,所有的ARPA符号都需要绘制,而且随着船舶的运动和显示模式的变换,图像需要实时快速更新,这些都需要重绘显示区域,如果采用传统的绘图模式必定产生闪烁和杂乱无章的画面,无法实现雷达图像的绘制。使用双缓存技术可以有效解决上述问题。
实现双缓存的基本思路是:绘图之前,在内存中开辟一块区域,创建一个和显示区域同样大小的内存空间作为虚拟的画布(内存位图),然后将所有的绘图操作都在这个内存位图上完成。当绘制完一帧完整的图形后,再一次性将此内存位图中的内容复制到屏幕显示窗口上。这一过程只需要刷新一次屏幕,而且由于访问内存的速度远高于实际窗口绘图,所以绘图的效率得到大幅度的提高。再加上擦除动作和整个绘图过程都是在内存位图中以后台的方式完成的,所以前后两帧图像间的擦图操作被隐藏了,闪烁问题得到了解决。
3.雷达图像的多图层设计
为了更好的仿真雷达图像,应用双缓存技术对雷达图像进行层次化设计,将每帧图像分层绘制,将雷达回波、ARPA符号绘制在不同的表面上,之后再逐层绘制在后台内存位图上,再一次性将此画布上的内容复制到前台显示窗口上。主要分为如下层次:基础层、视频层、综合层、回波层、符号层。这种分层模式很好地实现了雷达回波和ARPA符号的分层显示,以及各种功能的模拟。各个层的描述如下:
(1)基础层:用来显示雷达在不同显示模式和运动模式下的方位刻度线和刻度值;
(2)视频层:显示前台,当前屏幕显示窗口中显示的画面,即我们最终看到的雷达图像;
(3)综合层:显示后台,又叫后备缓冲区,被复制到视频层的表面,保存即将显示的下一帧画面,其它层按次序依次粘贴到该层,即它包含了其他层的所有画面信息。增加此层是为了防止连续向视频层复制其他层产生闪烁现象。
(4)回波层:用于画回波,包括岛岸回波、活动目标回波、海杂波等;
(5)符号层:用于画各类ARPA符号,避免与回波冲突(符号表面可以有多个,可待以后根据需要添加)。
图1展示了雷达图像的层次结构,图2展示了雷达图像各层的大小。
4.每帧雷达图像的生成
为了实现雷达图像的实时生成,创建了雷达扫描线程,在启动后点击StandBy后就开启扫描线程,开启后雷达开始扫描,直到线程销毁为止。线程创建如下:
m_ScanThread=AfxBeginThread(DrawScanThread,this);
其中DrawScanThread()为线程控制函数,专用来绘制雷达回波。
此外为了将绘制的雷达回波和ARPA符号实时显示在PPI上,程序中还设置了绘制每帧雷达图像的时钟响应函数。
SetTimer(1,MSECONDS_ PER_BLT,NULL);
由于人眼能识别连续的两帧图像的时间间隔至少为40毫秒,所以定时器应在每小于40毫秒的时间内触发一次。经测试MSECONDS _ PER_BLT的值设置在25-35左右效果最好。此外因为每层内存位图均为方形,所以在PPI内显示的图像还需要进行圆域裁剪,Windows提供了两个常用的API函数CombineRgn和SelectClipRgn,可以用来实现圆域的裁剪。endprint
每帧雷达图像的生成主要包括以下过程:
开启雷达扫面线程,雷达开始扫描,在回波层绘制雷达回波,在符号层绘制ARPA符号,基础层绘制方位刻度和刻度值,暂停扫描线程,触发定时器,将回波层以不透明方式拷贝到综合层,线程暂停结束,继续执行扫描线程,在下一次定时器触发之前,将符号层以透明的方式拷贝到综合层,将基础层和综合层进行裁剪操作,最后将基础层和综合层拷贝到视频层,即拷贝到显示屏相应的显示窗口。
执行完上述过程后,则一帧雷达图像绘制完毕。不断地循环执行上述过程,则雷达图像将连续地绘制并显示在屏幕上。图3展示了每帧雷达图像的生成流程。
5.ARPA符号生成算法
雷达模拟器中ARPA符号主要包括电子方位线、固定距标圈、活动距标圈、跟踪区域(警戒区)、船首线、船尾线、平行方位线、方位刻度线、跟踪目标的矢量线和尾迹以及试操船轨迹和符号等。传统的雷达ARPA符号的绘制多是采用异或运算的方式,在绘制每个ARPA符号时,首先需要用异或操作将当前显示的电子方位线擦除掉,之后再计算ARPA符号每个控制点新的坐标位置,最后根据新的坐标位置重新绘制,这样做虽然速度很快,但是也会产生一个很大的难题,即运动的符号在不同的背景颜色上会呈现出不同的颜色。为解决这一问题,尹勇等提出了分段调色板技术,但该方法不但操作繁琐,而且需要牺牲一部分调色板入口作为代价。本文充分利用了雷达图像的层次化设计模式,可以很好地实现ARPA符号的生成,避免了采用异或运算和分段调色板技术。
根据每帧雷达图像的生成过程,我们可以将所有ARPA符号的绘制控制在一个模块内,每个ARPA符号都有其各自属性和操作行为,当我们对某个ARPA符号执行其中某种操作时,重新设置符号的属性值,并用和符号层同样大小的空白层将符号层覆盖,达到了擦除上一帧ARPA符号的目的,再执行ARPA符号的绘制模块,将ARPA符号绘制在符号层,当定时器触发时符号层被透明地覆盖到综合层,综合层再覆盖到视频层即完成ARPA符号的显示,图4为ARPA符号生成流程。
6.仿真实例与结论
以中国大连港附近沿海为实例,设本船为OS01,初始船位(38°46.4491′N,121°36.2647′E),如图5所示。对北向上真运动显示模式下的雷达ARPA图像的进行了仿真。
通过仿真验证了基于双缓存技术雷达图像的多图层设计可以较好地应用到雷达ARPA图像的生成,基于多图层设计的每帧雷达图像和ARPA符号的生成算法简单,便于添加新的功能,扩展性强,扫描高效且代码易于维护,可以较好地应用于雷达模拟器中。
参考文献:
[1]尹勇,刘秀文,李志华.采用真雷达显示器的航海雷达模拟器的关键技术[J].系统仿真学报,2007[3]:1014-1017.
[2]刘婷婷,潘彤,陈彬茹.利用双缓存技术提高绘图速率[J].电脑编程技巧与维护,2012,18.
[3]张仁忠,常明志,许德新.利用MFC实现双缓存机制改善图形的显示效果[J].应用科技,2005,32(1).
[4]尹勇,金一丞.页面更新方式雷达/ARPA模拟器图像生成的研究[J].大连海事大学学报,1996,22(4):31-36.endprint