ばねで繋がる(ふたつ)
ふたつの円が見えないスプリングで繋がれているように動きます。 スプリングで定義したクラス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;
}