2012-10-13 7 views
1

이것을 닫기 전에 실제로 프로그래밍과 관련이 있습니다.대상 표제의 방향 전환

저는 2D 맵에서 항공기를 시뮬레이트 할 프로그램과 함께 작업하고 있습니다. 타겟 베어링을 치기 위해 방향을 바꾸는 데 어려움이 있습니다.

double maxHeadingChange = 10; //Maximum heading change per 100 ms 
double targetHeading = 0; 
     double differenceHeading = Math.Abs(targetHeading - heading); 
     //if we need to turn clockwise 

     if (targetHeading > 340 || targetHeading < 30) 
     { 
      if (heading < 180) 
      { 
       if (differenceHeading > maxHeadingChange) 
        heading -= maxHeadingChange; 
       else 
       { 
        heading -= differenceHeading; 
       } 
      } 
      else 
      { 
       if (differenceHeading > maxHeadingChange) 
        heading -= maxHeadingChange; 
       else 
       { 
        heading -= differenceHeading; 
       } 
      } 
     } 
     else if (targetHeading > heading) 
     { 
      if (targetHeading - heading < maxHeadingChange) 
       heading = targetHeading; 
      else 
      { 
       heading += maxHeadingChange; 
      } 
     } 
     else 
     { 
      if (heading - targetHeading < maxHeadingChange) 
       heading = targetHeading; 
      else 
      { 
       heading -= maxHeadingChange; 
      } 
     } 
     //MessageBox.Show(headingDifference + ""); 
     //just for now 
     //heading = targetHeading; 

     if(heading > 359) 
     { 
      heading = 0; 
     }if(heading < 0) 
     { 
      heading += 360; 
     } 

당신은 내가 무엇을 시도하고있어 방향 설정에 도착하고, 다음 차례의 양이 최대 회전 금액으로 설정, 최대 회전 금액보다 큰 경우 무엇을 볼 수 있습니다.

개체가 ~ 10 도의 표제에 있고 대상이 354 도인 경우 표적을 명중시키기 위해 시계 방향으로 돌려야한다는 것이 문제입니다. 이는 표제를 빼는 것입니다. 목표 표제가 작습니다. 문제는 타겟 헤딩이 0을지나 더 높은 헤딩 범위로 이동하자마자 시계 방향으로 돌리는 것입니다. 이로 인해 대상이 표제 (방향이 반 시계 방향으로 회전하거나 각도가 감소 함)쪽으로 돌 려 나오고 0을지나 자마자 방향이 바뀌어 갑자기 방향이 바뀝니다.

차례를 얻는 더 효율적인 방법을 찾아야합니다 최대도 회전 수에 약간의 시뮬레이션이 있으므로 targetHeading으로 방향을 설정할 수는 없습니다. 10 *의 현재 헤딩에서 350 *의 제목을 발견하여 헤딩을 계속합니다.

대단히 죄송합니다.

잠재적 해결책 1 [편집]

double maxHeadingChange = 10; //Maximum heading change per 100 ms 
double targetHeading = 0; 
double differenceHeading = Math.Abs(targetHeading - heading); 
     //if we need to turn clockwise 
     if(getTurnDir(heading, targetHeading)) 
     { 
      //Turn right 
      if(differenceHeading > maxHeadingChange) 
      { 
       heading -= maxHeadingChange; 
      }else 
      { 
       heading -= differenceHeading; 
      } 
     }else 
     { 
      if (differenceHeading > maxHeadingChange) 
      { 
       heading += maxHeadingChange; 
      } 
      else 
      { 
       heading += differenceHeading; 
      } 
     } 

     //MessageBox.Show(headingDifference + ""); 
     //just for now 
     //heading = targetHeading; 

     if(heading > 359) 
     { 
      heading = 0; 
     } 
     if(heading < 0) 
     { 
      heading += 360; 
     } 
    } 

    double hdgDiff(double h1, double h2) 
    { // angle between two headings 
     double diff = h1 - h2 + 3600 % 360; 
     return diff <= 180 ? diff : 360 - diff; 
    } 
    /// <summary> 
    /// Left is false 
    /// </summary> 
    /// <param name="hdg"></param> 
    /// <param name="newHdg"></param> 
    /// <returns></returns> 
    bool getTurnDir(double hdg, double newHdg) 
    { // should a new heading turn left or right? 
     if (newHdg > hdg) 
      return newHdg - hdg > 180; 
     return hdg - newHdg > 180; 
    } 

가 ~ 기독교

답변

5
double hdgDiff (double h1, double h2) { // angle between two headings 
    const double diff = fmod(h1 - h2 + 3600, 360); 
    return diff <= 180 ? diff : 360 - diff; 
} 

bool isTurnCCW(double hdg, double newHdg) { // should a new heading turn left ie. CCW? 
    const double diff = newHdg - hdg;  // CCW = counter-clockwise ie. left 
    return diff > 0 ? diff > 180 : diff >= -180; 
} 
+0

시험이, 덕분에 지금까지 –

+0

나는이 문제가 : 대상 제목 : 146.630473812382 제목 : 321.152852773836 를 그냥 붙어 앉아 어느 방향 으로든 돌 수없는 146.6. –

+0

두 제목 : 대상 제목 : 146.249466480246 제목 : 331.152852773836 대상 제목 : 146.240074739079 제목 : 321.152852773836 그것은이 –

관련 문제