有两种观点:
viewA
和viewB
。两者都是旋转的。
旋转坐标系很奇怪:它从0到179,999999或-179,99999度。所以基本上179,99999和-179,99999非常接近!
我想计算这些旋转之间的度数或弧度。
例如:
viewA以20度旋转
viewB以30度旋转
我可以这样做:rotationB - rotationA = 10。
但这个公式有问题:
viewA旋转179度 viewB旋转-179度
会出错:rotationB - rotationA = -179 - 179 = -358
358是完全错误的,因为它们在现实中非常接近。所以我可以做的一件事就是检查绝对结果值是否大于180,如果是,则以相反的方式计算它以获得短的真实delta。但我觉得这是完全错误和错误的,因为可能存在浮点错误和不准确。因此,如果两个视图在179,99999999999度旋转基本相同,我可能会得到一个奇怪的180或0如果我很幸运。
也许有一个天才风格的数学公式与PI,正弦或其他有用的东西来解决这个问题?
答案 0 :(得分:2)
编辑:原始答案(与Mod)错了。在某些情况下会给出180 - 正确的答案(例如,角度30和-20会给出130的答案,而不是50的正确答案):
所有情景的两个正确答案:
如果A1
和A2
是两个角度(介于-179.99999和179.99999之间,
而Abs
意味着取绝对价值,
它们之间的角距离表示为:
Angle between = 180 - Abs(Abs(A1 - A2) - 180)
或者,使用C风格的三元运算符:
Angle between = A1 < 180 + A2? A1 - A2: 360 + A1 - A2
答案 1 :(得分:0)
让我们再试一次:
A和B之间有两个角度。其中一个是
θ 1 = A - B
另一个是
θ 2 = 360 - θ 1
所以只需要考虑这两个中的最小值。
答案 2 :(得分:0)
根据您最近提出的问题判断,您可能需要阅读unit circle。这是三角学中的一个基本概念,它是在使用CGAffineTransforms或CATransform3D进行旋转时如何计算角度。
基本上,单位圆圈从0到360度,或0到2 * pi(M_PI是iPhone上使用的常量)弧度。任何大于360度的角度都与该角度减去360度的倍数相同。例如,740度与380度相同,与旋转的东西的结束位置相差20度。
同样,负度也与你为它们添加360度的倍数相同。 -20度与340度相同。
这些计算背后没有任何魔力,你只需注意什么东西越过圆圈上的0/360度点。在您描述的情况下,您可以将360添加到任何负值,以正角度表示它们。当减去角度时,如果结束角度小于起始角度,您可能还需要在结果中添加360以考虑穿过单位圆上的零点。
答案 3 :(得分:0)
除了Brad Larson's excellent answer之外,我还要补充一点:
CGFloat adjustAngle(angle) { return fmod(angle + 180.0, 360.0); }
...
CGFloat difference = fmod(adjustAngle(angle1) - adjustAngle(angle2), 360.0);
答案 4 :(得分:-1)
采取差异,添加360,并按360修改。