- PR -

C# ドラッグ&ドロップ中か否か取得

投稿者投稿内容
とっちゃん
大ベテラン
会議室デビュー日: 2005/07/19
投稿数: 203
投稿日時: 2007-02-14 12:27
引用:

有末 清華さんの書き込み (2007-02-14 01:47) より:

>>#おいらなら、何もしてない時に一定の動作をすることでジェスチャーとしますがw
具体的にどんな意味でしょうか?ちょっと参考になりそうな気がするんで教えていただけないでしょうか?


ジェスチャーは一定の動作(たとえば、マウスが一定の時間内に左に行って右に行くとか)で発動となるわけですよね?(どんな操作を想定してるかわかりませんけど)

おそらく、今問題になってるのはいつを開始点とするか?だと思います。
「想定された動作が一定時間内に行われた」に変更すればいいだけではないでしょうか?

えらいのんびりとした動作でジェスチャーというのはあんまり考慮する必要はないといえます(とはいえどのくらいの時間をジェスチャーしたに割り当てるかは難しいですがw)。

任意タイミングでの挙動でも認識できるようになれば、あとは
「それが一定時間内に行われていた」&&「操作中にボタン操作&キー操作がなかった」
ということがわかれば、認識自体はできるのではないかと思いますけど?

古いマシンでとなると、カリカリにチューニングしないとだめとかは出るかもしれませんが、それ以前にC#でグローバルフックとかのほうがずっと問題なわけでw


#図形認識にもなんだったかのアルゴリズムがあったと思います。
#あんまり得意じゃないというかそっち関係全然なんでわかりませんけどww
有末 清華
ベテラン
会議室デビュー日: 2006/10/09
投稿数: 52
お住まい・勤務地: 北海道
投稿日時: 2007-02-14 19:19
えっといまは WH_MOUSE_LL を使ってグローバルフックをしてC++で書いた killmsg.dll ってので KillOnce っての呼び出して右クリックを上げた処理をフックして消してます(マウスジェスチャーが成功した場合のみ)

ジェスチャーの仕組みは Neural Network を使って書かれた図形の各ポイントからどの程度サンプルの図形に近いかを計算して規定値以内ならば認識という形です、だから別に早くかかなくてもゆっくり書いてもいいわけで…

