数学の数値解析の分野において、ドゥ・カステルジャのアルゴリズムは、発明者のポール・ドゥ・カステルジャにちなんで名付けられた、ベルンシュタイン形式の多項式またはベジェ曲線を評価する再帰的な方法です。ドゥ・カステルジャのアルゴリズムは、任意のパラメータ値で単一のベジェ曲線を 2 つのベジェ曲線に分割するためにも使用できます。
このアルゴリズムは、多項式の直接評価と比較すると数値的に安定している[1]。このアルゴリズムの計算量は、dが次元数、nが制御点の数である場合である。より高速な代替手段が存在する。[2] [3]
意味
ベジェ曲線(次数、制御点)は、バーンスタイン形式で次のように表すことができます。 ここで はバーンスタイン基底多項式です。 点 における曲線は、再帰関係で評価できます。
そして、点におけるの評価は演算で評価できる。結果は次のように与えられる。
さらに、ベジェ曲線は点で、それぞれ制御点を持つ 2 つの曲線に 分割できます。
幾何学的解釈
De Casteljau のアルゴリズムの幾何学的解釈は簡単です。
- 制御点を持つベジェ曲線を考えてみましょう。連続する点を接続することで、曲線の制御ポリゴンを作成します。
- 次に、この多角形の各線分を比率で細分化し、得られた点を結びます。こうすることで、線分が 1 つ少ない新しい多角形が得られます。
- 単一の点に到達するまでこのプロセスを繰り返します。これは、パラメータに対応する曲線の点です。
次の図は、3 次ベジェ曲線に対するこのプロセスを示しています。
構築された中間点は、実際には 2 つの新しいベジェ曲線の制御点であり、両方とも古いものと正確に一致することに注意してください。このアルゴリズムは、 における曲線を評価するだけでなく、 で曲線を 2 つの部分に分割し、ベジェ形式で 2 つのサブ曲線の方程式を提供します。
上記の解釈は、非有理ベジェ曲線に対して有効です。 における有理ベジェ曲線を評価するには、点を に投影します。たとえば、3 次元の曲線では、制御点と重みが重み付き制御点 に投影されます。その後、アルゴリズムは通常どおりに で補間します。結果として得られる 4 次元の点は、透視分割によって 3 次元空間に投影し直すことができます。
一般に、有理曲線(または曲面)に対する演算は、射影空間内の非有理曲線に対する演算と同等です。「重み付き制御点」と重みとしてのこの表現は、有理曲線を評価するときに便利な場合がよくあります。
表記
手計算を行う場合、係数を三角形スキームで書き出すと便利です。 バーンスタイン多項式を評価するために 点t 0を選択する場合、三角形スキームの2つの対角線を使用して、多項式の分割を構築 し 、
ベジェ曲線



