0

UIAccelerometer クラスに関するヘルプが必要です。iphoneデバイスを右から左、左から右に振ったときを見つけたり区別したりする方法を見つけたいです。x、y、z 値と間隔値を取得しています。また、通常の物理法則から計算された速度と距離も取得しています。

距離 = (前の距離 + sqrt(pow((前の x - 加速度.x), 2) + pow((前の - 加速度.y), 2) + pow((前の z - 加速度.z), 2)))

Velocity = (Distance * timeintercal) { ここでの distance は、その距離の newdistance-prevdistance と timeinterval を意味します }

iPhone デバイスを右から左、次に左から右に移動すると、一定の間隔で方向と速度の両方で合計距離が移動します。iPhone デバイスを左から右または右から左に移動していることを確認する方法を教えてください。

助けていただければ幸いです。ありがとう。

4

3 に答える 3

1

It depends on which way the user will be holding the device. You don't need the velocity or the distance to figure out which way the device is being swung. Instead, you can keep a history of the past (say 5) accelerations. Assuming that the device is held the normal way (portrait, right-side up), you would use the average of the previous x - accelerations to determine the direction.

So basically what I did is in the accelerometer:didAccelerate event:

//prevAccels is an NSMutableArray
float VAL = .75;
int HISTORY_NUMBER = 5;
if (accleration.x>VAL && acceleration.y>VAL){ //if there has been a sudden jerking motion
        float avgX;
        for (int i = 0; i<[prevAccels count]; i++)
        {
            UIAcceleration *a = [prevAccels objectAtIndex:i];
            avgX += a.x;
        }
        avgX /= HISTORY_NUMBER; //get the average of the previous accelerations

        BOOL flickRight = (avgX<-VAL)?YES:NO;
        //[self wave:flickRight]; //do stuff here
        }

[prevAccels addObject:acceleration]; //add the acceleration to the history
if ([prevAccels count]>HISTORY_NUMBER) [prevAccels removeObjectAtIndex:0]; //trim the list if it is too large

Hope that helps!

于 2010-11-25T04:38:14.390 に答える
1

まず、いくつかの物理エラーがあります。distance加速度計からの加速度値を合計しているため、あなたは「距離」変数ではありません。また、velocity加速度に時間間隔を掛けているため、実際には「速度」変数です。

本当にやりたいことは、acceleration.x を監視して、あらかじめ決められた特定の大きさを超える値がないかどうかを確認することです。この大きさは、ユーザーが iPhone を激しく振る必要がないように十分に低くする必要がありますが、単純な動きがしきい値を超えないように十分に高くする必要があります。もしacceleration.xが事前に決められた閾値以上0よりも大きいなら、あなたは正しく加速しています。もしacceleration.yが事前に決められた量以上0よりも小さいなら、あなたは左に加速しています。

加速度値を継続的に積分する必要があるため、一定期間にわたる電話の速度を決定することははるかに困難です。iPhone の加速度計はそれほど正確ではなく、ノイズが発生する可能性があるため、しばらくすると、アプリケーションはおそらく電話がランダムな方向にドリフトしていると確信するでしょう。また、重力は常に加速度値に表示されることに注意してください。

于 2010-05-20T17:10:51.690 に答える
0

覚えておくべきことの 1 つは、重力が常に加速度計に影響を与えていることです。そのため、これを考慮する必要があります。残念ながら、「ダウン」がどこにあるかを瞬時に知らないため、距離と実際の速度を計算するための単純な方法を期待することはできません。

「左スイング」または「右スイング」が発生するタイミングに注意するには、動きが弧を描いている可能性が高く、スイングが停止したときに反対の加速度が得られることも考慮してください。スイングが進行中であることを知るには、「アウト」加速度ベクトル、たとえば回転の中心から離れた方向を向いているものを見てください。これを使用して、「移動開始」状態と「移動停止状態」を区別できます。そうでない場合、加速度値は等しく反対になります。

于 2010-05-20T17:16:51.317 に答える