除了上述的三個比較重要的操作類外,完成整個系統操作,需要輔助功能操作類。
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.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
5-1