3次ベジエ曲線を近似する最良の方法は何ですか? 理想的には、特定の x の正確な y 値を与える関数 y(x) が必要ですが、これには x 値ごとに 3 次方程式を解く必要があり、これは私のニーズには遅すぎます。また、数値安定性の問題が発生する可能性があります。このアプローチでも同様です。
これは良い解決策でしょうか?
立方体を解くだけです。
x(t) と y(t) が 3 次多項式であるベジエ平面曲線について話している場合、y(x) は定義されていないか、複数の値を持つ可能性があります。極端な縮退のケースは、x= 1.0 の線で、3 次ベジエとして表現できます (制御点 2 は終点 1 と同じです。制御点 3 は終点 4 と同じです)。その場合、y(x) には x != 1.0 の解はなく、x == 1.0 の解は無限にあります。
再帰的な細分化の方法は機能しますが、3 次を解くよりもはるかに遅くなると思います。(浮動小数点数が異常に少ないある種の組み込みプロセッサを使用している場合を除きます。)
すでに徹底的にテストおよびデバッグされているキュービックを解くコードを見つけるのに問題はないはずです。再帰的細分化を使用して独自のソリューションを実装する場合、その利点はありません。
最後に、はい、必要な点が接線に近い場合など、数値の安定性の問題が発生する可能性がありますが、細分割法ではそれらが解消されません。目立たなくするだけです。
編集: コメントへの返信ですが、300 文字以上必要です。
y(x) が (実) 根を 1 つしか持たないベジエ曲線のみを扱っています。数値安定性に関して、http://en.wikipedia.org/wiki/Cubic_equation#Summaryの式を使用すると、u が非常に小さい場合に問題が発生する可能性があるように見えます。– jtxx000
wackypedia の記事は、コードのない数学です。どこかでもっとすぐに使えるクックブック コードを見つけることができると思います。おそらく、Numerical Recipies または ACM 収集アルゴリズムリンク テキスト.
あなたの特定の質問に対して、記事と同じ表記法を使用すると、 p もゼロまたはゼロに近い場合、 u はゼロまたはゼロに近いだけです。これらは次の式で関連付けられています:
u^^6 + q u^^3 == p^^3 /27
ほぼゼロの場合、q の近似値
q u^^3 == p^^3 /27
または p / 3u ==
立方根を使用できます。
したがって、u からの x の計算には、次のようなものが含まれている必要があります。
(fabs(u) >= somesmallvalue) ? (p / u / 3.0) : cuberoot (q)
ゼロにどれだけ「近い」か? どの程度の精度が必要かによります。Maple または Matlab を使用して、u の大きさに対してどれだけの誤差が導入されるかを調べると、質の高い時間を過ごすことができます。もちろん、どれだけの精度が必要かはあなただけが知っています。
この記事では、3 乗根の u の 3 つの式が示されています。3 つの u 値が与えられると、対応する 3 つの x 値を取得できます。u と x の 3 つの値はすべて、虚数部を持つ複素数です。確信がある場合実数解が 1 つだけである必要がある場合、根の 1 つがゼロの虚数成分を持ち、他の 2 つが複素共役であることが期待されます。3つすべてを計算してから、実際のものを選択する必要があるようです。(複素数 u は実数 x に対応できることに注意してください!) しかし、別の数値安定性の問題があります: 浮動小数点演算はそれが何であるかであり、実数解の虚数成分は正確にゼロにはなりません。非実根は任意にゼロに近くなる可能性があります。したがって、数値の丸めにより、間違ったルートを選択する可能性があります。そこに適用できるアプリケーションからの健全性チェックがあると便利です。
正しいルートを選択した場合、ニュートン ラフソンを 1 回以上反復することで、その精度を大幅に向上させることができます。
はい、de Casteljau アルゴリズムが適しています。ただし、Cardano の方法で 3 次方程式を解くよりも高速になるかどうかはわかりません。