うーん Neural Networkも実際まだあんまりできてないし大変だ(苦笑
_________________
有末 清華
crazy(){for;;{you();}} - プログラマの覚書
とっちゃん
大ベテラン
会議室デビュー日: 2005/07/19
投稿数: 203
投稿日時: 2007-02-14 21:17
引用:

有末 清華さんの書き込み (2007-02-14 19:19) より:

えっといまは WH_MOUSE_LL を使ってグローバルフックをしてC++で書いた killmsg.dll ってので KillOnce っての呼び出して右クリックを上げた処理をフックして消してます(マウスジェスチャーが成功した場合のみ)


現状では、右ダウンをトリガーにしているので、そのメッセージ以後、一定量(どのくらいなのかはわかりませんが)の動きを見てジェスチャーであるという判定になっているわけですよね?

これを、マウスがキャプチャーされていない&&ボタンが押されていないという状態&&一定時間動きがないをトリガーとすれば、いけませんかね?
どのくらいの時間を一定時間とするかは難しいところ(ユーザーによる違いもあるので、おそらくは、何らかの設定が必要になるとは思いますが)ですがw

要は、トリガーをどうするか?という部分なので、これをユーザーが何かを行うではなく、いきなりジェスチャーを始めるという形にできれば
かなり理想形に近くなるのではないかと。

とはいえ、言うは易しの典型なところでもあるので、どういう形で実装していくかは開発者の腕の見せ所となるわけですが...w
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-02-14 21:57
 八方向に丸めないと、辛くありません?5度で横に移動と、10度で横に移動。ジェスチャーを描く人が区別できますか?
 とすると、丸めた後に移動方向だけに注目すると、/RU |U \LU −L /LD |D \RD −R と動くと、マルと判断できますよね?

 Symbol Commander<sensiva.com> は、ご存じ?日本語はこっち<panda.co.jp>。これは、パスを描いてシンボルを定義できます。でも、下手な定義をすると、使う方は大変(昔はフリーだったのよ)。
 日本では「マウ筋」とかいうのがあるらしい。

_________________
有末 清華
ベテラン
会議室デビュー日: 2006/10/09
投稿数: 52
お住まい・勤務地: 北海道
投稿日時: 2007-02-15 00:10
引用:

現状では、右ダウンをトリガーにしているので、そのメッセージ以後、一定量(どのくらいなのかはわかりませんが)の動きを見てジェスチャーであるという判定になっているわけですよね?



ちょっと違います、ことばにするよりコードにしたほうがわかりやすいと思うのでそうします(言葉の説明が下手なんですorz)
コード:
OnMouseDown()
{
    if(e.Button == MouseButton.Right)
    {
        points = new List<Point>();
        points.Add(new Point(e.X,e.Y));
    }
    else
        points = null;
}
OnMouseMove()
{
    if(points != null)
    {
        points.Add(new Point(e.X,e.Y));
        // デスクトップにポイントの集合体からカーブを描く
        SketchDesktop(points);
    }
}
OnMouseUp()
{
    if(e.Button == MouseButton.Right)
    {
        points.Add(new Point(e.X,e.Y));
        
        // それぞれのジェスチャーに設定されてる
        // ニューラルネットワークに計算をさせる。
        foreach(Gesture gesture in this.gestures)
            gesture.Compute(points);
        
        // 順位づけ(入力されたポイントの集合に近いもの順でインデックスを返す)
        int[] rates = Gesture.Rate(this.gestures);
        
        Gesture winner = this.gestures[rates[0]];
        
        // 勝者のエラーが0.0000001より小さい場合は同じ図形と決定
        if(winner.Error < 0.0000001)
            // 何らかのアクション
            DoSomething();
    }
    points = null;
}


みればわかると思いますが要点だけ書き込んだコードです。動きません。

とりあえずMouseDown -> MouseMove -> MouseUpでジェスチャー終了です。

引用:

これを、マウスがキャプチャーされていない&&ボタンが押されていないという状態&&一定時間動きがないをトリガーとすれば、いけませんかね?
どのくらいの時間を一定時間とするかは難しいところ(ユーザーによる違いもあるので、おそらくは、何らかの設定が必要になるとは思いますが)ですがw



なんのトリガーのことを言っているのかよくわかりません(僕の語学力不足orz)ジェスチャー起動(終了)のトリガーですか?

引用:

とはいえ、言うは易しの典型なところでもあるので、どういう形で実装していくかは開発者の腕の見せ所となるわけですが...w


結局…ねw

引用:

八方向に丸めないと、辛くありません?5度で横に移動と、10度で横に移動。ジェスチャーを描く人が区別できますか?


いえ、普通に絵を描く系なのに八方向アルゴリズム使ってるので、調整がすごいんだなという意味ですw 僕の場合パターン認識システムで認識するようにしてるからどんな丸でも(理論上)OKですが、八方行だと認識できないじゃないですか(でも、それって書くほうが直せばいいことか…)

引用:

Symbol Commander<sensiva.com> は、ご存じ?日本語はこっち<panda.co.jp>。これは、パスを描いてシンボルを定義できます。でも、下手な定義をすると、使う方は大変(昔はフリーだったのよ)。
 日本では「マウ筋」とかいうのがあるらしい。


そのようなものです、僕のも。たぶん似た様なシステム使ってるんだと思いますけど(たぶんあっちのがいいw) ちなみに「マウ筋」は八方向システムですよたしか(四方向かも?)
_________________
有末 清華
crazy(){for;;{you();}} - プログラマの覚書
とっちゃん
大ベテラン
会議室デビュー日: 2005/07/19
投稿数: 203
投稿日時: 2007-02-15 12:31
引用:

有末 清華さんの書き込み (2007-02-15 00:10) より:

とりあえずMouseDown -> MouseMove -> MouseUpでジェスチャー終了です。



ダウン->アップまでの一連の動きをキャッシュしてジェスチャーチェックってことですね。
だとすると結構改造きつくなるなぁ。。。<おいらの言ってるパターン

今の状態は、一定区間(ボタンが押されてる間)の動きをとりこんで、その内容を見てジェスチャーか?を識別しているということですね。
私の言っていたのは、
引用:

マウスがキャプチャーされていない&&ボタンが押されていないという状態&&一定時間動きがないをトリガーとすれば、いけませんかね?


で開始(ダウンに相当する)とし、とりあえず判定できそうだと思えるくらい取り込んだ時点で(アップの部分を量で決める)
リアルタイムにジェスチャーをチェックしていくという形になります。

画面サイズや、ユーザーの操作を考慮すれば、算出基準の座標点はそれほど多くを必要とはしませんので
ある程度(距離によっては数点程度でもよい)の量を取り込んだところで、検査。
とりあえずジェスチャーに「なりえる」となった時点で、ジェスチャー候補として軌跡を描く(オプション)
その後の動作も取り込みつつ、最終的に一つのジェスチャーとなるか、NGとなるまで
ひたすら検査と軌跡を描き続ける。
ジェスチャーが一つに絞り込めた時点で、ジェスチャー発動
という形ではどうでしょうか?
ということです。

あるいはジェスチャーするというジェスチャーを前ふりで入れるというのも考えられますね。
そこに至るまでは同じですが、それだけ特別なジェスチャーとしてチェックするという形に
することで、計算量も減らせるし、処理としては単純になります(とはいえリアルタイムチェックは
変わらないのですがw)

これは、連続で丸を3つ書いたらとかそういう普通の操作じゃやらないだろう!というのを当てないとだめですけどw

どういう形をとるにせよ、例示コードと比べれば格段に複雑になることが容易に想像できるわけですが。
#それがゆえに言うは易し...となるw

なので
引用:

八方向に丸めないと、辛くありません?5度で横に移動と、10度で横に移動。ジェスチャーを描く人が区別できますか?


というのも考慮の必要が出てくるのではないかと思います。

演算コストもそれが1回なら無視できるかもしれませんが、連続的に行うということになれば、無視することができなくなります。
無視できないということになると、いかにレスポンスを下げずに処理するか?というような問題も出てきます。

それゆえ、カリカリにチューニングなんていうことが出てくるわけで...
自分自身、すげー難しいことを言ってるのはわかってるんですがね。
これから作るというならそれくらいは想定していないと、シェアは取れませんのでw

スキルアップ/キャリアアップ(JOB@IT)