我学习 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/