私はすでにこれを解決する最も単純なアプローチに触れたと思います。
キャンバス上に白黒の画像がある場合、mousemove
イベントハンドラを要素に付けて、カーソルの位置を追跡できます。ユーザーがleft-mouse
を停止している場合、それらが現在事前定義されたパスをトレースしているかどうかを判別する必要があります。ユーザーには迷惑をかけないように、ピクセルの小さなウィンドウをサンプリングすることで問題のこの部分にアプローチします。 9x9 pixels
の周りの何かは、おそらく良いサイズでしょう。ウィンドウのサイズを両方のディメンションでodd
にして、両方向で対称サンプリングを行うようにしてください。
カーソルの位置を使用して、キャンバスにgetImageData()
を呼び出します。関数の呼び出しは次のようになります:getImageData(center_x - Math.floor(window_size/2), center_y - Math.floor(window_size/2), window_size, window_size)
これで、カーソルの真中にピクセルのサンプルウィンドウが表示されます。そこから、非白色のピクセルがウィンドウ内にあるかどうかを簡単に確認することができます。または、パス上でユーザーを宣言するために、より厳密で非特定の数の非白色ピクセルが必要な場合もあります。
この作業をうまく行うための鍵は、ユーザーがパスから最も細かいビットを逸脱したときに、ユーザーが否定的なフィードバックを受け取らないようにすることです(そうでない限り)。その時点で、ユーザーは迷惑と不満を感じる危険があります。
最終的に2つのアプローチのうちの1つになります。アプリケーションの実際のベクトルパスをロードして、ユーザーのカーソルを比較します(つまり、point-in-path
のチェックを行う)、または画像からピクセルデータをサンプリングします。 point-in-path
チェックの完全な精度が必要ない場合は、ピクセルサンプリングがうまく動作するはずです。
編集:私はちょうどあなたの質問を再読み込みしてgetPixel()
をご参照に基づいて、あなたはこのためのWebGLを使用している場合があります、ということに気づきました。 WebGLのアプローチは、あなたがもちろん異なる機能を使用することを除いて同じです。しかし、WebGLを必要とする必要はないと考えていますが、2Dコンテキストは十分な柔軟性を持たなければなりません(アプリケーションがそれよりも複雑でない限り)。
ありがとうございました。WebGLなどを使用していない瞬間に、どういう仕組みになっているか、頭を悩ませようとしています。あなたの解決策は行く方法に見えます! もう一度おねがいします! – RJobber
@RJobber大歓迎です。また、SOにようこそ! :) – Xenethyl