C++ 点在浮点坐标精度中的旋转

标签 c++ floating-point rotation geometry floating-accuracy

我学习 OpenGL ES 2.0。但我认为更多的是 C++ 问题而不是 OpenGL。我被轮换问题困住了。众所周知,可以使用以下等式应用旋转变换:

p'x = cos(theta) * (px-ox) - sin(theta) * (py-oy) + ox
p'y = sin(theta) * (px-ox) + cos(theta) * (py-oy) + oy

但是,当我多次执行这个旋转操作时,似乎出现了精度问题。我想,这个问题的核心在于 cos 函数和浮点限制的不确定结果。结果我看到我旋转的物体越来越小。所以:

1.) 你怎么看,这个问题真的与浮点精度问题有关吗?

2.) 如果是这样,我该如何处理。

假设 float _points[] 是包含坐标 x1,y1,x2,y2...xn,yn 的数组。然后我按以下方式重新计算旋转后的坐标:

       /* For x */
    float angle = .... ;
pair<float, float> orig_coordinates(0, 0);
        for (; coors_ctr < _n_points * 2; coors_ctr += 2)
            _points[coors_ctr] = cos(angle) * (_points[coors_ctr] - _orig_coordinates.first) -
                sin(angle) * (_points[coors_ctr + 1] - _orig_coordinates.second) + 
                _orig_coordinates.first;
        /* For y */
        coors_ctr = 1;
        for (; coors_ctr < _n_points * 2; coors_ctr += 2)
            _points[coors_ctr] = sin(angle) * (_points[coors_ctr - 1] - _orig_coordinates.first) +
            cos(angle) * (_points[coors_ctr] - _orig_coordinates.second) + _orig_coordinates.second;

最佳答案

我认为问题在于您正在将旋转后的结果写回输入数组。

p'x = cos(theta) * (px-ox) - sin(theta) * (py-oy) + ox
p'y = sin(theta) * (p'x-ox) + cos(theta) * (py-oy) + oy

尝试在不合适的地方进行旋转,或者使用临时变量并一次做一个点 (x,y)。

关于C++ 点在浮点坐标精度中的旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23173245/

相关文章:

c - 除法和 float

除非 "prodded",否则 python float 类不会出现在类层次结构中

swift - Swift 中没有动画的初始 subview 旋转

javascript - HTML5 Canvas 计算旋转点

C++ 访问冲突类数组

c++ - CMake 和 Visual Studio 项目设置

c++ - 在 Mac 上使用 CodeBlocks 安装 Boost

c++跨平台方式定义64位无符号整数

c++ - C++11 中的 float 比较

javascript - 如何使用 atan2() 使该 div 从其一端而不是中心旋转