我正在开发一款具有旋转图像的应用程序(用户点击并拖动,图像会沿着他们的手指旋转一圈)。我想要跟踪的是用户完成了多少次完整的圆圈。另一个“障碍”是我还需要知道用户是顺时针还是逆时针转圈。
这是旋转图像的代码...请随时索取更多信息。
- (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);
}
感谢您的帮助!
最佳答案
我的解决方案并不优雅,我可能还缺少一个更简洁的解决方案,但这是我最近所做的。诀窍是跟踪自上次调用 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 的标准 -π 到 π 更好地解释了顺时针/逆时针运动。
关于iphone - 如何跟踪 iOS 应用程序中图像的完整旋转总数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8822891/