往復する波動運動…同一サイズの円列
複数の円が列になって、サインカーブ上を往復運動します。 波の動きは、ひとつの往復する波動運動と同じです。複数の円を扱う方法は同一サイズの円列の直線往復運動と同じで、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];
}
}
}