FC2ブログ

# B-スプライン曲線 Basis Spline Curve
# 引数 次数 値 ($N, \@Price)
# 戻り値 B-スプライン曲線 (@BSplineCurve)
sub BSPLINECURVE{
my ($N, $Price) = @_;
my @BSplineCurve = ();
my @KnotVector = (-3,-2,-1,0,1,2,3,4);
my $count = @$Price - ($N + 1);

# 次数と配列数の確認
if(($N < 0) || ($count < 0)){
return 0;
}

# 制御点
my $ControlPoint = $N + 1;
# 階数 = 次数 + 1
my $Order = $N + 1;
# ノット数 = 制御点 + 階数
my $Knot = $ControlPoint + $Order;

# 計算
for(my $i = 0; $i <= $N; $i++){
my $t = $i / $N;
my $sum = 0;

for(my $j = 0; $j <= $N; $j++){
$sum += &BASISFUNCTION($j, $Order, $t, \@KnotVector) * $$Price[$j];
}

# B-スプライン曲線 BSpline Curve
$BSplineCurve[$i] = $sum;
}

return @BSplineCurve;
}

# Bスプライン基底関数 Basis Function De Boor Cox
# 引数 位置 ノット位置? 値 ノットベクトル ($j, $k, $t, \@KnotVector)
# 戻り値 Bスプライン基底関数 ($BasisFunction)
sub BASISFUNCTION{
my ($j, $k, $t, $KnotVector) = @_;
my $BasisFunction = 0;

if($k == 1){
# Bスプライン基底関数 Basis Function
$BasisFunction = ((($$KnotVector[$j] <= $t) && ($t < $$KnotVector[$j + 1])) ? 1 : 0 );
}else {
my $den1 = (($$KnotVector[$j + $k - 1] - $$KnotVector[$j]));
my $den2 = (($$KnotVector[$j + $k] - $$KnotVector[$j + 1]));
my $tmp1 = ($den1 != 0 ? (($t - $$KnotVector[$j]) / $den1) * &BASISFUNCTION($j, ($k - 1), $t, $KnotVector) : 0);
my $tmp2 = ($den2 != 0 ? (($$KnotVector[$j + $k] - $t) / $den2) * BASISFUNCTION($j + 1, ($k - 1), $t, $KnotVector) : 0);

# Bスプライン基底関数 Basis Function
$BasisFunction = $tmp1 + $tmp2;
}

return $BasisFunction;
}


動作確認

# 3次B-スプライン曲線 Basis Spline Curve
# 引数 次数 値 ($N, \@Price)
# 戻り値 B-スプライン曲線 (@BSplineCurve)
sub BSPLINECURVE{
my ($N, $Price) = @_;
my @BSplineCurve = ();
my $count = @$Price - ($N + 1);

# 次数と配列数の確認
if(($N < 0) || ($count < 0)){
return 0;
}

# 計算
for(my $i = 0; $i <= $N; $i++){
my $t = $i / $N;
my $t2 = $t * $t;
my $t3 = $t * $t * $t;

my $P1 = (-$t3 + (3 * $t2) - (3 * $t) + 1) * $$Price[$i];
my $P2 = ((3 * $t3) - (6 * $t2) + 4) * $$Price[$i + 1];
my $P3 = (-(3 * $t3) + (3 * $t2) + (3 * $t) + 1) * $$Price[$i + 2];
my $P4 = $t3 * $$Price[$i + 3];

# 3次 B-スプライン曲線 BSpline Curve
$BSplineCurve[$i] = ($P1 + $P2 + $P3 + $P4) / 6;
}

return @BSplineCurve;
}


参考URL
t-pot 『3次曲線』
第5章 第2節 Bスプラインの数学的定義
NURBS、ソリッドモデリング ゼロからの早分かり講座 4.NURBS ノンユニフォームでラショナルなBスプライン
[独り言」[CAD]3次のB-Spline基底関数 by de Boor Cox漸化式 - bateの日記

一言
ノットベクトルの扱い方が分からないので、下にあるソースと一致する値を入れている
そもそも始点と終点の値が一致していないので、どっかバグっているのかな?
オンライン コンパイラ/インタプリタ
テクニカル分析
プロフィール

Author:雨宮
Firefoxを使用しているので気づかなかったけど、IE6でソースコードを上手くコピーできない

5/3
携帯用ならIE6でもソースコードをコピーできる
携帯用

検索フォーム


あわせて読みたいブログパーツ
一寸先は闇 RSS