c# - 目标航向的转向

标签 c# compass-geolocation heading bearing

我正在使用一个程序在二维 map 上模拟飞机。我很难找到转向的方向以击中目标方位。

  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 时突然反转转向。

我需要找到一种更有效的方法来获得以度数为单位的转弯量(我不能简单地将 heading 设置为 targetHeading 因为最大的模拟turn amount) 以便它检测到从当前航向 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;
}
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;
}

最佳答案

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;
}

关于c# - 目标航向的转向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12869557/

相关文章:

C# Jwt token 生成失败 asp.net 核心 2.2

c# - 在 Visual Studio 中查找引用

c# - 即时插入/编辑

c# - 如何编写ForAllMaps函数

iphone - GPS、指南针航向和加速计之间,哪个消耗的电池电量最多?

C 字段类型不完整

objective-c - MKMapVIew 问题,我的定位点未按正确方向显示(我正在使用 mkmapview 的罗盘模式)

android - 为什么我需要摇动手机才能获得正确的 "Compass-Data"?

javascript - 设置的设备语言如何更改标题?