问题描述
|
我想计算两点之间的粗略(近似)距离,以减少计算开销。
我正在使用以下公式计算(x1,y1)和(x2,y2)之间的距离:
Dist = Mod (x1 - x2) + Mod (y1 - y2)
其中,Mod是Modulus运算符,这样Mod(x)= | X |。
这似乎正在工作。
我想知道,如果我错过了什么...
解决方法
只要您获得绝对值(如您所说的| X |)并且不使用模函数,那么这将为您提供两点之间的曼哈顿距离
如果那是您想要的,那么您就不会错过任何东西
如果要直线距离,请使用勾股定理。这是sqrt((x1-x2)^ 2 +(y1- y2)^ 2)
, 三个常用距离的图形表示:
(注意:在这三个指标中,这代表半径为4的圆。)
, 您确定模数运算符正确吗?看来您将MOD用作ABSOLUTE
http://en.wikipedia.org/wiki/Modulo_operation
无论如何,正如Mehrdad所说的,使用毕达哥拉斯定理:
Dist = Sqrt( (x1-x2)^2 + (y1-y2)^2 )
, 您必须具体说明要计算的距离。
距离公式:给定两个点(x1,y1)和(x2,y2),这些点之间的距离由公式给出:
这是我们在协同坐标几何中用于查找点之间距离的标准公式,并且是MinKowski距离对一维的特化。
, 您的距离度量标准适合粗略距离。但是(x2-x1)2 +(y2-y1)2将给您实际距离的平方。只要记住这是距离的平方,就会更准确。而且,根据您要在其上实现的体系结构,它可能会更快-乘法所需的时间可能少于模数中分支的时间,或者对于硬件实现而言,所需的时间也很可能相同。您需要确定基准以确保。
, 如果要比较距离并节省时间,请不要使用距离本身,而应使用其平方:(x1-x2)^ 2 +(y1-y2)^ 2。不要用sqrt。因此,您的距离将与正常距离完全一样,但是很快。 dx = x1-x2和dx2 = dx * dx的计数甚至比采用ABS(您的意思是,不是真正的MOD)还要快,因为最后一个是函数,您必须为此付费。
理论上,ABS距离是正确的距离。但是,如果对您的目标来说很粗糙,它有什么用?
, 我做了这个算法来计算两点之间的直线距离:
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;
}