2012-01-11 35 views
2

我正在研究一個具有旋轉圖像的應用程序(用戶可以拖動和拖動圖像並旋轉以跟蹤他們的手指)。我試圖追蹤的是用戶完成一次完整循環的次數。額外的「順利」是我還需要知道用戶是否順時針方向繞順時針旋轉。如何跟蹤iOS應用中圖像的完整旋轉次數?

以下是旋轉圖像的代碼...請隨時索取更多信息。

- (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

你只對完整的旋轉感興趣嗎? – rishi 2012-01-11 16:56:46

回答

1

我的解決方案是不優雅,有可能是一個清潔的解決方案,我缺少的,但是這是我最近。訣竅是跟蹤上次調用的角度touchesMoved:。然後,將當前角度的增量和存儲的角度值添加到總數中。

問題是atan2創建需要難看的代碼來克服的「邊界」。說你lastAngle是359和你過原點,以便下次角度是其區別將是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的標準-π到π更好。

0

要找出旋轉總數是多少,只需在任一方向上對所有旋轉角度求和即可。對於順時針旋轉角度的值將是正值,而對於順時針,它將是負值。然後用pi(〜3.14)除以得到你的總旋轉次數。

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

然後,每當你想獲得充分的轉數:

double numberOfRotations = floor(totalRotationsAngle/M_PI); 
+0

這是不正確的。 Atan2不會根據計數器/順時針方向給出+/-值。它給出了一個介於{-pi,pi}之間的值(單位圓的上半部爲正值,下部爲負值)。此外,通過始終添加完整角度,您只需採取更接近實際角度旋轉因子的東西(並不完全是因爲事件不會觸發每個度數)。 – Kevin 2012-01-16 20:56:36

+1

+1給凱文.... – James 2012-01-16 20:58:39