2010年12月19日日曜日

Bezier曲線

OpenGLで曲面を描画する方法について調べている。
その中でベジエ曲線とか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);
}
}


出力結果はこんな感じ。

0 件のコメント:

コメントを投稿