Algorithm 获取角度的当前象限的最快方法

Algorithm 获取角度的当前象限的最快方法,algorithm,trigonometry,Algorithm,Trigonometry,首先,这听起来很简单,但目前我正在创建一个函数getQuadrant(degree),用于从给定角度返回象限 例如,如果度>=0且=90且360) 角度=角度-360; 结束 而(角度0和cos(θ) 假设: 角度是一个整数 角度为正 /是整数除法 对于负角度,您需要一些额外的处理。等一下……我不确定是否遵循了。这些不是(角度/360)吗*360=角度?,第1行的最终结果总是0?好的,我知道了。我是在Matlab中这样做的。但在C语言中,这是完美的,因为整数运算中的角度/360会隐式地降低数字。

首先,这听起来很简单,但目前我正在创建一个函数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(角度>360)
角度=角度-360;
结束
而(角度<0)
角度=角度+360;
结束
然后,我计算。但坦率地说,我讨厌用while这样的语句。有没有其他数学方法可以一次性指出角度的象限


编辑:我看到有很多好的答案。请允许我添加“哪种算法最快?

利用整数算术:

angle = angle - (angle/360)*360;
if (angle < 0) angle = angle + 360;
角度=角度-(角度/360)*360;
如果(角度<0)角度=角度+360;
这个想法是,由于
angle/360
是四舍五入(
floor()
),
(angle/360)
为您提供了
k
所需的
alpha=beta+360k


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

您可以使用模运算:

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
angle%=360.0;//[0..360)如果角度为正,如果角度为负,(-360..0]
如果(角度<0)角度+=360.0;//返回到[0..360)
象限=(角度/90)%4+1;//象限

您已将问题标记为三角函数,因此这里有一些三角函数:

a) 以
sin(θ)
cos(θ)
为例——无论包含多少个
360°
的倍数(正或负);
sin(400°)==sin(40°)==sin(-320°)

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

如果
sin(θ)>0
cos(θ)
假设:

  • 角度
    是一个整数
  • 角度
    为正
  • /
    是整数除法

  • 对于负角度,您需要一些额外的处理。

    等一下……我不确定是否遵循了。这些不是(角度/360)吗*360=角度?,第1行的最终结果总是0?好的,我知道了。我是在Matlab中这样做的。但在C语言中,这是完美的,因为整数运算中的角度/360会隐式地降低数字。(我不是在C模式下)
    (angle/90)%4+1