アットウィキロゴ

弦の振動1

実行結果


操作方法

  1. JARファイルを実行したら、表示されている弦の近くをクリックします。
  2. クリックするとそこに力が加わり、弦が振動を始めます。
  3. さらにクリックを続けると、どんどん力を加えることができます。

解説

弦を100点に分割して、それぞれの微小部分の運動方程式を解くことによってシミュレーションを行っています。

ソースコード

final int fRate = 20; // framerate
final int N = 100; // number of mass
float T = 0.6; // tense
float rho = 0.03; // density of string
float d = 0.3; // distance of mass
 
float[] y = new float[N];
float[] ny = new float[N]; // temporary value of y
float[] dy = new float[N]; // variation of y
 
float dt = 1.0/fRate;
 
void setup(){
  frameRate(fRate);
  size(500,400);
  stroke(255);
 
  // initial condition
  for(int i=0;i<N;i++){
    y[i] = 0.0;
    dy[i] = 0.0;
  }
}
 
void draw(){
  calc();
 
  background(0);
 
  noFill();
  beginShape();
  for(int i=0;i<N;i++){
    curveVertex(i*4+20, y[i]*40+200);
  }
  endShape();
}
 
// calculation of gravity
void calc(){
  float _dm = 1.0/(rho*d);
 
  for(int i=1;i<N-1;i++){
    dy[i] = dy[i] + (T/d)*(y[i+1] - 2*y[i] + y[i-1])*_dm*dt*dt;
 
    ny[i] = y[i] + dy[i];
 
    // boundary condition
    y[0] = 0.0;
    y[N-1] = 0.0;
  }
 
  for(int i=0;i<N;i++){
    y[i] = ny[i];
  }
}
 
// mousePressed Event
void mousePressed(){
  if(mouseX>=20 && mouseX<= 4*N + 20){
    int n = round((mouseX-20)/4);
    dy[n] = 0.2f;
  }
}


最終更新:2009年01月30日 02:22
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。