我正在2D网格上进行寻路。
我需要计算距离作为我的启发式算法之一。
此外,如果找不到完整路径,我需要返回最近的位置。
计算到双精度的精确距离似乎是不必要的开销。有没有我可以使用的快速近似值,它仍然足够准确以满足我的需求? (在1的舍入精度内)
顺便说一下,路径长度通常只有5-30个节点,因此在最后使用更准确的功能是不值得的。
答案 0 :(得分:10)
如果找不到完整路径,我需要返回最近的位置。
在这种情况下,您可以跳过距离计算中的平方根运算,即仅使用dy * dy + dx * dx
比较平方距离。
这是因为 a 2 < b 2 当且仅当 a< b 两个任意距离 a 和 b 。
在2D网格中,这将完全用整数实现。
如果您需要非整数值,我可能会使用double
s,直到证明是瓶颈为止。
答案 1 :(得分:2)
如果是2D网格,您可以考虑使用Manhattan distance。这将允许您始终以网格单位工作并避免使用平方根。正如aioobe所说,这可能是微观优化。
答案 2 :(得分:2)
略高于曼哈顿距离,几乎同样快:
unsigned int fastDist(unsigned int dx, unsigned int dy) {
if ( dy < dx ) return (dx + (dy >> 1));
else return (dy + (dx >> 1));
}
当dx或dy为零时确切。对角线上的误差约为6%,最大误差约为12%。
这可以通过添加另一个术语来改进:
unsigned int fastDist(unsigned int dx, unsigned int dy) {
unsigned int w;
if ( dy < dx ) {
w = dy >> 2;
return (dx + w + (w >> 1));
}
else {
w = dx >> 2;
return (dy + w + (w >> 1));
}
}
最大误差小于7%,对角线误差小于3%。