1

ある角度が他の2つの角度の中にあるかどうかを教えてくれる関数を書こうとしています。「ある角度が他の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

これを行う良い方法は、比較するすべての数値が正になるように間隔を回転させることです。

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

この質問は、整数が他の 2 つの整数の範囲内にあるかどうかをテストすることのみに関係しています。大きい値かどうangle1かがわからないので、次のようにします。angle2

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

これはうまくいくはずです:

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

return false;

ここでの中括弧は、else が意図した場合に確実に一致するようにするのに役立つことに注意してください。元のコードは一致するようにインデントされていますが、それは解析方法ではありません。

于 2012-07-05T02:49:14.807 に答える