本路由繼承自abstactrouter,引數只有editpart(編輯器內容控制器),gridlength(尋路用單元格大小),style(floyd,floyd_flat,four_dir)。
字符集編碼為gbk,本文只做簡單的**解析,原始碼戳我
如果原始碼不全,可以聯絡本人。
演算法實現主要有三:
1、astar單向尋路
2、地圖預讀
3、弗洛伊德平滑演算法
astar尋路的實現:
anode minfnode = null在網上大部分版本的astar演算法裡,障礙只有兩個參考值,即是可通過和不可通過;
while (true
) private
void search(anode node, listopenlist,
list
closedlist, anode startnode, anode endnode)
else
if(openlist.contains(nodes[i])) }}
}
但在實際情況裡,有可能會有較難度過的小溪,難以度過的河流,不能跨越的深澗,於是我在演算法裡引入了難易度概念,由anodelevel體現。
package引入了四個難易程度,當然,這些難易程度自己可以調整。galaxy.ide.configurable.editor.gef.router;
/*** 節點等級,re直角邊,be斜角邊
* *
@author
caiyu
* @date 2014-5-15 */
public
enum
anodelevel
}
障礙的難易程度是預讀的,體現在**:
private預讀器prereader原始碼如下:void
prereadingnodes(point startpoint) }}
public完成了以上,即可以實現智慧型繪圖,應用該路由 new astarconnectionrouter2(editpart, 20, astarconnectionrouter.none);(不會在gef中應用路由器的去看《gef whole update》這本書)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.floyd);
,效果如圖:
弗洛伊德平滑演算法的原理:
1、如果a、b、c三點在同一直線上,視為三點共線,則去除b點
2、清理所有共線點之後,遍歷任一點和其他點之間有無障礙物,如果沒有,則去除兩點之間的全部點。
演算法實現:
/**1、自己重寫connectionfigure,使拐點圓滑* 弗洛伊德平滑處理
* *
@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
; }
}
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...