0

ユーザーがキャンバスに描いているものに基づいて、ポイント/ライン検出ソフトウェアを作成しようとしています(これはすべて、Webおよびhtml 5キャンバスを介して行っています)。ユーザーが MouseDown イベントを実行すると、描画のすべてのポイントを保持する配列が作成されます。その後の各 MouseMove イベントは、点 (x, y) を配列にプッシュします。MouseUp イベントは、ユーザーの描画の終了を通知します。これらのポイントを使用して、ユーザーが明確に方向を変えた場所を特定します。次の例を見てください。

上記の方法により、次の順序付けられたポイントのセットが生成されました。

[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 4), (7, 3), (8, 2)]

したがって、これらのポイントに基づいて、ユーザーがポイント (5, 5) 以降で明確に方向を変えたことがわかります。プログラムの結果は、3 つのポイント [(1, 1), (5, 5), (8, 2)] を与えることになります。これは、シーケンスの最初のポイントを使用し、方向の明確な変化を見つけて取得しようとするためです。シーケンスの最後のポイントを使用します。

上記の例は、ポイントの数とそれらが完全に直線上にあるという事実のために、非常に単純化されています。ユーザーが実際にキャンバスに描画しているとき、線は完全にまっすぐではありません。私の目的では、ユーザーは直線的な線を描いており、露骨に曲線を描いているわけではないと想定できます。

上記の情報に基づいて、どのアルゴリズム、方法論などを使用することをお勧めしますか?

編集:タイプミス

4

3 に答える 3

0

ポイント P(i) (i=0 ~ (N-1)) があるとします。ポイントごとに、後向き勾配を P(i)-P(im) として計算し、前勾配を P(i+m) として計算できます。 -P(i)、ここで、m < N。その後、後方傾斜と前方傾斜の間の角度として、Pi での傾斜の回転角度を計算できます。回転角度がしきい値 (たとえば 60 度) よりも大きい場合、進路は急に曲がっています。

m の値の選択は少し難しく、実際のデータ ポイントで少し実験する必要があります。実際、データポイントの密度に何らかの形で依存しています。m が非常に小さい場合 (1 など)、データ ノイズから多くの望ましくない急激な変化を識別できます。m が大きすぎると、急な曲がり角を見逃す可能性があります。もちろん、このアプローチを使用することで、最初と最後の (m-1) ポイントで急激な変化を特定することはできません。

于 2014-12-17T20:31:35.460 に答える
0

ポイントを言うと、順番は [(x1, y1), (x2, y2),..., (xn, yn)] です。連続する点の各セット間の近似導関数を計算します: D1 = (y2-y1)/(x2-x1)、D2=(y3-y2)/(x3-x2) など。派生物。あなたの場合、D1=1、D2=1、D3=1、D4=1、D5=-1、D6=-1、D7=-1 です。縦線を引くとゼロ割りになるので注意が必要です。

于 2014-12-16T20:07:57.097 に答える