2010-08-17 41 views
0

我的应用程序允许基于鼠标位置围绕中心旋转点。我基本上旋转点周围像这样的另一点:该问题的帮助

void CGlEngineFunctions::RotateAroundPointRad(const POINTFLOAT &center, 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; 
} 

的问题是,该点需要鼠标移动上进行更新。我正在寻找一种方式来做到这一点而不做以下:

Store original points 
Rotate Original points 
Copy result 
Show Result 
Rotate Original points 
Copy result 
Show Result.... 

我觉得存储原件似乎凌乱和使用额外的内存。有没有办法,知道前一个旋转角度和当前的旋转角度,我可以避免将变换始终应用于原始点,并且仅仅基于我正在修改的点?

*中心将永远不会改变,直到鼠标抬起所以那不是一个问题

感谢

+4

每当我看到一个问题,标记C和C++我的头想要爆炸 – James 2010-08-17 15:35:47

+2

将头[[explode()'](http://php.net/manual/en/function.explode.php)如果它被标记为[c,C++和php](http://stackoverflow.com/questions/tagged/c%20c%2b%2b%20php)? :p – kennytm 2010-08-17 15:38:18

+0

此外,这似乎是一个基于数学的问题,即可能在math.stackexchange上找到更好的答案。 – James 2010-08-17 15:38:49

回答

1

如果你从新的旋转减去旧的旋转,你会得到一个值,你应该能够用来旋转已经修改的点。请注意,这需要存储旧的旋转,并且越多地翻译它们,坐标越精确,越不准确。不过,这对政府工作来说已经足够接近了。

+0

所以如果ang是3,现在是4,我只需要旋转1种类型的东西? – jmasterx 2010-08-17 15:45:54

+0

@Milo:对。这应该可以。重读有关坐标精度的部分 - 虽然这会发生很多相同的问题,但舍入误差可能会让你感到困惑。 – cHao 2010-08-17 15:48:48

+0

这个误差幅度是否明显可见?我正在旋转矢量绘图应用程序中的多边形。 – jmasterx 2010-08-17 15:50:49

1

所以,而不是存储前一点,你宁愿保存先前的角度?

也许我可以阻止你这样做。与其保持两个浮点数的结构不同,你会保持一个浮点数(角度),但增加应用程序的复杂性,获得很少的收益。

在6个月内重新访问该代码,您会想知道为什么您一直用三角函数来处理一个浮点数。

我的2¢。这是一个有趣的触发问题:)

+0

不,它不只是保存2个漂浮,它不会是只有1点,它可能是几千,这意味着在按下鼠标复制千点,然后修改首次鼠标移动,原稿,然后重新复制旧的,然后对其进行修改等,它的很多... – jmasterx 2010-08-17 15:44:24

+0

哦,这是一个多边形!我懂了。那么,是的,cHao有权利。 – MPelletier 2010-08-17 16:11:24