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