2

ユーザーは、非常に単純なツール (LMB を押したままマウスを動かす) を使用して、私のアプリでスケッチできます。これにより一連の mousemove イベントが発生し、各イベントでのカーソル位置を記録します。結果として得られるポリライン カーブはかなり密になる傾向があり、記録されたポイントはほぼ 1 ピクセルおきに配置されます。このピクセル化されたポリラインを滑らかにしたいのですが、意図したねじれを滑らかにしたくありません。では、ねじれがどこにあるかをどのように把握すればよいでしょうか。

この画像は、記録された軌跡 (赤いピクセル) と、人間が理解できる「暗黙の」形状を示しています。人々はコーナー近くで減速する傾向があるため、通常、ここでは直線部分よりもさらに多くのノイズが発生します。

ポリライン トラッカー http://www.freeimagehosting.net/uploads/c83c6b462a.png

4

4 に答える 4

1

1つの方法は、真のカーブフィッティングアルゴリズムを使用することです。ベジェ曲線を生成し(正確な端点を使用して、Catmull-Romなどを使用)、最適化して再帰的に細分割します(実際のラインポイントからの距離をコストメトリックとして使用します)。ただし、これはユースケースには複雑すぎる可能性があります。

于 2010-04-27T20:52:31.297 に答える
1

結果のデータからこれを行うのではなく、データが入ってくるタイミングを見ることを検討しましたか? マウスが著しく停止または減速する場合は、最後の「ねじれ」(マウスが最後に減速したとき) 以降のトレンドを使用して、移動方向を確立します。ユーザーが新しい方向に進んだ場合、それをねじれと呼びます。そうでない場合は、現在の減速傾向を無視して、次の傾向を待ち始めます。

于 2010-04-27T20:48:18.723 に答える
1

あなたが説明していることは、ジェスチャー認識技術に関連している可能性があるため、アイデアを検索できます。

明らかなアプローチは、カーブ フィットを適用することですが、これにより、すべての興味深い詳細とよじれが滑らかになります。推奨されるもう 1 つのアプローチは、速度と加速度を調べることですが、それは面倒なことになる可能性があります (方向転換は非常に速くても、非常に遅く意図的に行うこともできます)。

かなり基本的ですが効果的なアプローチは、サンプルをポリラインに直接単純化することです。

たとえば、サンプル (例) をサンプル 1 からサンプル 4 まで調べて、4 つのサンプルすべてが 1 と 4 の間の直線の妥当な誤差内にあるかどうかを確認します。 .5 開始点から終了点までの直線が、これらのサンプルによって定義された曲線の妥当な近似値を提供しなくなるまで繰り返します。前のサンプル ポイントまで線分を作成し、新しい線分の蓄積を開始します。

サンプルが互いに近すぎる場合はしきい値に注意する必要があるため、サンプルが互いに 4 ~ 5 ピクセル未満離れている場合は感度を調整する必要があります。

これにより、元のパスをかなり正確にたどる一連の直線が得られます。

追加のスムージングが必要な場合、またはスケーラブルなベクター グラフィックを作成する場合は、ポリラインからカーブ フィットを行うことができます。最初に、キンク (ある線と次の線の間の角度が鋭いポリライン内の場所 - たとえば、140 度を超えるものは滑らかな曲線と見なされ、それ未満のものはキンクと見なされます) を特定し、それらの不連続点でポリラインを分割します。 . 次に、元のジェスチャのこれらの各サブセクションをカーブ フィットして滑らかにします。これにより、滑らかなものが滑らかになり、キンクがシャープになります。(さらに進んで、これらの鋭い接合部の代わりに小さな滑らかなコーナー フィレットを挿入して、接合部の鋭さを減らすことができます)。

ブルートフォースですが、それはあなたが望むものを達成するかもしれません.

于 2010-04-27T21:38:12.800 に答える
0

ピクセルが描画される順序を記録します。次に、「近い」が「近い」ではないピクセル間の勾配を計算します。ピクセル (i) とピクセル (i+7) の間の勾配のグラフは、曲線のねじれの周りに簡単に識別できる「ジャンプ」を示す可能性があると推測しています。

于 2010-09-29T18:18:14.820 に答える