2014-01-29 2 views
0

자바 스크립트를 사용하여 두 좌표의 구면 거리를 찾아야합니다. 저는이 프로젝트에 Wolfram을 많이 사용하고 있으며,이 수식이 다음과 같은 것을 발견했습니다 : 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 (Not a Number)을 얻습니다.자바 스크립트의 구면 거리

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

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

     } 

여기는 두 세트의 샘플 데이터를 사용하고 있는데 왜 NaN을 얻는 지 알 수 없습니다. 작은 것을 놓친 건가요? 아크 코사인과 작업하기 위해 제 번호를 뭔가 변환해야합니까? 사전에 도움을 주셔서 감사합니다.

샘플 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