我希望计算两点之间的大致距离,以减少计算开销。
我使用以下公式来计算(x1,y1)和(x2,y2)之间的距离:
Dist = Mod (x1 - x2) + Mod (y1 - y2)
其中Mod是模数运算符,使得Mod(x) = |X|。
这似乎有效。
我想知道,如果我漏掉了什么……
我希望计算两点之间的大致距离,以减少计算开销。
我使用以下公式来计算(x1,y1)和(x2,y2)之间的距离:
Dist = Mod (x1 - x2) + Mod (y1 - y2)
其中Mod是模数运算符,使得Mod(x) = |X|。
这似乎有效。
我想知道,如果我漏掉了什么……
mod[x]+mod[y] == 4
,而蓝线是 max[mod[x],mod[y]] == 4
。 - Dr. belisariusmod[x] + mod[y]
吗? - mtrw您确定您正确使用了模运算符吗?看起来您正在使用MOD作为ABSOLUTE。
http://en.wikipedia.org/wiki/Modulo_operation
无论如何,正如Mehrdad所说,使用勾股定理:
Dist = Sqrt( (x1-x2)^2 + (y1-y2)^2 )
你的距离计算公式对于大概的距离来说是没问题的。但使用(x2 - x1)2 + (y2 - y1)2可以得到实际距离的平方。只要铭记这是距离的平方,它就更为准确。并且根据你实现的架构不同,它可能会更快——乘法可能比模数中的分支少花时间,或者对于硬件实现而言可能需要相同的时间。你需要进行基准测试以确保。
abs
通常不需要分支 - 它无条件地将一个位设置为零。 - Cris Luengo如果您想比较距离并节省时间,不要使用距离本身,而是使用它的平方:(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;
}