直線の往復運動…ふたつの衝突
ふたつの円が、水平に一定速度で往復運動しながら、衝突します。一つの円が左右の壁の間を往復運動するひとつ(一定速度)と基本は同じです。ふたつの円が衝突したか、また、円がそれぞれに壁に当たったかを判定します。
ふたつの円が衝突した時の処理を次のif文で書きます。x1とx2の座標の差が直径分の時に衝突したと判断します。
if(x1>x2-d){ //衝突した
s1 = -s1; //左の円の速度を反転する
s2 = -s2; //右の円の速度を反転する
x1 = x2-d;
x2 = x1+d;
}
速度によっては、2つの円が重なるように衝突します。その重なりを解くために、円が互いに接するようにx1とx2の値を調整しています。
円の衝突がなかった場合は、それぞれ壁へ当たったかどうかを、次のように独立したif文で、判定します。
if(x1<d/2){//左側の円が左の壁より左に来た
x1 = d/2;
s1 = -s1;
}
if(x2>width-d/2){//右の円が右の壁より右に来た
x2 = width-d/2;
s2 = -s2;
}
ふたつの円は独立して動いていて、個別に壁に当たるので、次のようにどちらかではないことに、注意してください。
if(x1<d/2){ //左側の円が左の壁より左に来た
.....
}else if(x2>width-d/2){ //あるいは右の円、右の壁より右に来た。
.....
}
クリックで停止⇔再開
【リスト RStraight2】
float d = 10; // 円の直径
float x1, x2; // 位置(x座標)
float s1 = 2, s2 = -2; // 移動速度
void setup() {
size(150, 150); //描画するための画面
fill(0);
x1 = d/2; //左側の円の最初の位置
x2 = width-d/2; //右側の円の最初の位置
}
void draw() {
background(255); //画面背景を白でクリア
x1 = x1+s1; //進める
x2 = x2+s2; //進める
if(x1>x2-d){ //衝突した
s2 = -s2;
s1 = -s1;
x1 = x2-d;
x2 = x1+d;
}else{ //壁に当たったかを判定
if(x1<d/2){//左側の円、左の壁より左に来た
x1 = d/2;
s1 = -s1;
}
if(x2>width-d/2){//右の円、右の壁より右に来た
x2 = width-d/2;
s2 = -s2;
}
}
ellipse(x1, height/2, d, d);
ellipse(x2, height/2, d, d);
}