8

我目前正在尝试创建一个视频游戏,其中角色是 AI,并且位于带有资源的圆形地图中。

我目前正在尝试计算此地图上 2 点之间的最短距离,但我的问题是地图是圆形的:例如

如果我的地图是 20*20 并且我在 (0,0) 中,则 (19,0) 点的距离仅为 1。我一直在网上寻找,但我没有找到我的问题的答案。我也必须注意我的角色的方向(南北西东),因为他必须转身去点,距离必须更长。

有现成的公式吗?

谢谢阅读 !

4

2 回答 2

5

对于每个坐标选择最小距离,然后像往常一样使用它。

int dx = min(abs(x0-x1),20-abs(x0-x1));
int dy = min(abs(y0-y1),20-abs(y0-y1));

对于欧几里得距离:

double dist = sqrt(dx * dx + dy * dy);

对于曼哈顿距离:

int dist = dx + dy;
于 2012-07-08T09:47:05.577 回答
3

该问题仍然是图中的最短路径问题,您只需为圆形地图添加边:

G = (V,E)在哪里V = {all squares}E = { (u,v) | [(u.x + 1 % 20 = v.x or u.x -1 % 20 = v.x) and u.y == v.y] or ... [same for y] }

上面的数学符号表示:当(且仅当)两个正方形之间存在一条边时,它们的 x 或 y 坐标之间的差异在 Z 20(模数 20 环)中为 1 或 -1。由于环 Z 20本身是圆形的 - 它解决了地图的圆形问题。

鉴于此图,您可以使用BFS从单个源中找到最短路径(不需要 dijkstra 算法,因为该图未加权)

注意:如果没有障碍物,只需使用常规距离函数进行计算,但在数学中使用 Z 20环而不是 Z 字段。

于 2012-07-08T09:46:11.667 回答