直線の往復運動…ふたつの円列の衝突
ふたつの円の列が、水平に移動、中央で衝突し、往復運動します。ふたつの円の衝突と同じ動きを、2つの円列に対して行います。2つの列の円の数は同じで、変数nnで設定するようにしています。nnの値を1にすると、ふたつの円の衝突と同じになります。
setup()関数内で、 左の列は左端の左側に(d+kk)の間隔で配置、右の列は右端の右側に同じく(d+kk)の間隔で配置しておきます。ひとつの円列の往復と同様、画面に登場しているかどうかを保存する配列on1[]とon2[]を使い、動き出して画面に現れたらこの値をtrueにしておきます。そして、登場している時(on1[]あるいはon2[]の値がtrueの時)だけ壁に当たったかどうかを判定します。
左右の列を区別するため、左の列は赤い色で描いています。
クリックで停止⇔再開
【リスト RStraightM2】
int nn = 6; // 円の数
float ss = 2; //移動速度
int kk = 2; //間隔の調整
float d = 10; // 円の直径
float x1[] = new float[nn]; // 位置(x座標)
float s1[] = new float[nn]; // 移動速度
float x2[] = new float[nn]; // 位置(x座標)
float s2[] = new float[nn]; // 移動速度
boolean on1[] = new boolean[nn]; // 登場したかどうか
boolean on2[] = new boolean[nn]; // 登場したかどうか
void setup() {
size(150, 150); //描画するための画面
noStroke();
s1[0]=ss; s2[0]=-ss;
x2[0]= width - d/2;
for(int i=1;i<x1.length;i++){
x1[i]= x1[i-1] - (d+kk);
s1[i] = ss;
x2[i]= x2[i-1] + (d+kk);
s2[i] = -ss;
}
}
void draw() {
background(255); //画面背景を白でクリア
for(int i=0;i<x1.length;i++){
x1[i] = x1[i]+s1[i];
x2[i] = x2[i]+s2[i];
if(x1[i] > 0 && !on1[i]) on1[i] = true;
if(x2[i] < width && !on2[i]) on2[i] = true;
if(x1[i]>x2[i]-d){ //衝突
x1[i] = x2[i]-d;
s1[i] = -s1[i];
x2[i] = x1[i]+d;
s2[i] = -s2[i];
}else{
if(on1[i] && x1[i]<d/2){ //左の列、左の壁
x1[i] = d/2;
s1[i] = -s1[i];
}else if(on2[i] && x2[i]>width-d/2){ //右の列, 右の壁
x2[i] = width-d/2;
s2[i] = -s2[i];
}
}
fill(200,0,0); //左の列は赤
ellipse(x1[i], height/2, d, d);
fill(0); //左の列は黒
ellipse(x2[i], height/2, d, d);
}
}