RCP gef智慧型尋路演算法(A star)

2021-09-06 16:09:23 字數 3059 閱讀 8528

本路由繼承自abstactrouter,引數只有editpart(編輯器內容控制器),gridlength(尋路用單元格大小),style(floyd,floyd_flat,four_dir)。

字符集編碼為gbk,本文只做簡單的**解析,原始碼戳我

如果原始碼不全,可以聯絡本人。

演算法實現主要有三:

1、astar單向尋路

2、地圖預讀

3、弗洛伊德平滑演算法

astar尋路的實現:

anode minfnode = null

;

while (true

) private

void search(anode node, listopenlist,

list

closedlist, anode startnode, anode endnode)

else

if(openlist.contains(nodes[i])) }}

}

在網上大部分版本的astar演算法裡,障礙只有兩個參考值,即是可通過和不可通過

但在實際情況裡,有可能會有較難度過的小溪,難以度過的河流,不能跨越的深澗,於是我在演算法裡引入了難易度概念,由anodelevel體現。

package

galaxy.ide.configurable.editor.gef.router;

/*** 節點等級,re直角邊,be斜角邊

* *

@author

caiyu

* @date 2014-5-15 */

public

enum

anodelevel

}

引入了四個難易程度,當然,這些難易程度自己可以調整。

障礙的難易程度是預讀的,體現在**:

private

void

prereadingnodes(point startpoint) }}

預讀器prereader原始碼如下:

public

void read(rectangle r, point startpoint, final

intd)

map.put(y, level);}}

}public anode getnode(int x, int

y)

public

static

int calculateindex(int v1, int v2, int

distance)

完成了以上,即可以實現智慧型繪圖,應用該路由 new astarconnectionrouter2(editpart, 20, astarconnectionrouter.none);(不會在gef中應用路由器的去看《gef whole update》這本書)

如圖所示:

可以看出,這個演算法還有缺陷,並不平滑。我們加入弗洛伊德平滑演算法new astarconnectionrouter2(editpart, 20, astarconnectionrouter.floyd);

,效果如圖:

弗洛伊德平滑演算法的原理:

1、如果a、b、c三點在同一直線上,視為三點共線,則去除b點

2、清理所有共線點之後,遍歷任一點和其他點之間有無障礙物,如果沒有,則去除兩點之間的全部點。

演算法實現:

/**

* 弗洛伊德平滑處理

* *

@param

d *

@param

startpoint

* *

@param

points

*/public

void floyd(anode node, point startpoint, int

d)

else

currentnode =fathernode;

}currentnode =node;

if ((this.style & floyd) !=floyd)

return

;

//去除拐點

while (true

) fathernode =grandnode;

}currentnode =currentnode.getparent();

if (currentnode == null

)

break

; }

}

1、自己重寫connectionfigure,使拐點圓滑

2、astar演算法只參考上下左右四個方向

只參考四個方向的使用例子new astarconnectionrouter2(editpart, 20, 

astarconnectionrouter.floyd

| astarconnectionrouter.four_dir);

如圖所示:

以上,即實現了全部效果。

注意,在routerstyle裡有個test選項,該選項是測試使用,使用過程中會有大量bug。

new astarconnectionrouter2(editpart, 20,

astarconnectionrouter.four_dir

| astarconnectionrouter.floyd_simplify

| astarconnectionrouter.test);

該測試用於展示在尋路過程中astar演算法遍歷到的節點,如圖所示:

迷宮尋路(A星尋路演算法)

題目 假設我們有乙個7 5大小的迷宮,如下圖所示,綠色格仔表示起點,紅色的格仔表示終點,中間的3個深灰色格仔表示障礙物。請找到一條從起點到終點最短的路徑。解題思路 需要引入兩個集合和乙個公式,如下 具體步驟 把起點放入openlist 檢查openlist中是否有值,如果沒有則無法到達終點,結束尋路...

A 尋路演算法

問題 由於遊戲中尋路出了個小問題 玩家尋路到乙個死角後在那邊不停的來回跑,就是無法越過障礙物,就研究了下a 尋路演算法以解決這個問題 研究了幾天,自己寫了個demo這裡給出總結 原理 a 演算法給出的是權值最優的路徑而不是最短路徑 權值有f g h來表示 啟發式函式如下 f p g p h p h值...

A 尋路演算法

a 演算法是靜態環境下求最短路徑的不二之選,由於是啟發式搜尋,比dijkstra 深搜廣搜要快的多啦。a 也算是我第一次接觸的移動機械人演算法,csdn上的科普文章也不少,但我作為乙個機械的小白,實現出來還是小有成就感滴。今天抽空和大家分享一下原始碼,開發環境win7 64 opengl vs201...