从3x3矩阵组件中找出角度

时间:2013-05-10 12:18:39

标签: matrix

我有一个3x3旋转矩阵:

[  cos( angle ) sin( angle ) 0 ]
[ -sin( angle ) cos( angle ) 0 ]
[  0            0            1 ]

我如何计算angle

我现在使用的方法是:

void Mat3::SetAngle( const float angle ) {
    m[ 0 + 0 * 3 ] = cos( angle );
    m[ 1 + 0 * 3 ] = sin( angle );
    m[ 0 + 1 * 3 ] = -sin( angle );
    m[ 1 + 1 * 3 ] = cos( angle );
}

并且正在使用它进行检索:

float Mat3::GetAngle( void ) {
    return atan2( m[ 1 + 0 * 3], m[ 0 + 0 * 3] );
}

我正在测试它:

Mat3 m;
m.SetAngle( 179.0f );
float a = m.GetAngle();

最终为3.0708115,这是不正确的。

2 个答案:

答案 0 :(得分:1)

sin和cos以弧度为参数,而atan2以弧度为单位返回角度。

179 rad = 3.070811 + 14 * 2 * pi rad

与3.070811 rad相同的角度。

您可以将所需角度作为弧度传递并转换GetAngle结果

m.SetAngle( 179.0f * M_PI / 180.0f );
float a = m.GetAngle() * 180.0f / M_PI;

或修改课程以取得学位

void Mat3::SetAngle( const float angleDeg ) {
    angleRad = angleDeg / 180.0f * M_PI;
    m[ 0 + 0 * 3 ] = cos( angleRad );
    // etc
}

float Mat3::GetAngle( void ) {
    return atan2( m[ 1 + 0 * 3], m[ 0 + 0 * 3] ) * 180.0f / M_PI;
}

无论哪种方式,我都建议记录你班级所期望的单位。

答案 1 :(得分:0)

使用atan( sin/ cos)功能,或atan2( sin, cos)(如果可用)。

简单的单参数atan( s/c)是基本方法。从近-PI到+ PI(接近-90度到接近+90度)回答角度,但是你需要在+/- 90度处特殊情况下进行0除以。

您还需要修改“余弦(X)<0”的结果角度,即圆圈的其他180度。

见: