3.5 其他辅助操作类
除了上述的三个比较重要的操作类外,完成整个系统操作,需要辅助功能操作类。
3.5.1多媒体操作类CSoundPlay
设计此类的目的是出于对使用者使用软件的体验出发的。在传统的软件使用过程中,除了多媒体播放器外,其他大部分软件总是“鸦雀无声”,而使用者疲倦的使用着各种软件,却都是千篇一律。音乐却可是使人放松,给人灵感,同时能使人心情舒畅,听听音乐可以唤醒人的潜意识,能更好的工作学习。因此,考虑到用户的良好的使用体验要求,设计了该类实现多媒体文件的播放功能。
在此类中,实现了最基本的多媒体文件wav、mp3等常见的多媒体文件播放功能。该部分的实现主要由CSoundPlay类操作完成。
CSoundPlay类的成员方法如下:
表 3-7 CSoundPlay类的成员方法
名称 |
参数 |
返回值 |
说明 |
CSoundPlay |
|
|
构造函数 |
PlaySound |
string |
|
播放声音 |
3.5.2图像导出类CMapExport
综合前面的叙述,在选择使用MapObjects进行系统开发时,考虑到了其支持的文件对象的相对MapInfo多,而且,为了保存用户操作后的图像文件,必须对地图上的图形数据进行保存处理。该部分的工作是由CMapExport类来完成的。
表格 2 CMapExport类的成员方法
名称 |
参数 |
返回值 |
说明 |
CMapExport |
|
|
构造函数 |
Init |
|
|
变量初始化 |
Export |
mapType |
|
图像导出 |
3.6 核心算法与相应关键技术详述
3.6.1一点到所有点的最短路径
这里采用图论里最经典的Dijkstra[8]算法,只是每一段路经的长度都用正向阻力值和逆向阻力值计算。最短路径和最佳路径在算法上区分不大。只是阻力值确定的方式,但是需要特别注意的是,正向阻力值和逆向阻力值需要分别考虑。Dijkstra算法的基本思想如下:
(1) 问题描述:设图G=(V,E),v0∈V,求从点V0出发到其他点的最短路径。
(2) 算法描述:设图G 中有n个点,设置一个集合U,存放已经求出的最短路径的点。V-U是尚未确定最短路径的点集合,每个点对应一个距离值。集合U中点的距离值是从点V0到该点的最短路径长度,集合V-U中的点的距离值是从点V0到该点的只包含以集合U中点为中间点的最短路径长度。初始时,集合U中只有V0,点V0对应的距离值为0,集合V-U中点Vi的距离值为边(v0,vi)的权值(i=1,2,…,n-1),如果v0和vi无直接相连的边,则vi的距离值为∞,在集合V-U 中选择距离最小的点vmin加入集合U,然后对集合V-U中的各点的距离值进行修正。如果加入点vmin为中间点后,使v0到vi的距离值比原来的距离值更小,则修改vi的距离值。如此反复操作,直到从v0出发可以到达的所有点都在集合U中为止。
(3) 算法实现:设置一个CMapControl类的数组p[n],存放点v0到其他各个点的最短路径及最短路径长度。设D(i,j)为点vi到点vj的距离。
(a) 初始时,集合U中只有点V0,从点V0到其他点Vi(i=1,2,…,n-1)的最短路径长度为边(v0,vi)的长度。如果点v0和vi不是直接相连,则假设存在一条从v0到vi长度为无穷(小于0)的边。
(b) 在集合V-U 中找出距离值最小的点vmin,将其加入到集合U,从点vo到vmin的最短路径长度就是vmin的距离值,
(c) 调整集合V-U中点的距离之。如果将新加入的点vmin作为中间点后,vo到vi(vi∈V-U)的距离值更小,则应修改vi的距离值。即:如果p[i].dLength〉p[min].dLength+D(min,i),则将点vi的距离值改为p[min].dLeng+D(min),并将路径上vi的前趋点改为vmin,即:p[i].nPreNode=min
(d) 重复(b)、(c)操作,直到集合V-U中的点都加入集合U中为止。
(4) 图形描述:
表格 3 Dijkstra 举例数据[6]
管段 |
权值 |
0-1 |
0.41 |
1-2 |
0.51 |
2-3 |
0.50 |
4-3 |
0.36 |
3-5 |
0.38 |
3-0 |
0.45 |
0-5 |
0.29 |
5-4 |
0.21 |
1-4 |
0.32 |
4-2 |
0.32 |
5-1 |
0.29 |
|
|
||
|
|
||
|