往復運動リストに戻る    印刷する

直線の往復運動…ふたつの衝突

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

Your browser does not support the canvas tag.

クリックで停止⇔再開
【リスト 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);
}

arigat アットマーク acm.org / copyright © info