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 による除算を特殊なケースにする必要があります。

また、円の他の 180 度である "cosine(X) < 0" の結果の角度を変更する必要があります。

見る:

于 2013-05-10T12:22:49.813 に答える