1. 程式人生 > >光滑尋路演算法在繪圖中的應用

光滑尋路演算法在繪圖中的應用

最近一專案組需要將一批任務以關係圖的形式進行展現。由於任務是動態的,關係圖需要在伺服器後臺動態繪製。需要我協助繪圖工具的選型和方案設計的工作。

關於繪圖工具,我選擇了JGraphX(mxGraph)的Java開源產品,這個玩意的優點是繪製出來的圖形很漂亮,引數很多。缺點是文件,因為它相當於沒有文件。

經過3天時間的不懈搜尋和test,我終於掌握用JGraph繪製基本圖形的方法。然後通過繼承和封裝,實現了繪製任務節點的介面。接下來就是最為困難的部分,如何在兩個節點之間繪製連線線,使得

1. 連線線不穿過任務節點

2. 連線線走最短路徑

3. 轉折點要儘可能的少

4. 連線線儘可能不重疊

雖然A*尋路演算法在網路上的文章已經很多了,但是關於繪製光滑的路徑問題,在網路上資源還是很少。在某外國人的尋路演算法文章中,提到繪製光滑的連線線,可以通過在轉折點上施加不利因素來實現,或者當最短路徑出來之後,重新遍歷路徑上的每一個點,用相似但更平滑的點來代替。

我選擇通過施加不利因素的方式來控制轉折點。具體演算法如下:

1. 設定每次轉折,需要耗費額外的行動力為CORNER_PLUS;

2. 每次重新設定G值(newG)前,同時估算在當前方向下,到達目標單元格最少還需要轉多少個彎(CORNER_COUNT),並換算成行動力耗費(CORNER_COUNT*CORNER_PLUS)新增到曼哈頓函式值,作為新的H值(newH)。

3. 如果newH+newG < f,儲存G值和H值,同時儲存方向和上級上一個路徑單元格。

但是這個演算法有一個問題。當行走到某個單元格,兩個方向進入的F值相同時,後計算的方向將會被丟棄,結果最後得到的結果可能不是最優的。解決辦法就是先計算出起始節點到目標節點的最短路徑,再計算目標節點到起始節點的最短路徑,取其中較短的那條。