2012-01-11 14 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

答えて

1

私のソリューションは、エレガントではないと私は欠けているクリーンな解決策があるかもしれませんが、これは私が最近やったことあります。このトリックは、最後にtouchesMoved:が呼び出されたときの角度を記録することです。次に、現在の角度のデルタと格納されている天使の値を合計します。

問題は、atan2が克服するために必要な醜いコードを作成する「境界」です。ここではそう、あなたの合計を境界たびクロス

0にリセットされます、2が、-358ではありません、あなたの lastAngleは359であり、あなたの次の角を1差ですので、あなたは、原点を横断言うことは何です私がやった:

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; 

「境界のための調整」の下に大きな/醜い条件は、基本的には(代わりに-258のだから、2)新しいポイントを取得するために短い角があるかどうかを検索します&があることを前提としていもしそうなら、おそらくあなたはその起源を越えて、それに応じてデルタを調整することを意味します。

私は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

+1

+1 to Kevin .... – James

関連する問題