我目前正在尝试创建一个视频游戏,其中角色是人工智能,并且是一个带有资源的圆形地图。
我目前正在尝试计算此地图上2点之间的最短距离,但我的问题是地图是圆形的:例如
如果我的地图是20 * 20并且我在(0,0)中,则(19,0)点的距离仅为1。我一直在网上看,但我没有找到问题的答案。 我必须照顾我的角色的方向(西南东北),他必须转向点,距离必须更长。
是否有现有公式?
感谢阅读!
答案 0 :(得分: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;
答案 1 :(得分:3)
问题仍然是图表中的shortest path problem,您只需要为圆形地图添加边缘:
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 中为1或-1(modolus 20环)。由于环Z 20 本身就是圆形 - 它解决了地图的圆度问题。
根据此图表,您可以使用BFS从单个来源查找最短路径(不需要dijkstra算法,因为图表未加权)
注意:如果没有障碍物,只需使用常规距离函数计算,但在数学中使用Z 20 环而不是Z字段。