空间中的旋转向量和C++中的高精度

Dee*_*ewy 8 c++ precision

这是我用C++计算3D旋转的函数,该旋转由围绕轴的辐射角度定义.

 Vector rotate(const Vector& axis, const Vector& input, const double angle)    {
    double norm = 1/axis.norm();

    if(norm != 1)
        axis *= norm;

    double cos = std::cos(angle);
    double mcos = 1 - cos;
    double sin = std::sin(angle);

    double r1[3];
    double r2[3];
    double r3[3];

    double t_x, t_ym t_z;


    r1[0] = cos + std::pow(axis.x, 2)*mcos;
    r1[1] = axis.x*axis.y*mcos - axis.z * sin;
    r1[2] = axis.x*axis.z*mcos - axis.y * sin;

    r2[0] = axis.x*axis.y*mcos + axis.z*sin;
    r2[1] = cos + std::pow(axis.y, 2)*mcos;
    r2[2] = axis.x*axis.z*mcos - axis.x * sin;

    r3[0] = axis.x*axis.z*mcos - axis.y * sin;
    r3[1] = axis.z*axis.y*mcos - axis.x * sin;
    r3[2] = cos - std::pow(axis.z, 2) * mcos;

    return Vector(t_x, t_y, t_z);
}
Run Code Online (Sandbox Code Playgroud)

问题是,如果你尝试自己旋转矢量npi/4,其中n multiple of 4(做四个四分之一转,这样你就彻底的革命绕轴)的误差将传播非常快.

示例(其中err = input-output):

input: (1.265, 3.398, 3.333)
rotation axis: (2.33, 0.568, 2.689)

n: 8 (so two completes revolutions)
output: (1.301967, 1.533389, 4.138940)
error: (0.038697, -0.864611, 0.805940)


n: 400 (so 100 completes revolutions)
error: (472..., 166..., 673...)
Run Code Online (Sandbox Code Playgroud)

我能做什么 ?

约束:

  • 旋转是不可预测的,所以不可能做angle = pi/4 *n % 2*pi像@molbdnilo建议的那样.因为我必须链转换和旋转来测试是否存在碰撞.

Dee*_*ewy 0

最后我使用了罗德里格斯的轮换公式,表现好多了。

尽管这不是 @ComicSansMs 指出的解决方案:

首先避免链接浮动操作!

因此,结合新算法并使用罗德里格斯公式就可以了。

我怀疑我的第一个矩阵实现中存在错误。

感谢大家的回答和见解。