我正在寻找一种有效的方法来检查物体是否会切割角点以从A点到达B点,或者如果在它们之间存在对角线不可行走的位置,则阻止物体从A点移动到B点。 / p>
众所周知:
以下是一些示例(a
是来源,b
是desination,X
是不可行的点:
aX
b
在上述情况下,a
无法行走,因为点a
和点b
附近有一个不可行的点...因此,对于当前这种情况,{ {1}}从b
开始无法行走(即,a
必须向下移动才能继续a
)
以下是一个类似的案例,因为b
无法走到a
:
b
我现在这样做的方法是获得点aX
Xb
和点A
的正交相邻点的集合并与这两组相交。如果相交结果中没有元素,则点B
可以走到A
点。
......它有效。
但是,是否有更多数学和有效的方法来实现这一目标?
答案 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)) {