森汉姆算法(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

posted on 2013-09-13 15:36  风中雨2013  阅读(243)  评论(0编辑  收藏  举报

导航