据我了解,您的挑战不是离散坐标,而是离散标题。我必须在允许在八个方向(即水平、垂直和对角线)移动的网格世界中做同样的事情。 你的离散空间应该与问题域相匹配。供您参考:
-
4 方向:使用可跨边移动的方形网格
-
8 方向 使用方形网格,并在边缘 和 顶点之间移动
-
6 个方向使用六边形网格,可跨边移动
-
12 方向使用六边形网格,可跨边和点移动
- ... 等等。
为了真正获得离散化的标题,我声明了一个名为 Direction 的 enum:
public enum Direction {
North,
NorthEast,
East,
SouthEast,
South,
SouthWest,
West,
NorthWest;
//additional code below...
}
您可以通过首先计算当前位置和目标位置之间的 XY 偏移量来查找正确的航向:
int dx = currentPosition.x - goalPosition.x;
int dy = currentPosition.y - goalPosition.y;
这些被传递给getInstance(int,int) 方法(如下)以获得正确的Direction:
public static Direction getInstance(int dx, int dy) {
int count = Direction.values().length;
double rad = Math.atan2(dy, dx); // In radians
double degree = rad * (180 / Math.PI) + 450;
return getInstance(((int) Math.round(((degree % 360) / (360 / count)))) % count);
}
public static Direction getInstance(int i) {
return Direction.values()[i % Direction.count];
}
实际上,这些方法以度为单位计算航向并四舍五入到最接近的Direction。然后,您可以实现一个方法来移动/转动 Direction 标题中的代理,例如agent.turnToward(Direction d) 或 agent.move(Direction d)。
其他资源: