2014-09-28 93 views
2

我有下面的代码是一种把ImageView的并旋转它在它的父触摸:转换弧度度

override func touchesMoved(touches: NSSet, withEvent event: UIEvent) {        
    var touch: AnyObject? = event.allTouches()?.anyObject() 
    var location = touch!.locationInView(touch!.view) 

    var dx: Float = Float(location.x - hsbWheel250ImageView.center.x) 
    var dy: Float = Float(location.y - hsbWheel250ImageView.center.y) 
    var radians = atan2f(dy, dx) 

    //deltaAngle is set in touchesBegan 
    var angleDiff = deltaAngle - radians 
    hsbWheel250ImageView.layer.transform = CATransform3DMakeRotation(-angleDiffCGFloat, 0, 0, 1) 

    //This is where my problem is 

    var angleDiffCGFloat = CGFloat(deltaAngle - radians) 
    var angleInDegrees = angleDiffCGFloat * (180.0/Float(M_PI)) 
    println(angleInDegrees) 

    //For the first 180 degrees of the rotation angleInDegrees returns the correct 
    //number i.e. 0-180. But then after 180, where it should return 181, 
    //it returns -179. Where it should return 270 it returns -90 and so on 
    //and so forth.. 

我一直在试图谷歌在我的方式,但唯一的解决办法的人(从弧度转换为度数时)是上面那个......我认为这只是一个数学问题,但恐怕我的大脑已经关闭了这个问题。

任何帮助,非常感谢。

ANSWER 对于那些有兴趣,答案是下面

var angleInDegrees = fmodf(360.0 + -angleDiff * (180.0/Float(M_PI)), 360.0)

+0

#1不是一个论坛。既然您已经回答了您的问题,请将答案作为实际答案加入,而不是编辑您的问题。 – dandan78 2014-09-28 08:32:42

回答

3

atan2f返回主角度,其具有范围从-π到+π(-180到+180度)。您可以显式处理负值或使用fmodf将角度强制到所需范围内,例如,改变:

var angleInDegrees = angleDiffCGFloat * (180.0/Float(M_PI)) 

到:

var angleInDegrees = fmodf(360.0 + angleDiffCGFloat * (180.0/Float(M_PI)), 360.0); 
+0

这给了我以下值: 什么应该是0; -0; 90应该是-90; 180 = -180; 270 = -270; 然后到+ 89(本来应该是+271)? – Chris 2014-09-28 08:16:29

+0

我的不好 - 见上面的编辑。 – 2014-09-28 08:18:41

+0

以下工作:'var angleInDegrees = fmodf(360.0 + -angleDiff *(180.0/Float(M_PI)),360.0)'我需要将360添加到负角度DiffCGFloat ...否则它会给我倒序的度数。感谢您的帮助@Paul R – Chris 2014-09-28 08:22:39