如果使用弧度它们是相同的,我如何检查两个角度

时间:2015-12-31 10:21:09

标签: swift sprite-kit swift2

我要做的是检查两个节点(对象)是否指向同一方向。但问题是SpriteKit以弧度为单位旋转节点,因此它不断添加到节点的zRotation。

我为轮换所做的是:

if(touched_location.x >= self.frame.size.width/2)
{       
   node1.runAction(SKaction.RotateByAngle(CGFloat(-M_PI_2), 1.0)
}
else if(touched_location.x <= self.frame.size.width/2)
{
   node1.runAction(SKAction.RotateByAngle(CGFloat(M_PI_2), 1.0)
}

所以这会将节点旋转90°,但RotateByAngle会使用弧度,这样就可以了。

但弧度不断添加到zRotation,所以我最终会得到12,45弧度(不准确的数字仅用于参考),这与我比较zRotation的第二个Node(node2)的弧度不匹配。

使用以下方法检查旋转:

var first = CGFloat(round(100*node1.zRotation)/100)
var second = CGFloat(round(100*node2.zRoation)/100)
if(first == second)
{
    do stuff....
}

但是这显然不起作用,因为如果你将旋转节点保持在一个方向,弧度是高的(或者如果是其他方向的话,那么),但在视觉上方向是相同的。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

整圆(360度)的角度为2 * PI,因此0和2 * PI表示相同的“标准化”角度。

import Foundation

func normalizeDifferenceAngleInRadians(a1: Double, _ a2: Double)->Double {
    let twoPi = 2 * M_PI
    return (a2 - a1) % twoPi
}

let a1 = M_PI_2
let a2 = 5 * M_PI_2
let diff = normalizeDifferenceAngleInRadians(a1, a2) // 0

基于马丁的说明

import Foundation

func angleDifferenceInRadians(a1: Double, _ a2: Double)->Double {
    let twoPi = 2 * M_PI
    return -((a2 - a1 + M_PI) % twoPi - M_PI)
}

let a1 = M_PI_2
let a2 = 5 * M_PI_2 + 0.001
let a3 = 5 * M_PI_2 - 0.001
let diff1 = angleDifferenceInRadians(a1, a2) // -0.001
let diff2 = angleDifferenceInRadians(a1, a3) //  0.001

@ 0x141E谢谢!我希望,下面的代码将是我“新年数学练习”的最终和正确实施。有时简单的麻烦和快速纠正会导致更大的麻烦...

func angleDifferenceInRadians(a1: Double, _ a2: Double)->Double {
    let twoPi = 2 * M_PI
    let d = (a2 - a1) % twoPi
    let s = d < 0 ? -1.0 : 1.0
    return d * s < M_PI ? d : (d - s * twoPi)
}