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