CGAffineTransformRotate的Radians值出错了

时间:2013-04-13 16:47:18

标签: ios objective-c uiview rotation uiviewanimation

我在旋转踏板时试图旋转自行车车轮。

当我逆时针旋转时,没有问题。

但是当我顺时针旋转约2-3秒时,图像开始逆时针旋转而不是快速旋转。

当我尝试记录angleInRadians值时: 逆时针旋转时,angleInRadians值最多在-0.05到-0.1之间变化。 angleInRadians值在开始时介于0.05到0.1之间,但突然之间值变为-6.1,-6.2之类的东西。请参阅下面的日志。

我改变了图像的锚点。我不确定这是否重要。

抱歉我的英文和格式不好

- (void) viewDidLoad
{
    [super viewDidLoad];
    self.PedalTurn.layer.anchorPoint = CGPointMake(0.5, 0.6);
}

- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    CGPoint center = CGPointMake(CGRectGetMidX(self.PedalTurn.bounds), CGRectGetMidY(self.PedalTurn.bounds));
    CGPoint currentPoint = [touch locationInView:self.PedalTurn];
    CGPoint previousPoint = [touch previousLocationInView:self.PedalTurn];
    CGFloat angleInRadians = atan2f(currentPoint.y - center.y, currentPoint.x - center.x) - atan2f(previousPoint.y - center.y, previousPoint.x - center.x);
    self.PedalTurn.transform = CGAffineTransformRotate(self.PedalTurn.transform, angleInRadians);
}

Angle in radians: 0.110071
Angle in radians: 0.0984247
Angle in radians: 0.107355
Angle in radians: 0.118767
Angle in radians: 0.121201
Angle in radians: 0.112823
Angle in radians: 0.0899732
Angle in radians: 0.0883234
Angle in radians: 0.105448
Angle in radians: 0.0884745
Angle in radians: 0.0983613
Angle in radians: 0.108684
Angle in radians: 0.119307
Angle in radians: 0.108768
Angle in radians: 0.111302
Angle in radians: 0.145414
Angle in radians: -6.14848
Angle in radians: -6.13048
Angle in radians: -6.12109
Angle in radians: -6.14578
Angle in radians: -6.13917
Angle in radians: -6.11675
Angle in radians: -6.13025
Angle in radians: -6.15015
Angle in radians: -6.14989
Angle in radians: -6.15097
Angle in radians: -6.14732
Angle in radians: -6.15547
Angle in radians: -6.136
Angle in radians: -6.13241

2 个答案:

答案 0 :(得分:0)

我有两点建议:

  1. atan2f会在atan2f(+-0, x)时针对x < 0这样的来电返回+ pi或-pi,因此您可能遇到currentPoint.y和{{1}的问题是&#34;等于&#34;到previousPoint.y但是你在一个案例中获得了center.y而在另一个案例中获得了+0,所以你得到的不是-0 -pi - (+ pi)〜-6.28。如果发生这种情况,那么您可能希望特别处理0currentPoint.y == center.y的情况,即使这意味着仅使用文字0.0调用previousPoint.y == center.y而不是执行算术。

  2. 我的另一个建议是,你根本不会迭代地确定变换。为什么要打扰atan2f并对之前和当前的位置进行算术运算?只需使用当前位置并按照以下方式进行旋转:

    CGAffineTransformRotate(self.PedalTurn.transform,…

    然后,当你经历多次迭代时,你不必担心你的算术变得不稳定。

答案 1 :(得分:0)

atan2的限制是pi,所以当你达到pi的阈值(水平在圆圈的左侧)时,发生的事情是你的lastTouch在第二象限真的接近180度,你当前的触摸在第三象限真的接近-180度。请阅读atan2 http://en.wikipedia.org/wiki/Atan2

根据你的角度在里亚人,179.99 - (-179.99)= 359.98,或大约2pi,这是~6.28。因此,当你达到这个阈值时,你真的会增加接近2pi,这是大约6.xxx的来源。