
Processing #2 魚動を三角関数で再現
こんにちは、kazumaです。最近は、自然的な動きをどうやって、数学的、アルゴリズム的に表現するかにはまっている今日この頃です。魚の動きを、アルゴリズムとして考えてみたかったのですが、いい考えが思いつかず、止まっていました。しかし、ちょっとした急展開があったので、書いていきたいと思います。
魚の動きは、一見独時に動いていて、周期的な面が無いように思えますが、通常の横移動の際は、効率を重視し、ひれの動きや体の動きが周期化する、つまり、泳ぐ泳ぎ方の写像は周期関数で表せられるのではないかと思いました。
周期関数は、三角関数の級数和であらわせるので、まずは一般的な、sinx,cosxで作ってみました。
これを点と線で表すと
これだとあたりまえすぎて、つまらないのでsinxをsinx+cos2xにしてみたところ
面白そう(ドキドキ)
すこし大胆に動いてくれるようになりました!
(動画を見せられないのが悔しい)
今回のコード
float[] x = new float[10];
float[] y = new float[10];
void setup(){
size(400,400);
x[2] = -40;
x[3] = -40;
x[4] = -80;
x[5] = -80;
x[6] = -120;
x[7] = -120;
x[8] = -160;
x[9] = -160;
background(255);
}
void draw(){
background(0);
for(int i=0;i<x.length;i++){
if(i%2==0){
y[i] = 30*sin(radians(x[i]))+50*cos(radians(x[i]));
}
else if(i%2==1){
y[i] = 30*cos(radians(x[i]));
}
stroke(232,57,197);
ellipse(x[i],y[i]+200,10,10);
}
stroke(232,57,197);
for(int j = 0;j<=8;j=j+2){
line(x[j], y[j]+200,x[j+1],y[j+1]+200);
}
for(int a =0;a<=7;a++){
line(x[a],y[a]+200,x[a+2],y[a+2]+200);
}
for(int b = 0;b<=6;b++){
line(x[b],y[b]+200,x[b+3],y[b+3]+200);
}
for(int c = 0;c<=5;c++){
line(x[c],y[c]+200,x[c+4],y[c+4]+200);
}
for(int d = 0;d<=9;d++){
x[d]+=1;
}
if(x[7]>width){
x[0] = 0;
x[1] = 0;
x[2] = -40;
x[3] = -40;
x[4] = -80;
x[5] = -80;
x[6] = -120;
x[7] = -120;
x[8] = -160;
x[9] = -160;
}
}
void keyPressed(){
if(key=='p'){
save("reat.png");
}
}
自然の動きを、アルゴリズム化するのは、難しいですが今回はかなり面白い動きのする、プログラムを書くことができました。こんどは、もっと細かく三角関数を指定して、より大胆な自然な動きをめざしてみたいです。
ここまで、読んでいただきありがとうございました!!