一方向の波動運動…円の列(大きさ変化)
複数の円が列になって、サイズが増加しながらサインカーブ上を運動します。 動きは、異なるサイズの円列と同じですが、個々の円の大きさが変化するところが違います。直線運動をしながらサイズが変化する円列と同様、円が画面にいない間は円の大きさを変えないようにするため、画面上にあるかないかを表す値を入れておくboolean型の配列を使います。boolean型の配列は宣言すると、デフォルトの値であるfalseが入ります。
boolean on[] = new boolean[10]; //登場しているかどうか配列onの値は、次のように、その値がtrueの時だけ、サイズを変えるのに使います。
if(on[i]) { d[i] = d[i]+dd; } //登場している時だけサイズ増加1サイクルの波動運動が終わり、円が画面の右に消えたかどうかの判断と、その時の処理は次のように書きます。角度が360+50以上になったかどうかを調べていますが、360とすると円の中央が画面右端に来た時を判定するためまだ円が見えています。50は、右端を過ぎて、円が完全に見えなくなったときを判定するための調整の数字です。
if (angle[i]>360+50) { //1サイクル終わったら、はじめから on[i] = false; //右へ消えた angle[i]=-30; //角度初期化 d[i]= 1; //サイズ初期化 } else if(angle[i]>=0) { //画面上に登場した on[i]=true; }
クリックで停止⇔再開
【リスト SinCurveM4】 float angle[] = new float[10]; // 位置(角度) float da = 8; // 角度の変化量 float x, y; float h =60; // 振幅 float d[] = new float[10]; // 円の直径 float dd=0.8; //直径の増加量 boolean on[] = new boolean[10]; //登場しているかどうか void setup() { size(150, 150); //描画するための画面 frameRate(30); //フレームレート fill(0); angle[0] = -30; for(int i=1;i&lgt;angle.length;i++){ angle[i] = angle[i-1] -30; d[i]= 1 ; } } void draw() { background(255); //画面の背景を白でクリア for(int i=0; i<angle.length; i++){ x = angle[i]*width/360.0; y = height/2.0 - sin(radians(angle[i]))*h; ellipse(x, y, d[i], d[i]); angle[i] = angle[i] + da; if (angle[i]>360+50) { //1サイクル終わったら、はじめから on[i] = false; //右へ消えた angle[i]=-30; //角度初期化 d[i]= 1; //サイズ初期化 } else if(angle[i]>=0) { //画面上に登場した on[i]=true; } if(on[i]) d[i] = d[i]+dd; //登場している時だけサイズ増加 } }