【发布时间】:2014-07-16 17:23:26
【问题描述】:
3d 中矢量旋转的简单实现会产生巨大的舍入误差,尤其是在围绕不同轴执行多次旋转时。 simple 1-axis example 显示了基本问题。我有一个代码,我围绕 x 和 y 轴旋转点几次。在某些情况下,我在小数点后第二位出现错误(例如,向量的长度在旋转前为 1,旋转后为 0.9)。我会很高兴看到相对错误< 1e-5。
void Rotate_x(double data[3], double agl) {
agl *= M_PI/180.0;
double c = cos(agl); double s = sin(agl);
double tmp_y = c*data[1] - s*data[2];
double tmp_z = s*data[1] + c*data[2];
data[1] = tmp_y; data[2] = tmp_z;
}
谁能指点我一个库或一些代码,它围绕坐标轴旋转点且误差最小?
我发现的所有东西都是臃肿的线性代数库,对于我的目的来说太过分了。
编辑:
我去了long doubleprecision 和combined rotations 来改善错误。对于双打,我并不完全满意(1e-3 最坏情况下的相对误差)。这是最简单的解决方案,它工作正常。仍然不会介意以常规双精度精确旋转的漂亮库。
【问题讨论】:
-
也许你可以将你的点转换为极坐标——然后组成旋转是微不足道的,不应该累积精度误差。完成旋转后,转换回笛卡尔。
-
非常干净的代码;干得好!
-
问题肯定不是精度。建议问题是质量差的触发功能。除非三角函数很差,否则您应该不会遇到接近报告的精度损失的情况。
标签: c algorithm rotation linear-algebra