我正在开发一款具有旋转图像的应用程序(用户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);
}
感谢您的帮助!
答案 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);