往復する波動運動…ふたつの衝突
ふたつの円が、サインカーブ上を往復運動しながら、衝突します。 波の動きは、ひとつの往復する波動運動と同じです。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; }
クリックで停止⇔再開
【リスト 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; } } }