<?php /****************************/ /* n次ベジエ曲線 */ /* coded by Y.Suganuma */ /****************************/ // 設定 $step = 0.05; $n = 3; $B = array($n+1); for ($i1 = 0; $i1 <= $n; $i1++) $B[$i1] = array(2); $B[0][0] = 1.0; $B[0][1] = 1.0; $B[1][0] = 2.0; $B[1][1] = 3.0; $B[2][0] = 4.0; $B[2][1] = 3.0; $B[3][0] = 3.0; $B[3][1] = 1.0; // 実行と出力 $t = 0.0; for ($i1 = 0; $i1 <= 20; $i1++) { $P = Bezier($n, $B, $t); printf("%f %f %f\n", $t, $P[0], $P[1]); $t += $step; } /*******************************/ /* n次ベジエ曲線 */ /* n : 次数 */ /* B : 多角形の頂点座標 */ /* t : 計算したい点の位置 */ /* return : 座標 */ /* coded by Y.Suganuma */ /*******************************/ function Bezier($n, $B, $t) { // 初期設定 $P = array(2); $P[0] = 0.0; $P[1] = 0.0; // 計算 for ($i = 0; $i <= $n; $i++) { $J = brend($n, $i, $t); $P[0] += $B[$i][0] * $J; $P[1] += $B[$i][1] * $J; } return $P; } /*******************************/ /* ベジエ基底関数 */ /* n,i : 次数 */ /* t : 計算したい点の位置 */ /* return : 結果 */ /*******************************/ function brend($n, $i, $t) { $x = 1.0; $y = 1.0; $ni = kaijo($i) * kaijo($n-$i); $ni = kaijo($n) / $ni; for ($i1 = 1; $i1 <= $i; $i1++) $x *= $t; $t = 1.0 - $t; for ($i1 = 1; $i1 <= $n-$i; $i1++) $y *= $t; return $ni * $x * $y; } /*****************/ /* nの階乗の計算 */ /*****************/ function kaijo($n) { $k = 1.0; if ($n > 1) { for ($i1 = 2; $i1 <= $n; $i1++) $k *= $i1; } return $k; } ?>