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

时间:2014-04-19 17:33:53

标签: 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;

1 个答案:

答案 0 :(得分:4)

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

p&#39; x = cos(theta)*(px-ox) - sin(theta)*(py-oy)+ ox
p&#39; y = sin(theta)*( p&#39; x -ox)+ cos(theta)*(py-oy)+ oy

尝试进行旋转,或使用临时变量并一次执行一个点(x,y)。