往復する波動運動…ふたつの円列の衝突
ふたつの円の列が、サインカーブ上を往復運動しながら、衝突します。 サインカーブ上の衝突の動きは、ふたつの円の波動上の衝突と同じです。複数の円を扱う方法はふたつの円列の直線上の衝突と同じで、10個の円の位置(角度)と速度(角度の変化量)を配列に入れておきます。float[] angle1 = new float[n]; // 左の円列の位置(角度) float[] angle2 = new float[n]; // 右の円列の位置(角度) float[] da1 = new float[n]; // 左の円列の角度の変化量 float[] da2 = new float[n]; // 右の円列の角度の変化量この例では、ソースコードをシンプルにするために、円は最初から画面上に置くように初期値を設定しており、そのため円が画面上にあるかどうかを保存する配列は必要ありません。
クリックで停止⇔再開
【リスト RSinCurveM2】 int n = 10; //円の数 float[] angle1 = new float[n]; // 位置(角度) float[] angle2 = new float[n]; // 位置(角度) float[] da1 = new float[n]; // 角度の変化量 float[] da2 = new float[n]; // 角度の変化量 float x1, y1, x2, y2; float d = 10; // 円の直径 float h =60; // 振幅 void setup() { size(150, 150); //描画するための画面 noStroke(); angle2[angle2.length-1]=720; //右列の最後の円の角度は720 da1[angle1.length-1] = 3; da2[angle2.length-1] = -3; for(int i=angle1.length-2;i>=0;i--){ // 配列の初期値の設定 angle1[i]= angle1[i+1] + 15; //左列の最後が0で、前に行くに従い15ずつ増える da1[i] = 3; } for(int i=angle2.length-2;i>=0;i--){ // 配列の初期値の設定 angle2[i]= angle2[i+1] - 15; //右列、前に行くに従い15ずつ減る da2[i] = -3; } } void draw() { background(255); for(int i=0; i<n; i++){ angle1[i] = angle1[i] + da1[i]; angle2[i] = angle2[i] + da2[i]; x1 = map(angle1[i], 0, 720, 0, width); y1 = height/2.0 - sin(radians(angle1[i]))*h; fill(200,0,0); //左の列は赤で描画 ellipse(x1, y1, d, d); x2 = map(angle2[i], 0, 720, 0, width); y2 = height/2.0 - sin(radians(angle2[i]))*h; fill(0); ellipse(x2, y2, d, d); if(dist(x1,y1,x2,y2)<d){//衝突した da1[i] = -da1[i]; da2[i] = -da2[i]; }else{ if(angle1[i]<0 || angle1[i]>720){//左の列 壁 da1[i] = -da1[i]; } if(angle2[i]<0 || angle2[i]>720){//右の列 壁 da2[i] = -da2[i]; } } } }