# 安卓坐标系转换之二：旋转角（欧拉角）

Note: This definition is different from yaw, pitch and roll used in aviation where the X axis is along the long side of the plane (tail to nose).

• Azimuth：绕z轴旋转,磁北与y轴的夹角，顺时针增大，0到359度。
• Pitch：绕x轴旋转的角度，即手机上下旋转，y轴往z轴方向为正。-180到180度。
• Roll：绕y轴旋转的角度, 即手机的左右旋转，顺时针为正，-90到90度。

 public static float[] getOrientation(float[] R, float[] values) {
/*
* 4x4 (length=16) case:
*   /  R[ 0]   R[ 1]   R[ 2]   0  \
*   |  R[ 4]   R[ 5]   R[ 6]   0  |
*   |  R[ 8]   R[ 9]   R[10]   0  |
*   \      0       0       0   1  /
*
* 3x3 (length=9) case://上篇文章讲到的旋转矩阵
*   /  R[ 0]   R[ 1]   R[ 2]  \
*   |  R[ 3]   R[ 4]   R[ 5]  |
*   \  R[ 6]   R[ 7]   R[ 8]  /
*
*/
if (R.length == 9) {
values[0] = (float) Math.atan2(R[1], R[4]);//azimuth
values[1] = (float) Math.asin(-R[7]);//pitch
values[2] = (float) Math.atan2(-R[6], R[8]);//roll
} else {
values[0] = (float) Math.atan2(R[1], R[5]);
values[1] = (float) Math.asin(-R[9]);
values[2] = (float) Math.atan2(-R[8], R[10]);
}
return values;
}

R[0] = Hx;     R[1] = Hy;     R[2] = Hz;//【地球坐标系】X方向，指东
R[3] = Mx;     R[4] = My;     R[5] = Mz;//【地球坐标系】Y方向，指北
R[6] = Ax;     R[7] = Ay;     R[8] = Az;//【地球坐标系】Z反方向，向下

 values[0] = (float) Math.atan2(R[1], R[4]);

azimuth是绕z轴旋转,磁北与y轴的夹角，顺时针增大，0到359度。这里用了atan2函数，因为atan只可以表示$-{90}^{o}到{90}^{o}$$-90^{o}到90^{o}$，atan2可以表示$-{180}^{o}到{180}^{o}$$-180^{o}到180^{o}$。具体详细的区别可以看这里

pitch的代码如下：

values[1] = (float) Math.asin(-R[7]);

roll的代码如下：

 values[2] = (float) Math.atan2(-R[6], R[8]);