4

特定の長さのCatmull-Rom スプラインがある場合、特定の距離でのその位置をどのように計算できますか? 通常、catmull rom スプラインのポイントを計算するには、0 から 1 の間の値を入力して比率を介して位置を取得しますが、距離に対してこれを行うにはどうすればよいですか? たとえば、スプラインの長さが 30 単位の場合、距離 8 の位置を取得するにはどうすればよいですか?

私が尋ねる理由は、[0,1] ドメインのポイントを与える catmull rom スプラインでは、スプラインにその距離でポイントを与えることを保証しないように思われるためです。たとえば、0.5 を catmull romspline に入力した場合長さ 30 は、スプライン自体が実質的に直線でない限り、スプラインの距離 15 の位置を取得するという意味ではありません..

4

3 に答える 3

3

通常の方法は、各セグメントの長さを保存し、セグメントの部分的な長さを調べるために、t をイプシロン値でインクリメントし、答えが出るまで 2 点間の直線距離を計算することです。明らかに、イプシロンが小さいほど良い結果が得られますが、驚くほど良い結果が得られます。catmul-rom に沿って一定の速度で移動するためにこの方法を使用しましたが、速度が速くなったり遅くなったりするのはわかりません...実際に一定の速度で移動します。明らかに、セグメントがどれだけタイトかによって、イプシロンの値を変更する必要がありますが、一般に、「十分な」イプシロンを選択すれば、すべて問題ありません。

答えを非反復的に見つけると、信じられないほど高価です(私はしばらく前に派生を見たことがありますが、それはきれいではありませんでした;))。パフォーマンスを低下させるには、小さなイプシロン値が必要です...

于 2009-10-04T08:52:50.490 に答える
3

別のリンク: Anti-Grain Geometry ライブラリのベジエ曲線の適応サブディビジョンは
、主に幅の広いブラシを使用してピクセルのグリッドにベジエ曲線を描画するという別の問題に関するものですが、最後を参照してください。
(追加:) Antigrain には素敵な examples/bspline.cpp もあり、ノットを動かして中間点の数を変えることができます。

于 2009-10-07T15:08:35.283 に答える
1

Goz の答えは正確です。これは、ベジエ曲線の長さに関する関連する議論です。ポスターの要約は、正確な答えを計算するよりも近似を行う方が計算量が少ない (そしてはるかに簡単である) というものでした。これは、パラメトリック スプラインの基準を変更できるため適用可能であり、Catmull-Rom 曲線をベジエ セグメントに変換できます。

近似のために、基本的に単純な分析長でプリミティブに分割し、すべての単純な長さを合計します。ほとんどの人は線分を使用しますが、収縮する傾向があります。小さなセグメントを使用することでエラーを最小限に抑えることができますが、非線形曲線の場合、概算は常に実際の長さよりも短くなります。

さらに精度が必要な場合は、円を近似プリミティブとして使用する方法について説明しているjgt の論文があります。これは明らかに高速で正確ですが、実装はそれほど難しくありません。サンプルの C 実装が含まれています。

于 2009-10-07T17:47:41.280 に答える