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