为了把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)-检测两点之间所经过的节点相关推荐

  1. 易懂的Bresenham 布雷森汉姆算法画圆的原理与Python编程实现教程

    Bresenham 布雷森汉姆算法画圆的原理与编程实现教程 注意:Bresenham的圆算法只是中点画圆算法的优化版本.区别在于Bresenham的算法只使用整数算术,而中点画圆法仍需要浮点数.注意: ...

  2. 在yuv上画线_利用布雷森汉姆算法绘制在YUV图像上画直线

    最近,因工作需要,在YUV图像上画直线: 算法1步骤: 1.已知直线的起点和终点: 2. 利用布雷森汉姆算法在两点间画直线: 3. 将该直线上的点的颜色在YUV图像上画出. 布雷森汉姆算法原理参考wi ...

  3. Python布雷森汉姆直线算法RViz可视化ROS激光占位网格映射

    使用对数赔率映射已知姿势算法(ROS 包). 布雷森汉姆直线算法 布雷森汉姆直线算法是一种线绘制算法,它确定应选择的 n 维栅格的点,以便形成两点之间的直线的近似值. 它通常用于在位图图像中(例如在计 ...

  4. 布雷森汉姆直线演算法(Bresenham‘s line algorithm)介绍

    布雷森汉姆直线演算法(Bresenham's line algorithm)是用来描述两点间决定一条直线的算法,本人发现它可以用于确定栅格地图中两点间直线经过的栅格位置,它会算出一条线段在点阵图上最接 ...

  5. 【附源码】布雷森汉姆直线算法(bresenham‘s line algorithm)

    1.布雷森汉姆直线算法简介 我们在纸上画直线时,只需要定一个起点和终点,然后把两点连接起来就是一条直线,你将会得到一条笔直的直线. 但是,这个简单的过程,在计算机上却并不容易.首先计算机的屏幕是一个一 ...

  6. ITK:布雷森汉姆线BresenhamLine

    ITK:布雷森汉姆线BresenhamLine 内容提要 输出结果 C++实现代码 内容提要 在两点之间的布雷森纳姆线上获得点. 输出结果 [0, 0] [1, 1] [2, 2] [3, 3] [0 ...

  7. 用C语言代码实现布雷森汉姆直线插补

    布雷森汉姆直线插补是计算机图形学中常见的直线插补算法.以下是用C语言实现布雷森汉姆直线插补的代码示例: #include <stdio.h> #include <math.h> ...

  8. C语言实现Dijkstra算法(求解两点之间最短路径问题)

    文章目录 含有约束条件下的最短路径问题 程序框图及变量说明 程序框图 算法解释 所用数据 代码实现 运行结果 含有约束条件下的最短路径问题 C语言实现最优路径算法(有限时间约束条件下的算法模型) 程序 ...

  9. 使用Floyd-Warshall算法求出两点之间的最短路径

    求出下面任意两个点之间的最短路径: 如何才能求出两点之间的最短路径呢?大家都知道学几何的时候,有一条定理就是:两点之间线段最短.但是在实际情况中,我往往两点之间没有之间的通路而是一些曲折的线路. 上面 ...

最新文章

  1. 一步步写自己SqlHelper类库(五):Command对象
  2. python多线程处理文件_Python实验:采用多线程在一个文件中查找特定字符串
  3. 8086CPU写汇编的规则
  4. Android MVP模式的初识
  5. 揭露:人体十大最佳北京上门×××黄金时间
  6. python中numpy.transpose()函数详解
  7. [MCSM]随机搜索和EM算法
  8. Pattern 模式器: Matcher 匹配器
  9. Dreamweaver8 V8.0.0.2766
  10. 地图比例尺与空间分辨率之间的关系_分辨率与比例尺
  11. 随笔之---java版本哲学家就餐问题【信号量的实现】
  12. NR 5G: Relaxed measurement
  13. 正则表达式在工作中的应用
  14. Unity 旋转角度计算
  15. 电商运营从哪些方面做数据分析?
  16. eclipse中xtext/xtend的安装及注意事项
  17. 如果黑客转行干活动策划,我再也不怕开会睡着了
  18. 东软睿驰与联合电子达成战略合作,抢占国产化基础软件市场新风口
  19. win10去除广告弹窗的有效方法
  20. 解决插入U盘后有提示音,但无法打开、格式化或恢复的问题

热门文章

  1. Linux中逻辑卷的快照与还原
  2. Spring AOP (事务管理)
  3. pandas之数据结构
  4. java-多线程5-线程组
  5. 浅谈Javascript中的函数重载实现
  6. 【转载】查看MSSQL数据库每个表占用的空间大小的方法
  7. Qt自定义事件实现及子线程向主线程传送事件消息
  8. android实现首页倒计时,android 利用CountDownTimer实现时分秒倒计时效果
  9. python读取上一级文件夹下的图片
  10. mysql 事务 for update_mysql事务,select for update,及数据的一致性处理