/****************************/ /* n次ベジエ曲線 */ /* coded by Y.Suganuma */ /****************************/ import java.io.*; public class Test { public static void main(String args[]) throws IOException { double B[][], t, step = 0.05, P[]; int i1, n; // 設定 n = 3; B = new double [n+1][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); System.out.println(t + " " + P[0] + " " + P[1]); t += step; } } /*******************************/ /* n次ベジエ曲線 */ /* n : 次数 */ /* B : 多角形の頂点座標 */ /* t : 計算したい点の位置 */ /* return : 座標 */ /* coded by Y.Suganuma */ /*******************************/ static double [] bezier(int n, double B[][], double t) { double P[], J; int i; // 初期設定 P = new double [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 : 結果 */ /*******************************/ static double brend(int n, int i, double t) { double ni, x = 1.0, y = 1.0; int i1; 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の階乗の計算 */ /*****************/ static double kaijo(int n) { double k = 1.0; int i1; if (n > 1) { for (i1 = 2; i1 <= n; i1++) k *= i1; } return k; } }