n + 1 個の制御点P iを 持つ 3 次元空間でn次ベジェ曲線を評価する場合、 ベジェ曲線を 3 つの別々の方程式に分割し 、De Casteljau アルゴリズムを使用して個別に評価します。
例
点t 0におけるバーンスタイン係数を使用して、2次のバーンスタイン多項式を評価します 。
再帰は で開始し 、2 回目の反復で再帰は で停止します 。これは、期待される次数2 の Bernstein 多項式です 。
実装
以下は、さまざまなプログラミング言語での De Casteljau アルゴリズムの実装例です。
deCasteljau :: Double -> [( Double , Double )] -> ( Double , Double )
カステルジョt [ b ] = b
deCasteljau t係数= deCasteljau t減少
どこ
縮小= zipWith ( lerpP t ) coefs (末尾の係数)
lerpP t ( x0 , y0 ) ( x1 , y1 ) = ( lerp t x0 x1 , lerp t y0 y1 )
線形代数t a b = t * b + ( 1 - t ) * a
def de_casteljau ( t : float , coefs : list [ float ]) -> float :
"""ド・カステルジョのアルゴリズム。"""
beta = coefs.copy () # このリストの値は上書きされます
n = 長さ(ベータ)
jが 範囲( 1 , n )の 場合:
kが 範囲( n - j )の 場合:
ベータ[ k ] = ベータ[ k ] * ( 1 - t ) + ベータ[ k + 1 ] * t
ベータ版を返す[ 0 ]
パブリックdouble deCasteljau ( double t 、double []係数) {
double [] beta =係数;
int n =ベータ.長さ;
( int i = 1 ; i < n ; i ++ )の場合{
( int j = 0 ; j < ( n - i ) ; j ++ ) {
ベータ[ j ] =ベータ[ j ] * ( 1 - t ) +ベータ[ j + 1 ] * t ;
}
}
beta [ 0 ]を返します。
}
JavaScript のコード例
次の JavaScript 関数は、De Casteljau のアルゴリズムを、De Casteljau によって最初に命名された制御点または極の配列に適用し、曲線の最初の点が 0、最後の点が 1 の間の指定された t で曲線上の点に到達するまで、それらを 1 つずつ減らします。
関数crlPtReduceDeCasteljau (ポイント、t ) {
retArr = [ points . slice () ]とします。
while (ポイント.長さ> 1 ) {
中間点を[]とします。
( i = 0とします; i + 1 <ポイント.長さ; ++ i ) {
ax = points [ i ][ 0 ]とします。
ay = points [ i ][ 1 ]とします。
bx = points [ i + 1 ][ 0 ]とします。
点[ i + 1 ][ 1 ]を次のように定義します。
// a * (1-t) + b * t = a + (b - a) * t
中点。プッシュ([
ax + ( bx - ax ) * t 、
ay + ( by - ay ) * t 、
]);
}
retArr . push (中間点)
ポイント=中点;
}
retArrを返します。
}
例えば、
var 極 = [ [0, 128], [128, 0], [256, 0], [384, 128] ]
crlPtReduceDeCasteljau (極、.5)
配列を返す
[ [ [0, 128], [128, 0], [256, 0], [384, 128 ] ],
[ [64, 64]、[192, 0]、[320, 64] ]、
[ [128, 32], [256, 32]],
[ [192, 32]],
]
以下にプロットされている点とそれらを結ぶ線分はどれですか

参照
- ベジェ曲線
- ド・ブールのアルゴリズム
- 多項式を単項式形式で評価するためのホーナー方式
- チェビシェフ形式の多項式を評価するクレンショウアルゴリズム
参考文献
- ^ Delgado, J.; Mainar, E.; Peña, JM (2023-10-01). 「de Casteljau 型アルゴリズムと Bernstein 表現の精度について」. Computer Aided Geometric Design . 106 : 102243. doi :10.1016/j.cagd.2023.102243. ISSN 0167-8396.
- ^ Woźny, Paweł; Chudy, Filip (2020-01-01). 「ベジェ曲線を評価するための線形時間幾何学アルゴリズム」. Computer-Aided Design . 118 :102760. arXiv : 1803.06843 . doi :10.1016/j.cad.2019.102760. ISSN 0010-4485.
- ^ Fuda, Chiara; Ramanantoanina, Andriamahenina; Hormann, Kai (2024). 「有理ベジェ曲線を評価するためのアルゴリズムの包括的な比較」。Dolomites Research Notes on approximation . 17 (9/2024): 56–78. doi :10.14658/PUPJ-DRNA-2024-3-9. ISSN 2035-6803.
- Farin, Gerald E.; Hansford, Dianne (2000). The Essentials of CAGD . Natick, MA: AK Peters. ISBN 978-1-56881-123-9。
外部リンク
- ベジェ曲線の区分線形近似 - 再帰を停止するタイミングを決定する基準を含む、ドゥ・カステルジョーのアルゴリズムの説明
- ベジェ曲線とピカソ — 3 次ベジェ曲線に適用された De Casteljau のアルゴリズムの説明と図解。
- de Casteljau のアルゴリズム - アルゴリズムの実装ヘルプとインタラクティブなデモンストレーション。
