2014-01-29 20 views
0

我需要使用Javascript找到两个坐标的球形距离。我为这个项目使用了很多Wolfram,并且发现这个公式d = cos ^( - 1)(P·Q)[参考:http://mathworld.wolfram.com/SphericalDistance.html]。所以我知道P·Q是所讨论的两个坐标的点积。这导致找到我发现的Dot产品=(x1 * x2 + y1 * y2 + z1 * z2)[参考:http://en.wikipedia.org/wiki/Dot_product]。所以我把下面的方法放在一起,每次都得到NaN(不是数字)。JavaScript中的球形距离

 function ThreeDimensionalDistance(x1,y1,z1,x2,y2,z2){ 

      return Math.acos(x1*x2 + y1*y2 + z1*z2); 

     } 

这里有两组样本数据的我用,我想不通为什么我得到NaN的。我是否缺少一些小的东西,我是否需要将我的数字转换为某些东西,以便与arc cos一起使用?预先感谢您的任何帮助。

样品1 X:-1.7769265970284516,Y:-5.129885707200497,Z:-2.554761143401265 X:-0.8336414256732807,Y:-1.9876462173033347,Z:5.599491449072957 距离:NaN的 样品2 X:-0.8336414256732807,Y: -1.9876462173033347,Z:5.599491449072957 X:0.8447772905770565,Y:4.252407300473133,Z:4.147696165367961 距离:NaN的

+1

这个问题实际上并不属于这里(它实际上是一个数学问题),但问题在于:您尚未将向量归一化为**单位**球体(也就是说,您的点P和Q不在单位上领域)。 – mc10

回答

2

我做了一些数学,所以请尝试以下操作进行:

function threeDimensionalDistance(x1, y1, z1, x2, y2, z2) { 
    // Assume that the points are on the same sphere 
    var radius = Math.sqrt(x1 * x1 + y1 * y1 + z1 * z1); 

    // Calculate normalized spherical distance 
    var dotProduct = x1 * x2 + y1 * y2 + z1 * z2; 
    var normalizedDistance = Math.acos(dotProduct/(radius * radius)); 

    // Calculate actual distance 
    var distance = normalizedDistance * radius; 

    return distance; 
} 

我做的一个小改动是将您的方法重命名为以小写字母开头,以遵循标准的JavaScript风格指南。

+0

@Matt这是一个好主意,让我解决这个问题。 – mc10

+0

这很有意义。你在关于归一化向量的评论中是正确的。谢谢@ mc10,现在我已经坚持了几个星期。 – gr4yf0x