2009-03-14 14 views
1

私はiPhone向けのアプリケーションを開発しています。ユーザーが特定のパスに沿って指を動かしていることを検出したいと思います。マウス/指が特定のパスに沿って移動しているかどうかを検出するにはどうすればよいですか?

具体的には、ユーザーが特定の円形経路に沿って指を動かすときを検出したいと考えています。

これはおそらく、経路に沿ったマウスの動きを検出することから容易に適合されるだろう。

答えて

0

私はiPhone SDK自体に精通していないので、非標準ジェスチャーをキャプチャするための機能が組み込まれているかどうかはわかりません。しかし、あなたがそれを行うことができる手動の方法の一つがここにあります。

This tutorialはFlash用ですが、同じジェスチャー原則で動作します。各方向は数字を表します。ポインティングデバイスで円を描くと、長時間に渡って移動したか、長距離で移動したかを表す数字のシーケンスが生成されます。その数字のシーケンスを、円を表すあらかじめ定義されたシーケンスと比較する。一致する場合は、イベントを発生させます。

このようなジェスチャーを「あいまい」にする方法を説明するチュートリアルがたくさんありますので、精度の低いポイントの動きが必要になります。

1

具体的なケースのように見えるのは、実装がかなり単純です。入力領域を4つの象限に分割し、各象限を介して位置を追跡します。クアンダントの系列は、それらが円で完了したか、または移動したかを決定する。

static touchKeeper; //touch, quadrant 
static touchIndex=0; 
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [[allTouches allObjects] objectAtIndex:0]; 
    touchKeeper[touchIndex].touch = touch; 
    touchKepper[touchIndex].quadrant = DetectQuadrant(touch)); 
    if (touchIndex > 3 && (touchKeeper[3].quadrant == touchKeeper[2].quadrant+1 == touchKeeper[1].quadrant+2 == touchKeeper[0].quadrant+3)) { 
    [self doCircleAction]; 
    touchIndex=0; 
    } 
    else touchIndex++; 
} 

アイデアは、あなたが大まかにしか領域に特定のタッチを識別するために必要があるということです。

擬似コードは、アイデアを説明します。だから、象限ルーチンはこのようなものでしょう:

int DetectQuadrant(UITouch *touch) { 
CGPoint point; 
point = [touch locationInView:self]; 
if (endPoint.x > X1 && endPoint.x < X2 && endPoint.Y > Y1 && endPoint.Y < Y2) 
    return QUAD1; 
} else etc 

私は、一例として、象限を使用する - 明らかにあなたは、正方形を描くと考えることが「円を!」。 Detectメソッドでより多くの領域を作成することで、精度が向上します。主なアイデアは、過度の複雑さ(ベジエ曲線検出または同様のナンセンスのような)なしに所望の挙動を達成するために領域のシーケンスの観点から考えることである。この擬似コードは確かに荒々しく、実装を巧みにする良い方法があると確信しています。私が取り組んでいるプロジェクトでは、「円運動検知」について考えてきましたが、これは私が思いついた大まかなアイデアでした。

お楽しみください!

+0

クレジットの対象となるクレジット。このアイデアは、IBMが文字と手書きの検出に関する論文をベースにしており、研究では文字を識別するために必要な固有の点がいくつかしかないと判断されました。したがって、 'E'をトレースする代わりに、OCRは一番小さいユニークな位置を探すでしょう。 –

関連する問題