JavaScript中的球形距离

时间:2014-01-29 20:09:00

标签: javascript geometry computer-science

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

        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 个答案:

答案 0 :(得分: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样式指南。