确定A点是否需要切角以达到B点

时间:2010-08-09 10:56:03

标签: algorithm math

我正在寻找一种有效的方法来检查物体是否会切割角点以从A点到达B点,或者如果在它们之间存在对角线不可行走的位置,则阻止物体从A点移动到B点。 / p>

众所周知:

  • 每个点都是宽度和高度为1的平方
  • 每个点都有一个包含8个相邻点的列表
  • 一个点可以是步行或不可步行的

以下是一些示例(a是来源,b是desination,X是不可行的点:

aX
 b

在上述情况下,a无法行走,因为点a和点b附近有一个不可行的点...因此,对于当前这种情况,{ {1}}从b开始无法行走(即,a必须向下移动才能继续a

以下是一个类似的案例,因为b无法走到a

b

我现在这样做的方法是获得点aX Xb 和点A的正交相邻点的集合并与这两组相交。如果相交结果中没有元素,则点B可以走到A点。

......它有效。

但是,是否有更多数学和有效的方法来实现这一目标?

2 个答案:

答案 0 :(得分:1)

我假设您只对 b a '邻居之一,然后只是对角相邻的情况感兴趣。那将是

if ((abs(a.x - b.x) == 1) && (abs(a.y - b.y) == 1))

现在在这种情况下,我们只需要检查两者相邻的两个点。

if ((abs(a.x - b.x) == 1) && (abs(a.y - b.y) == 1)) {
   if (blocked(a.x, b.y) || blocked(b.x, a.y)) {
      // unwalkable
   } else {
      // walkable
   }
}

您当然可以合并if语句。

答案 1 :(得分:1)

由于上面的答案假定要检查的单元格是邻居,您可以简单地检查它们是否彼此对角,而不是彼此相邻的对角线AND。这样你就可以进行额外的比较。

if (abs(a.x - b.x) == abs(a.y - b.y)) {

而不是

if ((abs(a.x - b.x) == 1) && (abs(a.y - b.y) == 1)) {