我的应用程序允许基于鼠标位置围绕中心旋转点。我基本上是围绕这样的另一点旋转点:
void CGlEngineFunctions::RotateAroundPointRad( const POINTFLOAT ¢er, const POINTFLOAT &in, POINTFLOAT &out, float angle )
{
//x' = cos(theta)*x - sin(theta)*y
//y' = sin(theta)*x + cos(theta)*y
POINTFLOAT subtr;
subtr.x = in.x - center.x;
subtr.y = in.y - center.y;
out.x = cos(angle)*subtr.x - sin(angle)*subtr.y;
out.y = sin(angle)*subtr.x + cos(angle)*subtr.y;
out.x += center.x;
out.y += center.y;
}
其中POINTFLOAT只是
struct POINTFLOAT {
float x;
float y;
}
问题是这些点需要在mousemove上进行更新。我正在寻找一种无需执行以下操作的方法:
Store original points
Rotate Original points
Copy result
Show Result
Rotate Original points
Copy result
Show Result....
我觉得存储原件似乎很麻烦,并占用了额外的内存。有没有一种方法,知道先前的旋转角度和当前的旋转角度,我可以以某种方式避免一直将变换应用于原始点,而仅建立在我要修改的点上?
*直到鼠标移到上方,中心才会改变,所以这不是问题
谢谢
最佳答案
如果从新旋转点中减去旧旋转点,则将获得一个值,可以用来旋转已经修改的点。请注意,这需要存储旧的旋转,并且随着旋转的越多,坐标的精度将越来越低。不过,它足够接近政府工作。