1

我正在尝试编写一个函数来告诉我一个角度是否在其他两个角度内。当说“如果一个角度位于其他 2 个角度内”时,我的意思是,例如,如果我有 2 个角度 0 和 90,那么 45 将位于这些角度之间,但 -20(或 99)不会。

我的问题:我的功能似乎没有检测到 2 个角度何时应该位于 2 个角度内。我不确定我的功能是否也适用于负角?

我需要更改什么才能使我的功能正常工作?

bool is_angle_between(int target, int angle1, int angle2)
{
  // Post: Return true if target lies between the 2 angles

  int iTarget = (360 + (target % 360)) % 360;
  int iAngle1 = (3600000 + angle1) % 360;
  int iAngle2 = (3600000 + angle2) % 360;

  if (iAngle1 < iAngle2)
    if (iAngle1 <= iTarget && iTarget <= iAngle2)
      return true;
  else if (iAngle1 <= iTarget || iTarget <= iAngle2)
    return true;

  return false;
}
4

3 回答 3

1

这个问题只与测试一个整数是否在另外两个整数的范围内有关。由于我们不知道是否angle1angle2更大的价值,我会做这样的事情:

bool is_angle_between(int target, int angle1, int angle2)
{
    return (target > angle1 && target < angle2) ||
           (target > angle2 && target < angle1);
}
于 2012-07-05T02:50:13.020 回答
1

这样做的一个好方法是旋转间隔,以便您比较的所有数字都是正数:

int rTarget = ((target - angle1) % 360 + 360) % 360;
int rAngle2 = ((angle2 - angle1) % 360 + 360) % 360;
return 0 <= rAngle1 && rAngle1 <= rAngle2;

否则你会在 0 = 360 度附近遇到麻烦。

顺便说一句,您应该避免不必要if的语句,因为分支可能很昂贵。

于 2012-07-05T08:11:33.493 回答
-1

似乎这样应该工作:

if (iAngle1 < iAngle2) {
    if (iAngle1 <= iTarget && iTarget <= iAngle2) {
        return true;
    }
}
else {
    if (iAngle2 <= iTarget && iTarget <= iAngle1) {
        return true;
    }
}

return false;

请注意,此处的大括号有助于确保 else 与 if 您想要的匹配。您的原始代码按您希望的方式缩进,但这不是它的解析方式。

于 2012-07-05T02:49:14.807 回答