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

往復する波動運動…ふたつの衝突

ふたつの円が、サインカーブ上を往復運動しながら、衝突します。 波の動きは、ひとつの往復する波動運動と同じです。2つの円、それぞれに角度、xy、座標、移動速度(角度)を入れる変数を用意しました。
この例では、画面の横幅と2サイクルの波(角度が0から720度)が一致するようにし、その2サイクルの波のどこかで円が衝突します。最初左側の円の角度angle1は0度、右側の円の角度angle2は720度です。2つの円の距離をdist関数で計算し、その値が直径より小さければ、衝突したと判定します。
 if(dist(x1,y1,x2,y2) < d){ //衝突した
      da1 = -da1;
      da2 = -da2;
 }else{ //壁に来たかを判定
         ..............
 }
円が壁に来たかの判定は角度が0未満になったか、720を超えたかで行います。2つの円は別々に壁に来るので、if文は独立している(else ifではない)ことに注意してください。
       if(angle1<0 || angle1>720){//左の円
          da1 = -da1;
       }
       if(angle2<0 || angle2>720){//右の円
          da2 = -da2;
       }

Your browser does not support the canvas tag.

クリックで停止⇔再開
【リスト RSinCurve2】
float angle1, angle2; // 位置(角度)
float x1, y1, x2, y2; // 位置(xy座標)
float d = 10; // 円の直径
float h =60; // 振幅
float da1 = 5; // 角度の変化量
float da2 = -da1; // 角度の変化量

void setup() {
  size(150, 150);   //描画するための画面
  fill(0);
  angle2=720;  //右側の円は右壁から出る
}

void draw() { 
     background(255);   //モニタ画面の背景を白でクリア
     angle1 = angle1 + da1;
     angle2 = angle2 + da2;
     x1 = map(angle1, 0, 720, 0, width);
     y1 = height/2.0 - sin(radians(angle1))*h;
     ellipse(x1, y1, d, d);
     x2 = map(angle2, 0, 720, 0, width);
     y2 = height/2.0 - sin(radians(angle2))*h;
     ellipse(x2, y2, d, d);
     
     if(dist(x1,y1,x2,y2) < d){ //衝突した
         da1 = -da1;
         da2 = -da2;
     }else{ //壁に来たかを判定
       if(angle1<0 || angle1>720){//左の円
          da1 = -da1;
       }
       if(angle2<0 || angle2>720){//右の円
          da2 = -da2;
       }
     }
}

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