7

まず、これは非常に些細なことのように聞こえるかもしれませんが、現在、指定された角度から象限を返すための関数getQuadrant(degree)を作成しています。

たとえば、次数が> = 0かつ<90の場合、1を返します。次数が> = 90かつ<180の場合、2を返します。これは非常に些細なことです。ただし、0〜360度以外の度を処理できるようにするために、最初にこれらの数値を0〜360度の範囲に正規化して次のようにします。

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

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

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

編集:良い答えがたくさんあることがわかります。「どのアルゴリズムが最速になるか」を追加させてください。

4

4 に答える 4

6

モジュロ演算を使用できます。

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
于 2012-12-20T15:54:52.560 に答える
4
(angle/90)%4+1

仮定:

  1. angle整数です
  2. angleポジティブです
  3. /整数除算です

負の角度の場合は、追加の処理が必要になります。

于 2012-12-20T16:09:12.343 に答える
3

整数演算を利用します。

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

angle/360は切り捨てられているので(floor())、あなたがする必要があること(angle/360)をあなたに与えるという考えです。kalpha = beta + 360k

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

于 2012-12-20T15:49:45.267 に答える
2

質問に三角法のタグを付けたので、ここにいくつかの三角法があります。

a)取るsin(theta)と-の倍数(正または負)がいくつ含まれてcos(theta)いるかは関係ありません。等360°sin(400°)==sin(40°)==sin(-320°)

b)シータが象限1にあるsin(theta)>0場合cos(theta)>0

シータが象限2にsin(theta)>0ある場合cos(theta)<0

など、24時間体制で。cornersああ、そして4どこsinで何をすべきかを決めてcos戻って0ください。

于 2012-12-20T15:56:33.790 に答える