2014-02-20 284 views
0

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

enter image description here

其中:

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

所以我在下一步计算角度:

Fistly,我得到的三角形边长:

 
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 = arccos ((AO^2 + CO^2 - AC^2)/(2 * AO * CO))

它的工作原理,但这种计算一下太复杂兼顾我需要重复所有OnMouseMove调用。

所以我的问题 - 有另一种方法来计算角度?我用C++编写它,所以一些代码片段将被赞赏。

回答

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)

0

使用向量OA和OC的点积乘以它们的大小来计算角度的余弦,然后使用函数来查找角度。

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