【问题标题】:A* heuristic to create Bresenham linesA* 启发式创建 Bresenham 线
【发布时间】:2011-08-11 08:52:15
【问题描述】:

根据我对 A* 启发式和 Bresenham 算法工作原理的了解,这可能是不可能的,因为只有当前状态和目标状态会传递给启发式函数。但也许有人对这个问题有一个聪明的解决方案。

我正在使用 A* 来规划网格上的路径,并且我想要一个启发式算法,当当前状态和目标或下一个转弯之间有空闲空间时,它会导致最佳路径遵循 Bresenham 的路线一个障碍。

这里有一些图片来说明问题。

曼哈顿距离:

如果世界中的运动表现得像网格上的跳棋,这将是非常好的,但我最终会将 A* 路径转换为连续平面上的运动,所以这确实很好。

欧几里得距离:

更好,但仍不完美。注意最后的直线。对角线可以很容易地保持对角线,这就是我想要的。

我想要什么:

布雷森汉姆线被绘制到下一个转弯或目标。

我在这里找到了一个很好的资源,http://theory.stanford.edu/~amitp/GameProgramming/Heuristics.html,它触及了我正在寻找的东西,但似乎只适用于从开始到目标绘制 Bresenham 线。我想要的是 Bresenham 线也被绘制到下一个绕过障碍物的转弯处。

对于解决这个问题的好方法有什么想法吗?

【问题讨论】:

  • 你有没有为此实现过一些东西?
  • @AShelly 我尝试根据之前访问过的单元格的直线路径对 Hueritic 进行加权,但似乎没有什么能完全符合我的要求。我认为你需要彻底改变 A* 或完全使用不同的算法来解决这个问题。
  • 你是否尝试过使用 Brasenham 行距如何启发式?

标签: algorithm grid line a-star bresenham


【解决方案1】:

您能否即时修改成本函数,使前进的成本随着累积误差的增加而增加?

这个想法是,在算法开始时,像标准 Bresenham 一样计算 DX 和 DY。 (假设其余示例 DX > DY > 0。针对其他方向进行相应修改。)

然后对于每个访问的邻居节点,跟踪 Bresnaham 错误:

if (neighbor.X > this.X) 
   neighbor.err=this.err+DY 
else if (neighbor.Y > this.Y) 
   neighbor.err=this.err-DX

然后修改成本函数以增加 X,但添加 if (err >= DX/2) then cost=cost+FACTOR。在所有其他成本都相等的地图中,这应该追踪正确的线。

您可能需要的另一件事是在路径绕过障碍物时进行特殊处理,否则您可能会得到类似于链接文章中“带障碍物的交叉产品”示例的奇怪的沿墙路径。每当邻居节点不在 +X 或 +Y 方向时,您可以通过重新计算 DX 和 DY 来处理这种情况。 (不幸的是,这可能需要为每个节点跟踪单独的 DX、DY 和错误,这可能开销太大)

免责声明,我已经多年没有实现 A* 或 Bresneham 算法了。这整个想法可能行不通

【讨论】:

  • 这听起来很有趣。你能说得更详细些吗?
【解决方案2】:

您能否将碰撞检测与 Bresenham 算法一起使用,也许是自适应 Bresenham,例如使用空间填充曲线?

【讨论】:

    【解决方案3】:

    让你所有的移动选择都是从你当前位置可见的角落(或者目标,如果它是可见的),一旦你找到最短的路径,在你的所有停靠点之间画出 Bresenham 线。

    【讨论】:

      【解决方案4】:

      正如您链接到的文章的打破关系部分所述,也许您可​​以在启发式中添加一个因素,即该节点与其父节点和目标之间的直线距离有多近。这样一来,它可能会更喜欢保持在直线路径上。

      【讨论】:

        猜你喜欢
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        • 2015-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多