0

我有一个 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();

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

4

2 回答 2

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;
}

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

于 2013-05-10T12:49:47.020 回答
0

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

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

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

看:

于 2013-05-10T12:22:49.813 回答