如何跟踪iOS应用中图像的完整旋转总数?

时间:2012-01-11 16:29:24

标签: iphone ios

我正在开发一款具有旋转图像的应用程序(用户tapps和drags,图像以跟踪手指的圆圈旋转)。我想要跟踪的是用户完成一个完整的循环次数。另外一个“障碍”是我还需要知道用户是顺时针旋转还是逆时针旋转。

以下是旋转图像的代码...请随时索取更多信息。

   - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{

    UITouch *touch = [[event allTouches] anyObject];
    CGPoint touchPoint = [touch locationInView:self.view];

    long double rotationNumber = atan2(touchPoint.y - originY, touchPoint.x - originX);

    totalRotationCount ++;

    schedulingWheel.transform = CGAffineTransformMakeRotation(rotationNumber);

    offset = (rotationNumber * 100)/14;

    dateRibbon.center = CGPointMake(offset, 24);  
}

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

我的解决方案并不优雅,可能会有一个更清洁的解决方案我不知道但这是我最近所做的。诀窍是跟踪上次调用touchesMoved:时的角度。然后,将当前角度的增量和存储的天使值添加到总数中。

问题在于atan2创造了需要克服的丑陋代码的“边界”。假设您的lastAngle是359并且您越过原点,那么您的下一个角度是1.差异是2但是-358,所以每当你越过那个边界时你的总数将被重置为0.

这是我做的:

 CGFloat angle = atan2f(center.y - point.y, point.x - center.x);

 //Translate to Unit circle
 if (angle > 0) {
     angle = (M_PI - angle) + M_PI;
 } else {
     angle = fabsf(angle);
 }

 CGFloat delta = angle - lastAngle;

 //Adjust for boundaries
 if (fabsf(delta) > (2*M_PI)-fabsf(delta)) {
      BOOL greaterThanZero = (delta > 0);
      delta = (2*M_PI)-fabsf(delta);
      if (greaterThanZero) {
           delta = -1 * delta;
      }
  }

  totalAngle += delta;
  lastAngle = angle;

“调整边界”下的大/丑条件基本上只是看看是否有一个较短的角度来到新点(所以,2而不是-258)&假设如果有,则可能意味着您越过该原点并相应地调整增量。

我翻译了Atan2的结果,使其代表从0到2π的完整单位圆。奖励方影响,然后它比顺时针/逆时针运动更好地比Atan2的标准-π到π。

答案 1 :(得分:0)

要找出旋转总数是多少,只需将两个方向上的所有旋转角度相加。对于顺时针方向,旋转角度的值将为正,而对于逆时针,它将为负。然后用pi(~3.14)除以得到你的总转数。

long double rotationNumber = atan2(touchPoint.y - originY, touchPoint.x - originX);
long double totalRotationsAngle += rotationNumber;

然后,只要你想得到完整的旋转次数:

double numberOfRotations = floor(totalRotationsAngle/M_PI);