粗略计算2点之间的距离

时间:2011-05-31 01:08:35

标签: math image-processing geometry

我想计算两点之间的粗略(近似)距离,以减少计算开销。

我使用以下公式表示(x1,y1)和&之间的距离。 (x2,y2):

Dist = Mod (x1 - x2) + Mod (y1 - y2)

其中Mod是模数运算符,使得Mod(x)= | X |。

这似乎有效。

我想知道,如果我错过了什么......

7 个答案:

答案 0 :(得分:11)

三种常用距离的图形表示:

enter image description here

(注意:这表示这三个指标中半径为4的圆圈。)

答案 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),这些点之间的距离由公式给出:enter image description here

这是我们在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;
        }

相关问题