直線の往復運動…ふたつの衝突
ふたつの円が、水平に一定速度で往復運動しながら、衝突します。一つの円が左右の壁の間を往復運動するひとつ(一定速度)と基本は同じです。ふたつの円が衝突したか、また、円がそれぞれに壁に当たったかを判定します。
ふたつの円が衝突した時の処理を次の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); }