一方向の波動運動…ひとつ(軌跡なし)
ひとつの円が、サインカーブ上を運動します。 ひとつの山とひとつの谷がサインカーブの1サイクルで、円が画面の横幅を進む間に、1サイクルのサインカーブ上を動くようにします。sinの値は三角関数を使って計算しますが、sin(angle)のangleが0~360度(0~2πラジアン)変化すると1サイクルの波になります。
sin()関数の引数にはラジアン単位の角度を指定するので、radians()関数を使って度単位をラジアンに換算します。sinの値は0~1の間の数でそのままだと変化が小さくて見えないので、山の高さ(振幅)hをかけます。
sin(radians(angle)) * hこの計算値をそのまま円のy座標とすると、yが0の線上(つまり画面の上端の辺)で波が描かれ、波の山の部分が見えません。そこで、画面の高さの中央部まで、移動します。
y = height/2.0 - sin(radians(angle))*h;画面の座標系ではy軸は下向きに正の値が大きくなり、一般的な数学の座標系と異なるため、sin()の計算値の前をマイナスにしています。
角度angleはda(5度)ずつ変化し、360になったら0に戻るように、余りを計算する演算子%を使って計算しています。
angle = (angle + da) % 360;//角度は0~360の間をdaずつ増加これは、次のようにif文を使って書くのと同じです。
angle = angle + da; if(angle>= 360) angle = 0;
円を描くには、x座標の値が必要です。角度が0~360度変化する間に、円は画面の0から横幅widthまで移動するので、その換算をmap()関数を使って行います。
x = map(angle, 0, 360, 0, width);angleが0の時はx座標は0、angleが360の時はx座標はwidth(150)になります。
クリックで停止⇔再開
【リスト SinCurve1】 float angle; // 位置(角度) float da = 5; // 角度の変化量 float x, y; float d = 10; // 円の直径 float h =50; // 振幅 void setup() { size(150, 150); //描画するための画面 fill(0); } void draw() { background(255); //画面背景を白でクリア x = map(angle, 0, 360, 0, width);// 0-360を、0からwidthの値に変換 y = height/2.0 - sin(radians(angle))*h; ellipse(x, y, d, d); angle = (angle + da) % 360; //角度は0~360の間をdaずつ増加 }