2016-06-01 1 views
1

私は単純な問題だと思いました。私は自分の胸にiphoneを着ている被験者を持っています。彼らは数フィート歩いて180度回転する必要がありますが、私はマガジンの方位を使用していますが、コンパスが「転がる」と、つまり359から1または1から359になると、混乱します。私はスイッチやものを入れてみましたが(下のコードを参照してください)、それでも動作しません。私は他の人が前にこれに直面したと確信しています。任意のアイデア、トリック、テクニック?おかげさまで iOSコンパスロールオーバー計算

// Turn completion logic here 
if (self.firstTimeInTurnCheckingOne) { 
     self.firstTimeInTurnCheckingOne = FALSE; 
     self.startingCompass = newHeading.magneticHeading; 
     self.lastCompass = newHeading.magneticHeading; 
     self.currentCompass = newHeading.magneticHeading; 
     NSLog(@"First time in: %f", self.startingCompass); 
} 

NSLog(@"Before roll check - start: %f Last: %f current: %f", self.startingCompass, self.lastCompass, self.currentCompass); 

// check to see if compass rolled over 
if (!self.compassRolled) { 
     if ((fabs (self.lastCompass - self.currentCompass) > 340)) { 
     NSLog(@"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@it rolled %f %f", self.lastCompass, self.currentCompass); 
     self.compassRolled = TRUE; 
     if (self.currentCompass > self.lastCompass) { 
      self.currentCompass = self.currentCompass - 360; 
      self.startingCompass = self.startingCompass - 360; 
      self.rolledDown = TRUE; 
      NSLog(@"Rolled Down"); 
     } else { 
      self.currentCompass = self.currentCompass + 360; 
      self.startingCompass = self.startingCompass + 360; 
      self.rolledUp = TRUE; 
      NSLog(@"Rolled Up"); 
      } 
     } 
} 

self.lastCompass = self.currentCompass; 
NSLog(@"After roll check - start: %f Last: %f current: %f", self.startingCompass, self.lastCompass, self.currentCompass); 
NSLog(@"Difference: %f", fabs(self.startingCompass - self.currentCompass)); 


if (!self.turnOneComplete) { 

     if ((fabs (self.startingCompass - self.currentCompass)) > 120) { 
      NSLog(@"Turn Calc: %f", (fabs (self.startingCompass - self.currentCompass))); 
      NSLog(@"Turn One Complete"); 
      self.turnOneLabel.hidden = NO; 
      self.turnOneComplete = TRUE; 
      self.compassRolled = FALSE; 

      self.startingCompass = newHeading.magneticHeading; 
      self.lastCompass = self.startingCompass; 
      self.currentCompass = self.startingCompass; 
      NSLog(@"Turn One complete setup: %f", self.startingCompass); 

     } else { 
      // do something here 
     } 

答えて

0

一瞬のために確保180º設定し、より一般的な要件を想像:あなたは、ユーザが変わった程度の数を返し、答えは度で、任意の数のために正しいものでなければならないコードを書く必要があります。

ユーザーが720度に変わった場合、結果はおそらく0度になるため、現在の方法は機能しません。この実装では、初期状態(startingCompass)と最終状態(currentCompass)だけを格納することで情報が失われるため、ロールオーバーを考慮する方法はありません。

ユーザーの見出しが変更されたときに継続的に増減するアキュムレータ変数を定義するだけです。十分に高い頻度でタイマーを開始し、各タイマーで、今と前のティックとの間の見出しの差を計算する。その値をアキュムレータに追加します。

+0

ありがとうございました。私はまだコンパスが転がったとき何をすべきかに固執しています。私はあなたの提案を理解していますが、固執ポイントはロールオーバです - コンパスが359から1になるとき、アキュムレータ変数を2増分します。 – SlimPickens

+0

359から1になるのはなぜですか?それは0を通過してはいけませんか?時計が11:59から12:01にジャンプしない – aednichols

+0

はい、最初にゼロになります。私はちょうど例を使用していた – SlimPickens