ばねで繋がる(ふたつ)
ふたつの円が見えないスプリングで繋がれているように動きます。 スプリングで定義したクラスSpringを拡張して使います。クラスSpringにコンストラクタを追加し、ばねの強さ、減衰係数、色を指定してオブジェクトを生成できるようにします。
Springクラスのコンストラクタ Spring(float xpos, float ypos, float m, float g, float dd, float stiff, float damp, color cc) xpos: スプリングの先のx座標 ypos: スプリングの先のy座標 m : 質量 g : 重力加速度 dd : 直径 stiff:ばねの強さ damp :減衰係数 cc :色この新しいコンストラクタを使って、2つのSpringオブジェクトを生成します。位置はすぐ変わるの最初の位置は重要ではありませんが、画面上部に置き、赤い円を直径分下にしました。
Spring obj1; Spring obj2; obj1 = new Spring(oriX, oriY, mass, gravity, d, st, da, color(0,0,0)); obj2 = new Spring(oriX, oriY+d, mass, gravity, d, st, da, color(200,0,0));draw()関数の中で、黒円は(mX, mY)に向かって、赤円は黒円の位置を目指してばねで動かします。
obj1.recalc(mX, mY); //黒円は(mX, mY)へ動く obj1.drawObj(); obj2.recalc(obj1.x, obj1.y);//赤円は黒円を目指して動く obj2.drawObj();赤円が黒円に近付いたら(距離が20以下になったら)、黒円が目指す位置(mX, mY)のx座標mXを左右に動かします。
if(sqrt((obj1.x-mX)*(obj1.x-mX) + (obj1.y-mY)*(obj1.y-mY)) < 20) { mX = random(0, width); //黒円の位置はランダムに動かす mY = random(0, height); }
クリックで停止⇔再開
【リスト Hanging1】 Spring obj1; Spring obj2; float gravity = 3.5; float mass = 7.0; float st = 0.2; float da = 0.7; float d =20; //円の直径 float mX, mY; //黒円を動かす位置 float oriX, oriY; int dist=5; void setup() { size(150, 150); //描画するための画面 oriX = width/2; oriY = height; obj1 = new Spring(oriX, oriY, mass, gravity, d, st, da, color(0,0,0)); obj2 = new Spring(oriX, oriY+d, mass, gravity, d, st, da, color(200,0,0)); mX=width/2.0; mY=height/4.0; } void draw() { background(255); //画面の背景を白でクリア obj1.recalc(mX, mY); //黒円は(mX, mY)へ動く obj1.drawObj(); obj2.recalc(obj1.x, obj1.y);//赤円は黒円を目指して動く obj2.drawObj(); if(sqrt((obj1.x-mX)*(obj1.x-mX) + (obj1.y-mY)*(obj1.y-mY)) < 20) { mX = random(0, width); //黒円の位置はランダムに動かす mY = random(0, height); } }
【リスト Springクラスの追加したコンストラクタ】 Spring(float xpos, float ypos, float m, float g, float dd, float stiff, float damp, color cc) { x = xpos; y = ypos; mass = m; gravity = g; d = dd; stiffness = stiff; damping = damp; c = cc; }