我在场景上有一个矩形,我想用鼠标旋转它。 矩形有自己的原点。单击场景表示旋转开始,鼠标移动表示旋转角度。
其中:
所以我在接下来的步骤中计算角度:
首先,我得到三角形的长度:
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 ++编写它,所以一些代码片段会被欣赏。
答案 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);