2011-02-17 23 views
6

2 0-360 나침반 표제의 차이점을 알아내는 방법입니다.두 제목의 차이 얻기

이것은 내가 얼마나 멀리 떨어져 있는지 (항상 긍정적 인 출력으로) 알아내는 데 효과적이지만, 출력에 기호를 도입하기 위해 수행해야 할 작업을 파악하는 데 문제가 있습니다.

이상적인 경우, 처음 제목에서 최종 제목까지의 최단 거리가 시계 방향으로 돌아가는 경우, 표제 간의 최단 거리가 반 시계 방향으로 진행될 경우 error에 양수 기호를 표시하고 싶습니다. error에 음수 부호를 사용하고 싶습니다.

원하는 입력들의 몇몇 예/출력

initial-error

0 .................... 30-final. ......... 30

30 .................... 0 .......... -30

360 .................... 1 .......... 1

1 .......... . ......... 360 .......... -1

코드 :

/// <summary> 
    /// Calculate the error from a given initial heading to a final heading 
    /// </summary> 
    /// <param name="inital"></param> 
    /// <param name="final"></param> 
    /// <returns></returns> 
    private double GetHeadingError(double initial, double final) 
    { 
     double directionA = final - initial; 
     double directionB = 360 - (final + initial); 
     double error = 0; 

     if (Math.Abs(directionA) < Math.Abs(directionB)) 
     { 
      error = directionA; 
     } 
     else 
     { 
      error = directionB; 
     } 

     return error; 
    } 
+0

은 1에서 3601 또는 -1입니까? –

+0

Woop, 의미 -1 – chris12892

답변

12

편집 : 차이가 정확히 180도 경우에 대한 추가 확인 여기 내 무거운지는 방법입니다. 이전에는 최종이 최종보다 크거나 작 았는지에 따라 180 또는 -180을 반환했습니다. 두 가지 경우 모두 180을 반환하도록 수정했습니다. 내가 제대로 질문을 이해한다면


그래서 여기 내 시도가의 ...

private static double GetHeadingError(double initial, double final) 
     { 
      if (initial > 360 || initial < 0 || final > 360 || final < 0) 
      { 
       //throw some error 
      } 

      var diff = final - initial; 
      var absDiff = Math.Abs(diff); 

      if (absDiff <= 180) 
      { 
       //Edit 1:27pm 
       return absDiff == 180 ? absDiff : diff; 
      } 

      else if (final > initial) 
      { 
       return absDiff - 360; 
      } 

      else 
      { 
       return 360 - absDiff; 
      } 
     } 
+0

하아,이 작품은 아주 잘! 감사합니다! – chris12892

+0

정말 유용합니다 : 나는 잠시 동안 이것으로 어려움을 겪었습니다. – KAE

1

내가 원하는 결과의 테이블이 잘못 생각합니다.

private double MyGetHeadingError(double initial, double final) 
{ 
    initial += 1000; 
    final += 1000; 

    bool flipped = false; 
    if (initial > final) 
    { 
     double temp; 
     temp = final; 
     final = initial; 
     initial = temp; 
     flipped = true; 
    } 
    double error; 
    if (final - initial > 180) 
     final = final - 360; 

    error = final - initial; 

    if (flipped == true) 
     error = -error; 
    return error; 
} 
1

, 나는 다음과 같은 코드가 작동해야한다고 생각 :

private double GetHeadingError(double initial, double final) 
{ 
      if(initial == 360) initial = 0; 
      if(final == 360) final = 0; 
      double clockWise = (final - initial); 
      double counterClockWise = (360 - final + initial); 
      return (Math.Abs(clockWise) <= Math.Abs(counterClockWise)) ? clockWise : -counterClockWise; 
} 

는 기본적으로 나는 360도 치료 해요 0과 같아. 나는 괜찮다고 생각한다. 이 코드는 위의 표에 나열된 것과 동일한 결과를 생성합니다. 코드는 범위 검사를 수행하지 않으므로 0에서 360 사이의 값이 필요합니다.

0
Degree_Diff = (MIN(ABS(ENDCOMPASS-STARTCOMPASS),ABS(360-ENDCOMPASS+STARTCOMPASS),ABS(360-STARTCOMPASS+ENDCOMPASS))) 
+0

에 오신 것을 환영합니다! 게시물의 정확성을 높이기 위해 샘플 코드에 대한 간단한 설명을 제공하는 것이 더 좋습니다. –