/****************************/
/* 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;
}
}