2016-04-22 22 views
1

私は現在、ユニークなBスプラインのベースで定義されたパスを使用して作業しています。 Bスプラインは、制御点と結び目の値のセットによって与えられます。コントロールポイントとノットの数は変わる可能性があります(一貫性を保ちます)。Bスプラインに沿った長さ測定

De Boorのアルゴリズムを使用して、カーブ上の位置を評価し、それらの位置の接線値を得ることができました。 これまでのところとても良いです。

ここで、Bスプラインパスに沿って円弧長を測定(近似)する方法は?

+0

こんにちは、スタックオーバーフローを歓迎します。これはちょっとしたことに役立つ新しいメンバーに送るメッセージです。新しいユーザーの学習曲線はそれほど急なものではありませんが、スタックの使用方法を見つけることは必ずしも明らかではありません。しばらく時間を取ってここを見てください。また、ここを見ていくことも重要です。[mcve] ..また、あなたの答えが有効であれば、答えの左側のチェックをクリックしてください質問は回答済みとマークされています – Claudius

+0

De Boorは物事を単純化しますが、それが与えるもの以外の曲線自体についての情報は省略します。 Codorの答えを使用する代わりに(実際のアプリケーションでうまくいく)分析の方法が本当に必要な場合は、実際には基本関数を計算してから、各多項式セグメントに対して分析曲線積分を使用する必要があります。 – Aziuth

+0

はい、| d point(t)/ dt |のt = t_startからt = t_endまでの積分を計算する必要があります。 dt –

答えて

2

数値的には、スプラインに沿っていくつかの等距離点を生成し、Euclidean distancesを測定し、これらの距離を合計します。より多くのポイントが使用されるほど、近似がより正確になります。

+0

私は彼らが等距離にする必要はないと思っていますが、それはおそらくあなたが与えられたポイント数に対して最も正確な答えを得るでしょう。例えば。ユークリッド距離が最大の隣り合った点のペアを繰り返し選択し、それらの中間にパラメータ値を持つ新しい点を作成するだけで十分です(TTBOMKこれは一般的に*新しい点を等距離に置かない*他の2つからの曲線)。 –

+0

確かに、私はそれをやった。最小限の精度を望むならかなり重いです。 (もう一度)私は良い近似を得るためにどんなalgoの特別な財産を見つけることを望みました。 – Gav

0

arc-length of a parametric curve

⌠₁ ________________ 
⎮ √ dx(t)² + dy(t)² dt 
⌡₀ 

あるいは、曲線全体にわたるその接線の長さの整数です。 の場合< - (0,1);均一なパラメータ化。

まず、bspline曲線を合成ベジェスプラインに変換する必要があります。 これは「ノット」(ベームのアルゴリズム)のベジェ曲線の場合 http://www.infogoaround.org/JBook/bstobez.html

を挿入することによって行われ、我々は非常に簡単にすべての点で接線を計算することができます。 そして、Gauss-Legendre quadratureなどの数値積分アルゴリズムを使用して、接線の長さを積分します。

ここではpaper.jsライブラリのコードを使用してdemo in javasriptです。

アルゴリズムは非常に正確です(浮動小数点数の範囲内で、上記のウィキペディアリンクがより良い例です)。 N点Gaus​​s-Legendre直交は次数2N-1の多項式に対して正確です。 デモの誤差の大きさは、円を均一ベジェ曲線として正確に表すことができないことが主な原因です。そのため、曲線はちょうど近似値です。

+0

ありがとうございました。興味深いですね。私はこれを消化してテストします。私は反応のためにこれに戻ります。再度、感謝します。 – Gav