2013-05-10 98 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度的結果角度。

參見: