计算旋转角度

时间:2014-02-20 04:24:39

标签: c++ rotation geometry

我在场景上有一个矩形,我想用鼠标旋转它。 矩形有自己的原点。单击场景表示旋转开始,鼠标移动表示旋转角度。

enter image description here

其中:

  • O - 旋转点的原点
  • A - 锚点(保存在OnMousePress事件中)
  • C - 当前点(来自OnMouseMove事件)

所以我在接下来的步骤中计算角度:

首先,我得到三角形的长度:

AO = sqrt( (O.x - A.x)^2 + (O.y - A.y)^2 )

CO = sqrt( (O.x - C.x)^2 + (O.y - C.y)^2 )

AC = sqrt( (C.x - A.x)^2 + (C.y - A.y)^2 )

然后我计算角度(a):

a = arccos ( (AO^2 + CO^2 - AC^2) / (2 * AO * CO) )

它有效,但考虑到我需要重复所有的OnMouseMove调用,这个计算看起来太复杂了。

所以我的问题 - 还有另一种计算角度的方法吗?我用c ++编写它,所以一些代码片段会被欣赏。

2 个答案:

答案 0 :(得分:1)

您可以通过标量产品和交叉产品找到 OA OC 之间的角度:

OA = (OA.X, OA.Y) = (A.X-O.X, A.Y-O.Y)
OC = (OC.X, OC.Y) = (C.X-O.X, C.Y-O.Y)
SP = OA * OC = OA.X*OC.X+OA.Y*OC.Y
CP = OA x OC = OA.X*OC.Y-OA.Y*OC.X
Angle = atan2(CP, SP)

示例:O =(0,0),A =(-1,0),C =(-2,1)   SP = 2,CP = -1,角度= -0.463

此方法允许避免sqrt计算,并确定旋转方向(与arccos不同)

答案 1 :(得分:0)

使用矢量OA和OC的点积除以它们的大小来计算角度的余弦,然后使用acos()函数来找到角度。

float cosAngle = (x1 * x2 + y1 * y2) / sqrt(x1*x1 + y1*y1) * sqrt(x2*x2 + y2*y2);
float angle = acos(cosAngle);