我需要使用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
答案 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样式指南。