/****************************/
/* n次ベジエ曲線 */
/* coded by Y.Suganuma */
/****************************/
#include <stdio.h>
double *Bezier(int, double **, double);
int main()
{
double **B, t, step = 0.05, *P;
int i1, n;
// 設定
n = 3;
B = new double *[n+1];
for (i1 = 0; i1 <= n; i1++)
B[i1] = new double [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;
}
for (i1 = 0; i1 <= n; i1++)
delete [] B[i1];
delete [] B;
delete [] P;
return 0;
}
/*******************************/
/* n次ベジエ曲線 */
/* n : 次数 */
/* B : 多角形の頂点座標 */
/* t : 計算したい点の位置 */
/* return : 座標 */
/* coded by Y.Suganuma */
/*******************************/
double brend(int, int, double);
double kaijo(int);
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 : 結果 */
/*******************************/
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の階乗の計算 */
/*****************/
double kaijo(int n)
{
double k = 1.0;
int i1;
if (n > 1) {
for (i1 = 2; i1 <= n; i1++)
k *= i1;
}
return k;
}