5

SOにはカーブフィッティングの質問がたくさんありますが、探しているものに対応する質問が見つからないようです。

シナリオは単純です。タブレット画面で X/Y ポイントをキャプチャします。結果の線分を、一連の線分ではなく滑らかな曲線として描きたいと思います。多くのアプリがこれを行います。たとえば、最後から 2 番目( 0:36 のスケッチ デモ) やAutodesk Sketchbookなどです。

ベジエ曲線アルゴリズムは、一定数の点を使用して曲線を描くため、多数の複数点ではうまく機能しないようです。誰でもこれをうまく行うアルゴリズムを指摘できますか?

4

2 に答える 2

4

Fit-Curveはスプラインであり、実際にはベジェ曲線ではありません。ただし、ベジェ曲線をスプラインのように見せることはできます(スプラインにはコントロールポイントがありません)。私はこの問題について多くのことを検索し、複雑すぎるアルゴリズムを自分自身に導入/実装しましたが、最終的に、タスクが思ったよりもはるかに簡単であることがわかりました(私はそうしなければならないと感じました、誓います:))

これがその最も良い説明です、私はこの記事からの抜粋を取ります:

ほとんどの実装では、ベジェ曲線描画関数は2つの制御点と1つの点自体(セグメントの場合)を引数として取るため、必要なのは新しいセグメントの制御点を繰り返し見つけることだけです(最後のセグメントを更新するのが最善だと思います。すべての新しいポイントの曲線の終わりに新しいものを描画します):

ここにJavaScriptコードがあります(t最も単純な場合は、曲線が一定の滑らかさです)。

function getControlPoints(x0,y0,x1,y1,x2,y2,t){
    var d01=Math.sqrt(Math.pow(x1-x0,2)+Math.pow(y1-y0,2));
    var d12=Math.sqrt(Math.pow(x2-x1,2)+Math.pow(y2-y1,2));
    var fa=t*d01/(d01+d12);
    var fb=t*d12/(d01+d12);
    var p1x=x1-fa*(x2-x0);
    var p1y=y1-fa*(y2-y0);
    var p2x=x1+fb*(x2-x0);
    var p2y=y1+fb*(y2-y0);  
    return [p1x,p1y,p2x,p2y];
}

必ず記事を読んで理解してください。これが最良で、最短で、最も明確な記事だと思います。

于 2011-09-27T18:53:02.977 に答える
0

スプラインをチェックしてください。それらは基本的に一連の制御点を入力として取り、各曲線が前の曲線に接して滑らかな輪郭を与える一連の 3 次曲線を出力します。

これを参照してください: http://en.wikipedia.org/wiki/Cubic_Hermite_spline

于 2011-08-27T00:37:59.993 に答える