0

サイド プロジェクトで Catmull-Rom スプラインを動作させることに取り組んでいますが、必要なことを実行するのに苦労しています。次の 2 つの実装を試してみましたが、どちらもうまくいきませんでした。また、それらのコードに関連するコードのエラーを追跡できませんでした (テスト済みであると想定する必要があります)。私は彼らを「ABC」ソリューションと呼びます:

カスプと自己交差のない Catmull-rom 曲線

https://en.wikipedia.org/wiki/Centripetal_Catmull%E2%80%93Rom_spline

次に、次のソリューション(「マトリックス」ソリューションと呼んでいます)を実装し、編集されたバージョン3の投稿を使用して機能しました: https://www.opengl.org/discussion_boards/showthread.php/159518-catmull-rom-スプライン

ただし、このマトリックス ソリューションは、マトリックスに組み込まれた 0.5 'a' 値を使用して Catmull-Rom を実装するだけです。Chordal を機能させたいので、'a' == 1 が必要です。

ABC バージョンの私の解決策が問題を引き起こしていたので、ここ ( http://algorithmist.net/docs/catmullrom.pdf ) のマトリックスを使用して、独自の「a」を渡そうとしました。元の 0.5 コードに続いて、ユーザー指定の 'a' を渡す変更済みコードを次に示します。

元のコード:

float u2 = u * u;
float u3 = u2 * u;

return ((2 * x1) + 
       (-x0 + x2) * u + 
       (2*x0 - 5*x1 + 4*x2 - x3) * u2 + 
       (-x0 + 3*x1 - 3*x2 + x3) * u3) * 0.5f;

変更されたコード:

float u2 = u * u;
float u3 = u2 * u;

static float a = 0.5f;

return ((1.0f * x1) + 
       ((-a*x0) + (a*x2)) * u + 
       ((2.0f*a)*x0 + (a-3.0f)*x1 + (3.0f-(2.0f*a))*x2 + (-a*x3)) * u2 + 
       ((-a*x0) + (2.0f-a)*x1 + (a-2.0f)*x2 + (a*3.0f)) * u3) * 0.5f;

これはもちろんうまくいきません。しかし、私はその理由を見ていません。PDFの4ページ目の下部に、「a」が含まれるマトリックスが表示されます。上記の変更されたコードでそれを置き換えてトリプルチェックしましたが、スプラインが台無しになっています。それは私に同じ答えを与えるべきだった。二重に紛らわしいのは、5 ページの彼の結果がその結果の行列を取り、それに 0.5 を掛けると、行列のエントリからすべての /2 が削除されることです。最終的なマトリックスはこれらの値を使用しますが、4 ページの元のマトリックスは 0.5 * マトリックスではなく、単なる「マトリックス」です。この 0.5 が勝手に追加されたのはなぜですか? また、それがないとすべてが壊れてしまうのはなぜですか?

とにかく、誰かが私の方程式で何が間違っているのか知っていますか? この行列形式を使用して、独自の 'a' を 0 ~ 1 から渡して、一様スプライン、求心スプライン、弦スプラインを作成できますか? それとも ABC 形式を使用する必要がありますか?

前もって感謝します!

4

1 に答える 1

1

PDF ファイルの 4 ページ目にある 'a' の行列は、まだ一様な Catmull-Rom (CR) スプライン用だと思います。パラメータ「a」は張力パラメータです。Wiki ページ ( https://en.wikipedia.org/wiki/Centripetal_Catmull%E2%80%93Rom_spline ) では、各ポイントに割り当てられたノット シーケンスを制御するために「アルファ」も使用しています。張力パラメータ「a」とこの「アルファ」を混同しないでください。

「標準」の一様 CR スプラインは alpha=0.0 になります (a=0.5 になります)。弦 CR スプラインには alpha=1.0 を、求心 CR スプラインには alpha=0.5 を使用する必要があります。それらの対応する行列形式は、両方とも点の結び目シーケンスを含みます。そのため、一様 CR スプラインの行列形式で a=1.0 を使用すると、弦 CR スプラインにはなりませんが、データ ポイントでより強い接線を持つ一様 CR スプラインになり、通常、望ましくないスプライン形状になります。

于 2015-06-22T05:31:20.050 に答える