スプリング
見えないスプリングにぶら下がっているように、円が上下します。 ばねの運動と同じ動きです。スプリングの先の位置の計算と、円の描画はクラス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クラスを拡張できます。
クリックで停止⇔再開
【リスト 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);
}
}