2013-05-10 97 views
0

我有一个3×3的旋转矩阵角度:查找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这是不正确的。

+0

您正在使用哪种编程语言? – 2013-05-10 12:21:42

+0

我正在使用C++语言。 – 2013-05-10 12:22:51

+0

看起来像围绕z轴旋转......也正弦的迹象:)似乎互换。确保它是弧度。 – kineticfocus 2013-05-10 12:25:02

回答

1

正弦和余弦带参数的弧度,而ATAN2返回弧度的角度。

179 rad = 3.070811 + 14 * 2 * pi rad 

它与3.070811拉德角相同。

你既可以通过在所需的角度和弧度转换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; 
} 

无论哪种方式,我建议归档哪个单位的班级期待。

0

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

简单的单参数atan(s/c)是基本的方法。从几乎-PI到+ PI(接近-90度到接近+90度)的角度回答了这些角度,但是您需要专门处理+/- 90度的0分频。

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

参见: