前回の記事では判別すべきは「円なのか往復運動なのか」では無く「プレーヤーは直線を入力しようとして いるのか、曲線を入力しようとしているのかを判別すべき」と言うことを提示して終わりました。
この事はつまり「マウス操作の全てからどの様な図形を入力されたかを判別」しても無意味で逆に「ごく短い時間(1秒とか0.5秒とか)のプレーヤーの入力を判別すれば良い」と言うことになります。

さて今回は当方が、
プレーヤーが入力しようとしているのは「直線なのか曲線なのか」を知るための、アイディアに至る過程をご紹介します。
ただし、実際にこの方法が良いか、または採用するかはまだ完全に結論を出したわけではないのでここでは触れないことにします。

それでは説明の前に、判別すべき動作をもう一度確認しておきましょう。

  1. マウスで円運動=グリグリするループアニメを表示
  2. マウスで直線(往復)運動=ピストン運動のループアニメを表示

前提としてプレーヤーは故意に上記1、2から外れた動作はしない(するかもしれないが、結局は円、直線のどちらかにマッピングされるのでプログラムとしては実害は無い)事とします。
また、前回記事から導き出された仕様として

  • 円運動を検出するのではなく曲線の入力を判別する

そしてこの事から下記の仕様が導き出されます。

  • 直線運動でなければ曲線運動である。

つまり、マウスの動きをトレースして直線でなければ全て曲線であると言う極めてシンプルな仕様に収束する事が出来ると言うことです。
それではどの様にすればプログラムで、限られた時間内のマウスの動きが直線なのかを判別することが可能なのでしょうか。

直線判別のアイディア その1

角度を比べる

まず最初に思いついたのは。角度を比べるという方法でした。
マウスの入力は一定の間隔(1/1000から1/500秒程度)で位置を取得しそこから
3つの点を取りその角度を比較すると言う方法です。
しかし、この方法では下記のような場合に対応できないことがわかりました。

角度だけでは移動スピードが反映されないので判別できない場合がある

直線判別のアイディア その2

ベクトルを使う

ベクトルは角度と移動距離をあわせた概念で、これを使えば上記のように角度は同じだが移動距離(スピード)が違う場合も考慮することが可能になります。

直線判別のアイディアその3

連続したベクトルを比較

連続したベクトルを比較すれば同じ方向に進んでいるかそうでないかが判別できそうです。
上図の下段の例では緩やかな弧を描いていますが実際にはこの様にきれいな入力になる事はほぼありません。
現実的にはベクトルの方向が一定の範囲内に収まっていれば直線とし、それ以外は曲線とみなすと言う考え方が良いと思います。