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

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

ふたつの円が、円周上を往復運動しながら、衝突します。 円周上の動きの計算は、ひとつの往復する円運動と同じです。2つの円、それぞれに角度、xy、座標、移動速度(角度)を入れる変数を用意しました。
2つの円がぶつかると動く方向を変えるようにします。下の【リスト RCircle2】では右側の円(赤)の変化量da1は3、左側の円(黒)の変化量da2は-3で、反対方向へ動き、ぶつかると変化量の正負を逆転させます(変化量の絶対値が同じである必要はない)。
 if(abs(angle1-angle2)>=360 || abs(angle1-angle2)<=0){ //衝突した
    da1 = -da1;
    da2 = -da2;
 }
衝突したかどうかは、円の位置を表す角度angle1とangle2の差の絶対値が0以下(元の位置に戻った)か、360以上(2つの円合わせて1周した)かで判定します。

Your browser does not support the canvas tag.

クリックで停止⇔再開
【リスト RCircle2】
float angle1, angle2; // 位置(角度)
float x1, y1, x2, y2;
float d = 10; // 円の直径
float da1 = 3; // 角度の変化量
float da2 = -3; // 角度の変化量
float len = 60; // 軌跡の円の半径
float ver=270;   //往復位置の補正 角度

void setup() {
  size(150, 150);   //描画するための画面
  noStroke();
}

void draw() { 
     background(255);   //画面の背景を白でクリア
     angle1 = angle1 + da1;
     angle2 = angle2 + da2;
     x1 = len * cos(radians(angle1+ver)) + width/2.0;
     y1 = len * sin(radians(angle1+ver)) + height/2.0;
     fill(200,0,0);  //右側の円は赤で描画
     ellipse(x1, y1, d, d);
     x2 = len * cos(radians(angle2+ver)) + width/2.0;
     y2 = len * sin(radians(angle2+ver)) + height/2.0;
     fill(0);        //左側の円は黒で描画
     ellipse(x2, y2, d, d);
     if(abs(angle1-angle2)>=360 || abs(angle1-angle2)<=0){ //衝突した
         da1 = -da1;  //方向を逆転
         da2 = -da2;
     }
}

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