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

  • 相关阅读:
    freemarker报错之十一
    freemarker定义一个连续的序列
    freemarker报错之十
    freemarker之数组
    解决linux环境下nohup: redirecting stderr to stdout问题
    如何查看Linux操作系统版本?
    log file sync
    freemarker中的round、floor和ceiling数字的舍入处理
    freemarker中的split字符串分割
    freemarker中的left_pad和right_pad
  • 原文地址:https://www.cnblogs.com/bluesea-flash/p/3319366.html
Copyright © 2020-2023  润新知