2013-10-07 24 views
7

私は、キュービックベジェの4つのコントロールポイントを得るためにカーブに沿っていると知られているx、y座標のリストをプラグインできるアルゴリズムを探していましたが、明らかに見つけられませんでしたカーブが吐き出される。ベジェ曲線の制御点をその曲線に沿った点から派生させるためのアルゴリズム?

もっと正確に言えば、カーブの始点と終点を決定する2つのコントロールポイントを含む一連の離散ポイントを入力しながら、カーブを整形するために必要な2つのコントロールポイントを与えるアルゴリズムを探しています。

ありがとうございます!

編集:さて、数学のために、古い敵のために、私は多項式関数に最適なベジェ曲線を求めなければなりません。

答えて

9

したがって、エンドポイントが固定されていると仮定して、3次ベジェに収まるようにいくつかの(x、y)サンプルポイントがあるとします。

あなたが持っているサンプルポイントの数によって、どのようなアプローチをとるかが決まります。のは、いくつかの例を通して見てみましょう:

2ポイント

2のサンプル点は最も単純なケースです。あなたが終点を数えれば、それはあなたに合計4点を与えます。これは、3次ベジェのCVの数です。これを解決するには、両方のサンプルポイントのパラメータ(t)値が必要です。次に、解く必要がある2つの方程式と2つの点のシステムがあります。方程式は、選択したt値でのベジェ曲線のパラメトリック方程式です。

tの値は任意ですが、1/3と2/3のどちらかを使用するか、データに応じて相対距離やベースラインに沿った相対距離を使用すると、より良い結果が得られます。

1ポイント

これは、あなたが独自に自由のすべてのあなたの程度を決定するのに十分な情報を持っていることを除いて、2ポイントに似ています。私が示唆しているのは、2次ベジェをフィットさせ、次数を上げることです。私はthis questionに二次フィッティングの詳細な例を書いた。この場合、2点

より

より、一意の解は存在しません。私は良い結果を持つ最小二乗近似を使用しました。手順は次のとおり

  • がマトリックス随意
  • ソルバー最小二乗有するマトリックスを解決フェアリングまたはいくつかの他の平滑化関数
  • を追加する方程式のシステムを構築し、各サンプルについて

    • ピックt値このfree cagd textbookでこれらのステップの適切な説明があり

    、第11章、それはBスプラインをフィッティングについて語ったが、三次ベジエはBスプライン(ノットベクトルが0,0,0であるのタイプです1,1,1 4点あります)。

  • +0

    クイックアンサーに感謝します。私は代数が必要になるだろうと思ったが、カーブが何千もの点を持つことができれば、少しばかげてしまうかもしれない。大きな曲線を小さな曲線に分割し、2点法を適用しようとします。もしうまく動かない場合は、2点以上を試してみてください! – Everlag

    +0

    曲線の正確さがそれほど問題にならない場合は、2点を選んで2点法を試してみることができます。:) – tfinniga

    +0

    sobel演算子で隔てられたエッジの適切なレクリエーションを目指しています。もっと好ましい。 – Everlag

    4

    のように、あなたは4点が必要なベジェ曲線を定義するには(x)の

    あなたが曲線y = fであるとしましょう: P1xと、P1Y、P2xの、P2Y、P3X、P3yとP4xをとP4yを

    P1とP4は曲線の始点/終点です。 P2およびP3は制御点である。 カーブの開始点と終了点はすでにわかっています。あなたはP2とP3を計算しなければなりません。 x座標P2xとP3xは、曲線のtを例えば1/3と2/3に選択して選択するだけなので、簡単です。だからあなたはP2xとP3xを持っています 次に、2つの方程式と2つの未知数(P2yとP3y)のシステムになります。 は、あなたがこのようなもので終わるいくつかの数学をクランチした後:

    (私のf(x)はまた、私はまさにそれに1本の立方ベジエ曲線にフィットすることができるだろうことを保証三次多項式であった。)

    /** 
        @params {Object} firstPoint = {x:...,y...} 
        @params {Object} lastPoint = {x:...,y...} 
        @params {Object} cubicPoly Definition of a cubic polynomial in the form y=ax^3+bx^2+c. 
        Has a method EvaluateAt, which calculates y for a particular x 
    
    */ 
    var CalcBezierControlPoints = function(firstPoint, lastPoint, cubicPoly) { 
        var xDiff = lastPoint.X - firstPoint.X; 
        var x1 = firstPoint.X + xDiff/3.0; 
        var x2 = firstPoint.X + 2.0 * xDiff/3.0; 
    
        var y1 = cubicPoly.EvaluateAt(x1); 
        var y2 = cubicPoly.EvaluateAt(x2); 
    
        var f1 = 0.296296296296296296296; // (1-1/3)^3 
        var f2 = 0.037037037037037037037; // (1-2/3)^3 
        var f3 = 0.296296296296296296296; // (2/3)^3 
    
        var b1 = y1 - firstPoint.Y * f1 - lastPoint.Y/27.0; 
        var b2 = y2 - firstPoint.Y * f2 - f3 * lastPoint.Y; 
    
        var c1 = (-2 * b1 + b2)/-0.666666666666666666; 
        var c2 = (b2 - 0.2222222222222 * c1)/0.44444444444444444; 
    
        var p2 = {}; 
        var p3 = {}; 
        p2.X = x1; 
        p2.Y = c1; 
    
        p3.X = x2; 
        p3.Y = c2; 
    
        return ([p2, p3]); 
    } 
    
    関連する問題