2012-12-20 25 views
6

まず、これは非常に自明ではないかもしれませんが、現在、与えられた角度から象限を戻す関数getQuadrant(度)を作成しています。角度の現在の象限を取得する最も速い方法

例えばdegreeが> = 0で、<の場合、1を返します。degreeが90以上で、<の場合は2を返します。これはとても簡単です。しかし、0-360以外度に対処できるように、私は、単にこのような、第0〜360度の範囲にあると、それらの数値を正規化:その後

  while (angle > 360) 
       angle = angle - 360; 
      end 

      while (angle < 0) 
       angle = angle + 360; 
      end 

、私が計算します。しかし、率直に言って、私はこのようなwhileステートメントを使うのは嫌です。 1つの角度の象限を指摘できる他の数学的方法はありますか?

編集:私は多くの良い答えがあることがわかります。私が追加することを許可する

答えて

3

は、整数算術演算を活用して「アルゴリズムが最速になります?」:angle/360は(floor())切り捨てているので、アイデアは、ある

angle = angle - (angle/360)*360; 
if (angle < 0) angle = angle + 360; 

(angle/360)はあなたにkを与えますalpha = beta + 360kを実行する必要があります。

必要に応じて、2行目が[-359、-1]から[1,359]に正規化されています。

あなたはモジュロ演算を使用することができます
+1

私はフォローしても分かりません。それらはありません(角度/ 360)* 360 =角度ですか?そして、行1の最終結果は常に0になりますか? – Karl

+0

OK、私はそれを得た。私はMatlabでこれをやっていました。しかし、C言語では整数演算のangle/360は暗黙的に数値を下げるため、これは完全に機能します。 (私はCモードではなかった) – Karl

4

angle %= 360.0; // [0..360) if angle is positive, (-360..0] if negative 
if (angle < 0) angle += 360.0; // Back to [0..360) 
quadrant = (angle/90) % 4 + 1; // Quadrant 
1

あなたは三角法はので、ここでいくつかの三角法だあなたの質問をタグ付けしました:

A)sin(theta)cos(theta)を取る - それはどのように問題ではありません。多くの(正または負の)倍数の360°が含まれます。 sin(400°)==sin(40°)==sin(-320°)など

B)sin(theta)>0cos(theta)<0シータは象限にクロックラウンドに2

とそうであればsin(theta)>0cos(theta)>0シータは、象限1

である場合。ああ、4 cornersで何をすべきかを決めてください。ここで、sincos0です。

2
(angle/90)%4+1 

仮定:

  1. angleが整数
  2. angleある正
  3. /であるあなたには、いくつかの追加の処理をする必要があります負の角度については

整数除算です。

関連する問題