往復する波動運動…同一サイズの円列
複数の円が列になって、サインカーブ上を往復運動します。 波の動きは、ひとつの往復する波動運動と同じです。複数の円を扱う方法は同一サイズの円列の直線往復運動と同じで、10個の円の位置(角度)と速度(角度の変化量)を配列に入れておきます。この例では角度の変化の大きさはどの円も5で変わりませんが、右に動くか左に動くか(角度が増えるか減るか)が円によって異なるので、円ごとに別のデータをもたせます。また10個の円を順番に画面に登場させるために、円が画面上に出たか、まだ左にいるかの状態を配列onに保存しておきます。
float[] angle = new float[10]; // 位置(角度) float[] da = new float[10]; // 角度の変化量 boolean[] on = new boolean[10]; // 登場したかどうか、初期値はfalse左端の隠れた所から順次円が登場するように、配列angleの初期値を指定します。先頭の円が-10で、20度ずつ左側にずれた位置に置きます。配列daの値はすべて5にします。
angle[0] = -10; da[0]=5; for(int i=1;i<angle.length;i++){ angle[i]= angle[i-1] - 20; da[i] = 5; }次のようにdraw()関数のfor文の中で、登場していない(on[]の値がfalseの)円の角度が0を超えたら、on[]をtrueにします。壁の判定は、on[]がtrueの時だけ行います(これが必要なのは、円を左壁の隠れたところから登場させるためです)。
for(int i=0; i<angle.length; i++){ //位置の計算 ellipse(x, y, d, d); //描画 if(!on[i] && angle[i]>0) on[i] = true; if(on[i] && (angle[i]>360 || angle[i]<0)){//壁の判定 da[i] = -da[i]; } }
クリックで停止⇔再開
【リスト RSinCurveM1】 float[] angle = new float[10]; // 位置(角度) float[] da = new float[10]; // 角度の変化量 float x, y; float d = 10; // 円の直径 float h =60; // 振幅 boolean[] on = new boolean[10]; // 登場したかどうか void setup() { size(150, 150); //描画するための画面 fill(0); angle[0] = -10; da[0]=5; //配列の初期化 for(int i=1;i<angle.length;i++){ angle[i]= angle[i-1] - 20; da[i] = 5; } } void draw() { background(255); for(int i=0; i<angle.length; i++){ angle[i] = angle[i] + da[i]; x = map(angle[i], 0, 360, 0, width); y = height/2.0 - sin(radians(angle[i]))*h; ellipse(x, y, d, d); if(angle[i] > 0 && !on[i]) on[i] = true; //画面に出たか判定 if(on[i] && angle[i]>360){//右の壁 da[i] = -da[i]; }else if(on[i] && angle[i]<0){//左の壁 da[i] = -da[i]; } } }