欧式距离、曼哈顿距离、切比雪夫距离、Octile距离

欧式距离 Euclidean distance

欧式距离是我们在直角坐标系中最常用的距离量算方法,例如小时候学的“两点之间的最短距离是连接两点的直线距离。”这就是典型的欧式距离量算方法,也是熟悉的“勾股定理”,解算三角形斜边得到的。

2D distance: sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))

3D distance: sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)+(z2-z1)*(z2-z1))

sqrt用于开平方根。欧几里得距离一般要比曼哈顿距离短,但由于开平方根需要消耗一些计算资源,所以算法实际执行起来要慢一些。

于是有些人推荐去掉这个开平方根的步骤,直接把((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))作为结果返回。

但在A星算法f = g + h中,如果距离很长,距离函数h将变得很大,这时候估算函数g将几乎不起作用。这时候A星算法就退化成了最佳优先搜索算法。

也许可以通过把D设置得很小来让h不要那么大,但这时候如果距离很短,那么距离函数h将变得更小,与估算函数g相比几乎不起作用。这时候A星算法就退化成了Dijkstra算法。

如果开平方根消耗的资源仍然非常显著,那么我们可以用快速近似开平方根算法来代替一般的开平方根算法,或者干脆用octile距离来近似代替欧几里得距离。

曼哈顿距离 Manhattan distance

曼哈顿距离是与欧式距离不同的一种丈量方法,两点之间的距离不再是直线距离,而是投影到坐标轴的长度之和。

如果游戏使用的是矩形网格地图,而在网格之间只能上下左右移动,那么就可以使用曼哈顿距离。据说这套算法是专门为出租车司机设计的,因为汽车只能沿着划分好的街道前进,而不能任意斜着穿过楼房。

假设第一个点的x坐标是x1,y坐标是y1,第二个点的x坐标是x2,y坐标是y2。

那么这两个点的曼哈顿距离就是|x1 - x2| + |y1 - y2|,即两点横纵坐标差之和。

比如AB两点的曼哈顿距离就是 |2 - (-2)| + |3 - 0| = 7。

在A星算法中,我们也可以将结果再乘上D。D是花费参数,即从一个网格到另一个网格的花费。一般只需将其设置为1就行了。但也可以增加D,这意味着放弃了最优路径,而追求更快的算法效果。相反,调低D意味着让算法更慢而最终路径更短。

图中绿色的线为欧式距离的丈量长度,红色的线即为曼哈顿距离长度,蓝色和黄色的线是这两点间曼哈顿距离的等价长度。

切比雪夫距离(Chebyshev distance)

数学上,切比雪夫距离是将2个点之间的距离定义为其各坐标数值差的最大值。

网上搜索,好多有关这个距离的解释,大多都是采用国际象棋中的王的走步来作为例子,王可以前后左右走,还可以斜前斜后走,一共8个方向可以认为距离均等。

也就是在下面3×3邻域内,中心网格的中心点到8个邻域网格中心点的距离相等。

 

在之前说到的地图中,如果允许沿对角线移动,即上下左右,左上,左下,右上,右下八个方向移动,那么就需要使用对角距离。

使用的算法如下,其中D是沿着上下左右四个方向移动一个网格的花费,而D2是沿着左上,左下,右上,右下这四个对角线方向移动一个网格的花费。

同样,如果将D设置为1,而D2设置1,那么这就叫做切比雪夫距离(Chebyshev distance)。

上述两点的切比雪夫距离为|x1 - x2| 和 |y1 - y2|中的最大值,即即两点横纵坐标差的最大值。

比如A(2,3)和B(-2,0)两点,切比雪夫距离就是 |2 - (-2)| 和 |3 - 0|中的最大值即 4。

同样,如果将D设置为1,而D2设置为根号2,那么这就叫做octile距离

Octile距离 

下图将在每个网格上都设置了节点,并连接起来。

但有时候,并不需要那么复杂,于是干脆将这些网格点都去掉,改为设置好的节点,加上规划好的路径。也就是只保留部分网格点。从一个路点到另一个路点,下面左图允许使用最短直线距离,而下图右只允许沿着网格。而探讨如何在这些不规则路径上移动的领域,叫做图论。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值