首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >二维阵列中两点间的计算

二维阵列中两点间的计算
EN

Stack Overflow用户
提问于 2015-02-23 12:10:50
回答 1查看 3.2K关注 0票数 4

我正在绘制二维数组地图,如:

代码语言:javascript
复制
* 0 1 2 3 4 5 6
0 # # # # # P #
1 # # # # # # #
2 # # # # # # #
3 # # T # # # #
4 # # # # # # #

这是个游戏。“不是”是Troll,“P”是玩家。在这场比赛中,巨魔追逐玩家。让我们假设玩家现在不会移动。Troll的位置(行、列)是(3,2)和牌手(0,5)。

巨魔可以通过向右上角的方向前进来追逐玩家.这意味着,到达P位置只需3步:

代码语言:javascript
复制
(3,2)->(2,3)->(1,4)->(0,5)

但是,当我使用欧几里德距离公式时:

代码语言:javascript
复制
    (int) Math.floor(Math.sqrt(Math.pow((0-3) , 2) + Math.pow((5-2) , 2))) ;

它要走4步才能到达那里。

我对距离公式感到很困惑。在这种情况下我不能用它吗?但在某些情况下,它采取了正确的步骤。

希望有人能解释这个问题,谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-23 12:15:54

我认为你指的是能够在对角线上移动。如果你在对角线中移动,你实际上移动了sqrt(2)“单位”,这样你就能够“移动得更快”,因为当你使用对角线时,你每一步需要多个单位。

在某些情况下,当你让巨魔和玩家以相同的x或y值对齐时,你只需移动一个单位就可以到达他。

如果你想避免对角线,所以你不能采取“更快”的移动,一个很好的距离度量是曼哈顿距离,它基本上是

代码语言:javascript
复制
manhattan_distance(a,b) = abs(a.x - b.x) + abs(a.y - b.y)

加法:如果您希望启用digonals,您可以按以下方式计算出距离:

代码语言:javascript
复制
diffX = abs(a.x - b.x)
diffY = abs(a.y - b.y)
numSteps = max(diffX, dixxY) //max is returning the higher value of both.

这是因为您将尽可能多地进行对角线移动,而这个数字是min(diffX,diffY),然后您只需在一个轴中移动以提醒移动,您就可以通过min(diffX,diffY)步骤在这个轴上“更近”地移动,所以您需要进行max(diffX-diffY) - min(diffX,diffY)移动,现在将两种“类型”的移动(对角线/非对角线)相加,然后得到:

代码语言:javascript
复制
numMoves = max(diffX-diffY) - min(diffX,diffY) + min(diffX,diffY) = max(diffX-diffY)

例如,在您的矩阵中:

代码语言:javascript
复制
diffX = abs(3-0) = 3
diffY = abs(2-5) = 3
max(diffX,diffY) = 3 

tl;dr:

  • 经典的欧几里得距离不起作用,因为对角线的长度是sqrt(2),所以使用它时移动得更快。
  • 它可以通过避免对角线和使用曼哈顿距离dist(a,b) = abs(a.x - b.x) + abs(a.y - b.y)来解决。
  • 或者通过允许对角线和使用距离度量:dist(a,b) = max{abs(a.x-b.x),(a.y-b.y)}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28673527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档