一方向運動リストに戻る    印刷する

一方向の波動運動…ひとつ(軌跡なし)

ひとつの円が、サインカーブ上を運動します。 ひとつの山とひとつの谷がサインカーブの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)になります。

Your browser does not support the canvas tag.

クリックで停止⇔再開
【リスト 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ずつ増加

}

arigat アットマーク acm.org / copyright © info