有没有一种快速的方法来计算两个旋转值之间的最小增量?

时间:2010-02-02 15:58:44

标签: iphone cocoa-touch math uikit rotation

有两种观点:

viewAviewB。两者都是旋转的。

旋转坐标系很奇怪:它从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,正弦或其他有用的东西来解决这个问题?

5 个答案:

答案 0 :(得分:2)

编辑:原始答案(与Mod)错了。在某些情况下会给出180 - 正确的答案(例如,角度30和-20会给出130的答案,而不是50的正确答案):

所有情景的两个正确答案:

如果A1A2是两个角度(介于-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修改。