振動運動リストに戻る    印刷する

スプリング

見えないスプリングにぶら下がっているように、円が上下します。 ばねの運動と同じ動きです。
スプリングの先の位置の計算と、円の描画はクラスSpringが行います。SpringCircleでは、Springオブジェクトを作り、動きがほぼ止まったら、スプリングの位置を下げて、繰り返し動くようにしています。 そして、draw()関数の中で、VibateBallのメソッドdisplay()を呼び出し、新しい位置に描画します。
Springクラスの仕様は次のようなものです。
コンストラクタ
   Spring(float xpos, float ypos, float m, float g, float dd)
    xpos: スプリングの先のx座標
    ypos: スプリングの先のy座標
    m   : 質量
    g   : 重力加速度
    dd  : 直径

メソッド
   void recalc(float targetX, float targetY)
   スプリングの先の位置を計算。(targetX, targetY)は元の位置。

   void drawObj()
   スプリングの先に円を黒で描画。
Springクラスは、スプリングの強さ(stiffness)、減衰係数(damping)、円の色(c)はクラス内で固定していますが、生成時に変更できるように新しいコンストラクタを定義するなど、Springクラスを拡張できます。

Your browser does not support the canvas tag.

クリックで停止⇔再開
【リスト SpringCircle】
Spring obj1; 
float gravity = 0;
float mass = 7.0;
float d =10;  //円の直径
float mX, mY;  //動かす
float oriX, oriY;
boolean move = false;

void setup() {
  size(150, 150);   //描画するための画面
  oriX = width/2;
  oriY = height/2;
  obj1 = new Spring(oriX, oriY, mass, gravity, d);
  mX=width/2;
  mY=height/2;  
}

void draw() { 
     background(255);   //画面の背景を白でクリア
     if(move){
       obj1.recalc(mX, mY);
       if((obj1.dy<0.001 && obj1.dy>-0.001)){
         move = false;        //ほぼ止まった
       }
     }else{   //止まったら、円を下へ動かして、ばね運動を始める
       obj1.y += 3;
       if(obj1.y >= height) { move = true; }
     }
     obj1.drawObj();
}
【リスト Spring】
class Spring {
  float dx, dy; // 速度
  float x, y; // 位置
  float gravity; //重力
  float mass;//質量
  float d = 10; //直径
  float stiffness = 0.1;//ばねの強さ
  float damping = 0.98; //ゆれを抑える係数 値が小さいと揺れが小さくなる
  color c = color(0, 0, 0);  //描く円の色
  
  Spring(float xpos, float ypos, float m, float g, float dd) {
    x = xpos;
    y = ypos;
    mass = m;
    gravity = g;
    d = dd;
  }
  
  void recalc(float targetX, float targetY) { //位置の計算
    float forceX = (targetX - x) * stiffness;
    float ax = forceX / mass;
    dx = damping * (dx + ax);
    x = x + dx;
    float forceY = (targetY - y) * stiffness;
    forceY = forceY + gravity;
    float ay = forceY / mass;
    dy = damping * (dy + ay);
    y = y + dy;
  }
  
  void drawObj() {
    noStroke();
    fill(c);
    ellipse(x, y, d, d);
  }
}

arigat アットマーク acm.org / copyright © info