その中でベジエ曲線とかB-splite曲線とかいろいろ出てきた。
文章や図を眺めてるだけだけじゃイマイチ理解が深まらないので、Procceing上でベジエ曲線描画するプログラムを自力実装してみた(注:Processingにはベジエ曲線を描画するための関数、bezier()があるので純粋に描画したいだけならそれ使った方が早いです)。
int w = 500;
int h = 500;
void setup(){
smooth();
noStroke();
fill(200,0,0,200);
size(w,h);
float[][] pArray ={{50.,200.},
{200.,100.},
{300.,400.},
{450.,200.}};
fill(0,200,0,200);
Bezier(pArray);
fill(200,0,0,200);
for(int i = 0;i < pArray.length;i++){
ellipse(pArray[i][0],pArray[i][1],10,10);
}
}
void draw(){
}
int combination(int n,int k){
int c = 0;
c = factorial(n) / (factorial(k) * factorial(n - k));
return c;
}
int factorial(int n){
if(n == 0){
return 1;
}
int f = 0;
if(n == 1){
return n;
}
else{
f = n * factorial(n - 1);
}
return f;
}
float Berstein(int i,int N,float t){
float b = 0;
b = combination(N,i) * pow((1 - t),(N - i)) * pow(t,i);
return b;
}
void Bezier(float[][] pArray){
final int numT = 1000;
final int x = 0;
final int y = 1;
for(int ti = 0;ti <= numT;ti++){
float t = ti / float(numT);
float px = 0;
float py = 0;
for(int i = 0;i < pArray.length;i++){
float b = Berstein(i,pArray.length - 1,t);
px += b * pArray[i][x];
py += b * pArray[i][y];
}
ellipse(px,py,10,10);
}
}
出力結果はこんな感じ。