我想计算两点之间的粗略(近似)距离,以减少计算开销。
我使用以下公式表示(x1,y1)和&之间的距离。 (x2,y2):
Dist = Mod (x1 - x2) + Mod (y1 - y2)
其中Mod是模数运算符,使得Mod(x)= | X |。
这似乎有效。
我想知道,如果我错过了什么......
答案 0 :(得分:11)
答案 1 :(得分:10)
只要您获得绝对值(如您所说| X |)并且不使用模数函数那么这将为您提供两点之间的曼哈顿距离
如果这就是你想要的,那你就没有错过任何东西
如果你想要直线距离,请使用毕达哥拉斯定理。这是sqrt((x1 - x2)^ 2 +(y1 - y2)^ 2)
答案 2 :(得分:3)
你确定你的模数运算符是正确的吗?看起来你使用MOD作为ABSOLUTE
http://en.wikipedia.org/wiki/Modulo_operation
无论如何,正如Mehrdad所说,使用毕达哥拉斯理论:Dist = Sqrt( (x1-x2)^2 + (y1-y2)^2 )
答案 3 :(得分:2)
您必须在要计算的距离方面具体。
距离公式:给定两个点(x1,y1)和(x2,y2),这些点之间的距离由公式给出:
这是我们在Co-Ordinate几何中使用的标准公式,用于查找点之间的距离,并且是一维的MinKowski distance的特化。
答案 4 :(得分:1)
您的距离指标适用于粗略距离。但是(x 2 - x 1 ) 2 +(y 2 - y 1 ) 2 将为您提供实际距离的平方。只要你记住它是距离的平方,这将更准确。根据您实现此功能的架构,它可能会更快 - 乘法可能比模数中的分支花费更少的时间,或者硬件实现可能需要相同的时间。你需要确定基准。
答案 5 :(得分:1)
如果您希望比较距离并节省时间,请不要使用距离本身,而应使用其方形:(x1-x2)^ 2 +(y1-y2)^ 2。不要拿sqrt。因此,您的距离将与正常距离完全相同,但很快。计算dx = x1-x2和dx2 = dx * dx甚至比采用ABS更快(你的意思是真的,而不是MOD),因为最后一个是函数,你必须付钱。
ABS距离是正确的 - 理论上。但是,如果它对你的目标来说很粗糙,它的用途是什么?
答案 6 :(得分:0)
我制作了这个算法来计算2点之间的直线距离:
var distance = function(x1, y1, x2, y2) {
//Distance Horizantally
var horizontalDistance = 0;
/Distance Vertically
var verticalDistance = 0;
if(x1 > x2) {
horizantalDistance = x1 - x2;
}
else {
horizantalDistance = x2 - x1;
}
if(y1 > y2) {
verticalDistance = y1 - y2;
}
else {
verticalDistance = y2 - y1;
}
var answer = 0;
if(verticalDistance !== 0 && horizantalDistance !== 0) {
//Use the Pathagoreum Theorum
answer = Math.sqrt(verticalDistance + horizantalDistance);
}
else if(horizantalDistance === 0) {
//Use the Vertical Distance
answer = verticalDistance;
}
else if (verticalDistance === 0) {
//Use the Horizantal distance
answer = horizantalDistance;
}
//Return the answer
return answer;
}