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