从sin / cos转换中获得角度

时间:2012-12-29 05:57:48

标签: math angle sin cos

我想要撤消sin / cos操作以取回一个角度,但我无法弄清楚我应该做些什么。

我在弧度的角度上使用sincos来获取x / y向量:

double angle = 90.0 * M_PI / 180.0;  // 90 deg. to rad.
double s_x = cos( angle );
double s_y = sin( angle );

鉴于s_xs_y,是否可以取回角度?我认为atan2是使用的功能,但我没有得到预期的结果。

5 个答案:

答案 0 :(得分:18)

atan2(s_y, s_x)应该给你正确的角度。也许你已经颠倒了s_xs_y的顺序。此外,您可以分别直接在acosasin上使用s_xs_y函数。

答案 1 :(得分:8)

我使用 acos 函数从给定的s_x cosinus中恢复角度。但是因为几个角度可能导致相同的余弦(例如cos(+ 60°)= cos(-60°)= 0.5),所以不可能直接从s_x返回角度。所以我也使用符号s_y 来取回角度的符号。

// Java code
double angleRadian = (s_y > 0) ? Math.acos(s_x) : -Math.acos(s_x);
double angleDegrees = angleRadian * 180 / Math.PI;

对于(s_y == 0)的具体情况,取+ acos或-acos无关紧要,因为它意味着角度为0°(+ 0°或-0°是相同的角度)或180° (+ 180°或-180°是相同的角度)。

答案 2 :(得分:3)

在数学中是sin和cos的逆操作。这是arcsin和arccos。 我不知道你使用什么编程语言。但通常如果它具有cos和sin函数,那么它可以具有反向函数。

答案 3 :(得分:2)

asin(s_x),acos(s_y),也许,如果你使用c。

答案 4 :(得分:0)

double angle_from_sin_cos( double sinx, double cosx ) //result in -pi to +pi range
{
    double ang_from_cos = acos(cosx);
    double ang_from_sin = asin(sinx);
    double sin2 = sinx*sinx;
    if(sinx<0)
    {
        ang_from_cos = -ang_from_cos;
        if(cosx<0) //both negative
            ang_from_sin = -PI -ang_from_sin;
    }
    else if(cosx<0)
        ang_from_sin = PI - ang_from_sin;
    //now favor the computation coming from the
    //smaller of sinx and cosx, as the smaller
    //the input value, the smaller the error
    return (1.0-sin2)*ang_from_sin + sin2*ang_from_cos;
}