実行結果
操作方法
- JARファイルを実行したら、表示されている棒の近くをクリックします。
- クリックするとそこに力が加わり、棒が縦波を始めます。
- さらにクリックを続けると、どんどん力を加えることができます。
解説
棒の縦波をシミュレートしています。ただし断面積は1、ヤング率はかなり大きめ、縦波以外の波は発生しないことを仮定しています。
ソースコード
int fRate = 20;
float dt = 1.0/(float)fRate;
float E = 1.0; //Young's modulus [Pa]
float dm = 0.01; // mass [kg]
final int N = 100; //number of section
float[] e = new float[N]; //distortions(of x)
float[] e_temp = new float[N]; //distortions(of x)
float[] de = new float[N]; //distortions(of x)
void setup(){
frameRate(fRate);
size(500,200);
noStroke();
//initial condition
for(int i=0;i<N;i++){
e[i] = 0;
de[i] = 0;
e_temp[i] = 0;
}
}
void draw(){
calc();
background(255);
for(int i=0;i<N;i++){
fill(e[i]*100+100,50,20);
rect(i*4 + 20,100,4,8);
}
}
// calculation of powers
void calc(){
for(int i=1;i<N-1;i++){
de[i] = de[i] + (e[i-1] + e[i+1] - 2*e[i])*E*dt*dt/dm;
e_temp[i] = e[i] + de[i];
}
for(int i=0;i<N;i++){
e[i] = e_temp[i];
}
//boundary condition
e[0] = e[1];
e[N-1] = e[N-2];
}
// mousePressed Event
void mousePressed(){
if(mouseX>=20 && mouseX<= 4*N + 20){
int n = round((mouseX-20)/4);
e[n] = 1.0;
}
}
最終更新:2009年01月31日 14:31