Math 我是否应该根据角度值对反三角函数进行不同的处理?

Math 我是否应该根据角度值对反三角函数进行不同的处理?,math,Math,当我查看Google以前的CardwardSDK()时,有一个从一个窗口提取旋转轴和角度。数学很简单,解释得很详细 让我困惑的是,作者将计算分为三种情况(cosθ>sqrt(1/2);cosθ-sqrt(1/2),第三种情况是sqrt(1/2)≤ abs(cosθ)。无论如何,另一个可能的解释是得到正确象限中的θ。如果不知道代码中所有其他变量的作用,就不可能给出明确的答案。第二种情况是cosθ>-sqrt(1/2),第三种情况是sqrt(1/2)≤ abs(cosθ)。无论如何,另一个可能的解

当我查看Google以前的CardwardSDK()时,有一个从一个窗口提取旋转轴和角度。数学很简单,解释得很详细

让我困惑的是,作者将计算分为三种情况(cosθ>sqrt(1/2);cosθ<-sqrt(1/2);-sqrt(1/2)≤ cosθ≤ sqrt(1/2))。但事实上,第一种情况通常可以应用,θ=0的情况除外


有人知道作者为什么这样做吗?这是关于准确性还是性能?还是我错过了什么致命的东西?罗德里格斯公式是

     R = I + sin(th)*K + (1-cos(th))*K²
其中,
K
是实现与
K=(kx,ky,kz)
的叉积的反对称矩阵(
K=n
)。对于它的平方,还有一个公式
K²=K*K^T-I
,因此可以使用另一种形式

    R = cos(th)*I+sin(th)*K+(1-cos(th))*(k*k^T).

角度范围的细分用于绕过
asin
acos
对于接近
+1
-1
的参数的通常限制。这本可以通过计算所有情况来避免

    angle = Math.atan2(sinAngleAbs, cosAngle);
(特别是在大多数实现中,由于x86 FPU提供了
FPATAN
作为唯一的反向触发功能,因此使用了标识
asin(x)=atan2(x,sqrt(1-x*x))
acos(x)=atan2(sqrt(1-x*x),x)
。)


抵消误差的一个来源是计算
R
的反对称部分

    (R-R^T)/2 = sin(th)*K
非对角线条目具有以下形式:

    R(1,2)=-sin(th)*kz + (1-cos(th))*kx*ky
          =2*sin(th/2)*( -cos(th/2)*kz + sin(th/2)*kx*ky ), …
如果
sin(th)
很小并且
cos(th)
接近
-1
,即
th
角度接近
pi
,并且在这种情况下,
sin(th)*kz
相对于
kx*ky
很小,则在该组件中的
R-R^T
中发生抵消错误。类似地,如果其他任何组件在其他组件中都那么小。这就是为什么这种情况下的条目最好根据

(R+R^T)/2 = I + (1-cos(th))*K²
          = cos(th)*I + (1-cos(th))*(k*k^T)

通过在
(1-cos(th))*k*k^T
中选择
kx,ky,kz
中乘数最大的列,罗德里格斯公式为

     R = I + sin(th)*K + (1-cos(th))*K²
其中,
K
是实现与
K=(kx,ky,kz)
的叉积的反对称矩阵(
K=n
)。对于它的平方,还有一个公式
K²=K*K^T-I
,因此可以使用另一种形式

    R = cos(th)*I+sin(th)*K+(1-cos(th))*(k*k^T).

角度范围的细分用于绕过
asin
acos
对于接近
+1
-1
的参数的通常限制。这本可以通过计算所有情况来避免

    angle = Math.atan2(sinAngleAbs, cosAngle);
(特别是在大多数实现中,由于x86 FPU提供了
FPATAN
作为唯一的反向触发功能,因此使用了标识
asin(x)=atan2(x,sqrt(1-x*x))
acos(x)=atan2(sqrt(1-x*x),x)
。)


抵消误差的一个来源是计算
R
的反对称部分

    (R-R^T)/2 = sin(th)*K
非对角线条目具有以下形式:

    R(1,2)=-sin(th)*kz + (1-cos(th))*kx*ky
          =2*sin(th/2)*( -cos(th/2)*kz + sin(th/2)*kx*ky ), …
如果
sin(th)
很小并且
cos(th)
接近
-1
,即
th
角度接近
pi
,并且在这种情况下,
sin(th)*kz
相对于
kx*ky
很小,则在该组件中的
R-R^T
中发生抵消错误。类似地,如果其他任何组件在其他组件中都那么小。这就是为什么这种情况下的条目最好根据

(R+R^T)/2 = I + (1-cos(th))*K²
          = cos(th)*I + (1-cos(th))*(k*k^T)

通过在
(1-cos(th))*k*k^T
中选择
kx,ky,kz
中乘数最大的列,第二种情况是cosθ>-sqrt(1/2),第三种情况是sqrt(1/2)≤ abs(cosθ)。无论如何,另一个可能的解释是得到正确象限中的θ。如果不知道代码中所有其他变量的作用,就不可能给出明确的答案。第二种情况是cosθ>-sqrt(1/2),第三种情况是sqrt(1/2)≤ abs(cosθ)。无论如何,另一个可能的解释是得到正确象限中的θ。如果不知道代码中所有其他变量的作用,就不可能给出明确的答案。