Matrix 从3x3矩阵组件中查找角度

Matrix 从3x3矩阵组件中查找角度,matrix,Matrix,我有一个3x3旋转矩阵: [ cos( angle ) sin( angle ) 0 ] [ -sin( angle ) cos( angle ) 0 ] [ 0 0 1 ] 如何计算角度 我现在使用的方法是: void Mat3::SetAngle( const float angle ) { m[ 0 + 0 * 3 ] = cos( angle ); m[ 1 + 0 * 3 ] = sin( angle ); m[

我有一个3x3旋转矩阵:

[  cos( angle ) sin( angle ) 0 ]
[ -sin( angle ) cos( angle ) 0 ]
[  0            0            1 ]
如何计算角度

我现在使用的方法是:

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();
a最终为3.0708115,这是不正确的。

使用
atan(sin/cos)
函数,或者
atan2(sin,cos)
(如果可用)

简单的单参数atan(s/c)是基本方法。这回答了从接近-PI到+PI(接近-90度到接近+90度)的角度,但您需要在+/-90度处精确地除以0

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

见:


正弦和余弦以弧度为参数,而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;
}

无论哪种方式,我建议记录你的班级所期望的单位。< /P>你使用哪种编程语言?我用C++语言。看起来像Z轴周围的旋转…此外,sines的符号:)似乎是互换的。确保它是弧度。我想,在设置角度之前,你需要将你的角度转换成弧度。