往復する円運動
ひとつの円が、円周上を往復運動します。 円周上の動きの計算は一方向の円運動と同じです。円周上の点のx、y座標は、三角関数sin()とcos()を使って計算します。
x =len * cos(radians(angle)) + width/2.0; y =len * sin(radians(angle)) + height/2.0;angleが0だと、時計の3時の位置の点の座標が計算できます。angleは時計回りに大きくなり、12時の位置が270度です。
円周上を往復させるには、次のようにします。 angleの値を変化量da(ここでは3)分増やし、angleが360を超えたら今度はda分減るようにdaの値の正負を変えます。次に0より小さくなったら再び増えるようにdaの値の正負を変えます(3)。これをしているのが次の部分で、angleが0から360の間でdaずつ変化します。
angle = angle + da; //円周上を変化量分移動 if (angle>=360 || angle<0) { //1周したら動きの方向変える da = -da; }この値をそのまま三角関数の計算に使うと、時計の3時の位置で運動の方向が変わります。12時の位置(270度)で反転するようにするために、angle+270としています。
float ver=270; //往復位置の角度(3時位置は0度、右回り) ....... x =len * cos(radians(angle+ver)) + width/2.0; y =len * sin(radians(angle+ver)) + height/2.0;
クリックで停止⇔再開
【リスト RCircle1】 float angle; // 位置(角度) float x, y; float d = 10; // 円の直径 float da = 3; // 角度の変化量 float len = 60; // 軌跡の円の半径 float ver=270; //往復位置の角度(3時位置は0度、右回り) void setup() { size(150, 150); //描画するための画面 fill(0); } void draw() { background(255); //画面の背景を白でクリア angle = angle + da; //円周上を変化量分移動 x =len * cos(radians(angle+ver)) + width/2.0; //位置の計算 y =len * sin(radians(angle+ver)) + height/2.0; ellipse(x, y, d, d); if (angle>=360 || angle<0) { //1周したら動きの方向変える da = -da; } }