# ベジェ曲線 Bezier Curve # 引数 次数 値 ($N, \@Price) # 戻り値 ベジェ曲線 (@BezierCurve) sub BEZIERCURVE{ my ($N, $Price) = @_; my @BezierCurve = (); my @BinomialCoefficient = (); my $Combination = $N; my $count = @$Price - ($N + 1); # 次数と配列数の確認 if(($N < 0) || ($count < 0)){ return 0; } # 二項係数 for(my $i = 0; $i <= $N; $i++){ if(($i == 0) || ($i == $N)){ $BinomialCoefficient[$i] = 1; }else { $Combination = $Combination / $i; $BinomialCoefficient[$i] = $Combination; $Combination = $Combination * ($N - $i); } } # 計算 my $p = int((@$Price - 1) / $N) - 1; while ($p >= 0){ my $Pos = ($p * $N); for(my $i = 0; $i <= $N; $i++){ my $t = $i / $N; my $sum = 0; for(my $j = 0; $j <= $N; $j++){ my $PowerT = $t ** $j; my $Power1_T = (1 - $t) ** ($N - $j); $sum += $BinomialCoefficient[$j] * $PowerT * $Power1_T * $$Price[$Pos + $j]; } # ベジェ曲線 Bezier Curve $BezierCurve[$Pos + $i] = $sum; } $p--; } return @BezierCurve; }