2010-08-09 46 views
0

我正在寻找一种有效的方法来检查对象是否会切角从点A到点B或防止对象从点A移动如果在两者之间存在对角线不可行的位置,则指向B点。确定点A是否需要切角才能到达点B

什么是已知的:

  • 每个点是宽度和高度1
  • 每点都有8个相邻点的列表的平方
  • 的点可以是适于步行或nonwalkable

这里有一些例子(a是来源,b是desination和X是一个不可行的点):

aX 
b 

在上述情况下,a不能走路是因为在相邻的两者点a和点b一个不可行走点...因此,对于该电流的情况下,变得ba(即,a不可行走必须在继续b

下面是一个类似的情况之前向下移动,在这个意义上a不能走路到b

aX 
Xb 

我现在这样做的方式是获取点A和点B的正交相邻点集合并使这两个集合相交。如果相交结果中没有元素,则点A可以走到点B

...它的工作原理。

但是,有没有一个,也许更实用的数学和有效的方法?

+0

那么它是什么样子一样,如果它是适合步行?你可能想要展示如何从A - > B得到。 – 2010-08-09 11:17:53

+0

这是无关紧要的。我只想知道是否可以从A移动到B. – 2010-08-09 11:26:00

回答

1

我假设你只在情况感兴趣,其中b一个“一个邻居的关系,然后只对角相邻。这将是

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语句。

+0

小修正:... || (b.x,a.y) – 2010-08-09 18:11:18

+0

Doh!我是付费会员,是全国诵读困难协会的DNA。我会解决它。 – deinst 2010-08-09 18:17:30

1

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

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

代替

if ((abs(a.x - b.x) == 1) && (abs(a.y - b.y) == 1)) { 
相关问题