森汉姆算法(AS3)-检测两点之间所经过的节点
生活随笔
收集整理的這篇文章主要介紹了
森汉姆算法(AS3)-检测两点之间所经过的节点
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
為了把A*尋到的路徑中一些沒必要的節點去掉,可以用到森漢姆算法,如果兩點之間經過的節點都是可走的,那就把這兩個點連起來,最終拿到的路徑就是比較平滑的了。
下面是算法實現:
?
?| public static function bresenham(x1:int, y1:int, x2:int, y2:int):Array { ????var touched:Array = []; ????var steep:Boolean = Math.abs(y2 - y1) > Math.abs(x2 - x1); ????if (steep) ????{ ????????var tmp:int; ????????tmp = x1; ????????x1 = y1; ????????y1 = tmp; ????????tmp = x2; ????????x2 = y2; ????????y2 = tmp; ????} ????if (x1 > x2) ????{ ????????var x1_old:int = x1; ????????var y1_old:int = y1; ????????x1 = x2; ????????x2 = x1_old; ????????y1 = y2; ????????y2 = y1_old; ????} ????var deltax:int = x2 - x1; ????var deltay:int = Math.abs(y2 - y1); ????var error:int = deltax / 2; ????var ystep:int; ????var y:int = y1; ????if (y1 < y2) ????{ ????????ystep = 1; ????} ????else ????{ ????????ystep = -1; ????} ????for (var x:int = x1; x <= x2; ++x) ????{ ????????if (steep) ????????{ ????????????touched.push(new Point(y, x)); ????????} ????????else ????????{ ????????????touched.push(new Point(x, y)); ????????} ????????error = error - deltay; ????????if (error < 0) ????????{ ????????????y = y + ystep; ????????????error = error + deltax; ????????} ????} ????? ????return touched; } |
?
一些資料:http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm
轉載于:https://www.cnblogs.com/bluesea-flash/p/3319366.html
總結
以上是生活随笔為你收集整理的森汉姆算法(AS3)-检测两点之间所经过的节点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是商业模式?产品模式、用户模式、推广
- 下一篇: 解决布局拖动混乱的问题