2010-04-19 3 views
1

안녕하세요. 저는 두 벡터 사이의 각도를 계산하고 있으며 때로는 Math.Acos()가 코사인에 대해 범위를 벗어났습니다 (-1> 입력 & & 입력> 1) NaN을 반환합니다. 그게 정확히 무슨 뜻 이죠? 누군가 무슨 일이 일어 났는지 설명 할 수 있습니까? 어떤 도움을 주셔서 감사합니다!Math.Acos()가 잘못된 입력을보고하는 상황을 어떻게 해석합니까?

public double AngleBetween(vector b) 
    { 
     var dotProd = this.Dot(b); 
     var lenProd = this.Len*b.Len; 
     var divOperation = dotProd/lenProd; 

     // http://msdn.microsoft.com/en-us/library/system.math.acos.aspx 
     return Math.Acos(divOperation) * (180.0/Math.PI); 
    } 

여기 DotLen 내 구현의 :

public double Dot(vector b) 
    { 
     // x's and y's are lattitudes and longitudes (respectively) 
     return (this.From.x*b.From.x + this.From.y*b.From.y); 
    } 

    public double Len{ 
     get 
     { 
      // geo is of type SqlGeography (MS SQL 2008 Spatial Type) with an SRID of 4326 
      return geo.STLength().Value; 
     } 
    } 
+0

nitpick : 경계 조건은'(-1> input || input> 1)'또는'! (- 1 <= input && input <= 1)'이라고 써야합니다. – MatrixFrog

+2

그러나 (위도, 경도) 쌍은 2D 벡터가 아니며 3D로 각도를 측정 한 것입니다. 그래서 무엇을 찾으려고하니? 아마도 지구의 중심에서의 내부 각도 또는이 둘 사이의 베어링일까요? 이 공식은 당신을 얻지 못할 것입니다. –

+0

또한 '보낸 사람'은 무엇입니까? 2D Vector 객체의 경우 x 및 y 값을 포함하고 Dot 메서드는 this.X * other.X + this.Y * other.Y가 될 것으로 기대합니다. 또한 Len 메소드가 sqrt (x * x + y * y)를 돌려 줄 것이라고 기대할 수 있습니다. –

답변

2

divOperation은 <-1 또는 1보다 큰 벡터가 있습니까? 그렇다면 DotLen 구현을 확인해야한다고 생각합니다.

+0

나는 dot과 len을 질문에 추가했습니다. 보세요. 당신이 생각하는 것을 말해주세요. – bitcycle

+0

오, 방금 알아 챘습니다. 나는 dot() 메소드의 중요한 부분을 빠뜨렸다. – bitcycle

+0

@Sean 여러분은 호기심을 일으킬 수있는 중요한 부분에 대한 설명을 게시 할 수 있습니까? – MatrixFrog

0

NaN means "not a number"

여기 내 방법입니다. 수학적으로, 당신은 [-1, 1]의 범위를 벗어나는 수의 아 코 코인을 취할 수 없습니다 (또는 아마도 결과는 복잡합니다 - 기억이 안납니다). 그렇게하려는 시도의 결과는 다음과 같습니다. 어떤 숫자도 아닙니다.

+0

그래서 두 벡터와 각각의 방향에 대해 무엇이라고 말합니까? – bitcycle

+0

좋은 질문입니다. 실패한 벡터 샘플을 몇 가지 제공 할 수 있습니까? – MatrixFrog

1

각도의 Cos는 항상 -1과 +1 사이이므로 해당 범위를 벗어나는 값의 역함수 (Acos)를 계산할 방법이 없거나 Naos를 ACos 함수에 전달했음을 의미합니다.

이 경우에는 후자 인 것으로 의심됩니다. 길이 중 하나가 아마도 0 일 것입니다.

관련 문제