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)给你k你需要做的alpha = beta + 360k

如果需要,第二行从 [-359,-1] 规范化回 [1,359]。

于 2012-12-20T15:49:45.267 回答
2

你已经标记了你的问题三角,所以这里有一些三角:

a) 取sin(theta)and cos(theta)-- 包含多少(正数或负数)倍数并不重要360°sin(400°)==sin(40°)==sin(-320°)ETC

b) 如果sin(theta)>0cos(theta)>0theta 在象限 1

如果sin(theta)>0cos(theta)<0theta 在象限 2

等等全天候。哦,决定在 4 cornerswheresincosreturn做什么0

于 2012-12-20T15:56:33.790 回答