Last updated: 2016 -2014. Kajiyama                    [ 目次に戻る ]

極座標系を使いボールを水平面上で回転運動させる (位置と角速度)


  1. 円運動のコンピュータグラフィックス表現

    1. 位置の極座標系での表現

      円運動では位置Pを中心からの半径 rと回転角度 θで表す.

      これを極座標 P(r,θ) と呼ぶ.


      水平面での回転運動を考える

    2. 極座標系での平行移動,回転移動の表現

      Processingでは原点を中心にθ (ラジアン)回転した時の,回転移動は,rotate (θ); で表現する.

      任意の位置(A,B)を中心にθ回転させるには,

      (1) translate(A, B);// まず座標軸の原点(0,0)を(A, B)に移動する.

      (2) rotate(θ);// 次に,これらの以下に記述した図形を(A, B)を中心にθ回転する.角度θの単位は(ラジアン)


    3. 極座標系の角速度 ω=dθ/dt

      物体の回転運動では角速度ωを用いる.回転角度θを時間で微分した角速度ω=dθ/dtである.単位は(ラジアン/秒)

      (1) 角速度(velocitiy)と角加速度(acceleration)の関係

        Processingのフレームが変わるたびに,角加速度α (ラジアン/秒2 )は回転の角速度ω (ラジアン/秒)を変えていく.

        1秒後の角加速度α(ラジアン/秒2 )は速度を角速度α (ラジアン/秒)に変化し,既存の速度に加算される.

        1秒後の角速度 ωは,現在の角速度ω = 以前の角速度ω + 角加速度α

        角加速度がα= 0.0 (ラジアン/秒2 )の場合は角速度は等速(常に一定)になり,等速円運動となる.ただし,Pの接線方向の速度は常に変化する.


      (2) 回転角度(position)と角速度(velocitiy)の関係

        Processingのフレームが変わるたびに,角速度ω(ラジアン/秒)は回転角度θ(ラジアン:位置)を変えていく.

        1秒後の角速度ω (ラジアン/秒)は回転し位置を角度ω (ラジアン)移動し,既存の回転角度θ (ラジアン)に加算される.

        1秒後の回転角度 θ (ラジアン)は,現在の角度 θ = 以前の角度 θ + 角速度ω


    4. 角運動で円運動シミュレーションの解説

      1章 ベクトル,"The Nature of Cord 自然現象のシミュレーション入門",Daniel Shiffman,岡利崇訳,ボーンデジタル,p23-52, 2014.

      2章 力,"The Nature of Cord 自然現象のシミュレーション入門",Daniel Shiffman,岡利崇訳,ボーンデジタル,p53-84, 2014.

      3章 振動,"The Nature of Cord 自然現象のシミュレーション入門",Daniel Shiffman,岡利崇訳,ボーンデジタル,p85-117, 2014.


  2. 水平面上での,ひものついたボールの円運動

    1. ボールの等速円運動--速度と位置の変化

      ・基本の運動として,水平面上の円周を一定の角速度でまわり続ける「等速円運動」のシミュレーションを考える.

       実際には空気抵抗や摩擦抵抗により減速するがここでは無視する.

      (1) 回転角度(position)と角速度(velocitiy)の関係

        Processingのフレームが変わるたびに,角速度ωは回転角度θ(位置)を変えていく.1ピクセル = 1m,1フレーム = 1/60 秒とする.

        1/60秒間隔の1フレームで考えると,

        初速度の角速度の設定 0.6 (ラジアン/秒):  1フレーム(1/60秒)ごとの角速度に換算するとangular_velocity = 0.6/60 (ラジアン/秒)

        1フレーム(1/60秒)ごとに位置を角度 0.6/60 (ラジアン)回転し,これが既存の回転角度θに加算される.

        1フレームの角度 θ (ラジアン)は,現在の角度 θ = 以前の角度 θ + 角度ω/60  angle = angle + angular_velocity (ラジアン)



      ・次のソースファイルをコピーして,Processing開発環境のエディタ領域に貼り付ける.

      ソースファイル
      // 等速円運動(1ピクセル = 1m,1フレーム 1/60秒) int length;// ひもの長さ,回転半径 float angle = 0.0;// 回転角,角度はラジアン float angular_velocity = 0.6/60;// 角速度 void setup() { size(500, 500);//キャンバスのサイズは500mX500mを想像してください? length = width*2/5;// ひもの長さ,回転半径 } void draw() { background(255);//フレーム毎に,白く塗り以前の描画を消す translate(width/2, height/2);// 座標軸の原点(0,0)を移動 rotate(angle);// 以下の図形を原点を中心に回転 stroke(0); strokeWeight(2);//線の太さをピクセル単位で line(0, 0, length, 0);// ひもの形状 fill(255,0,0); ellipse(length, 0, 20, 20);// ボールの形状 angle = angle + angular_velocity; //save("polar_coordinates01b-1.jpg");// 実行結果を画像で保存 //saveFrame("polar_coordinates01b-###.tif");// 連続画像で保存 }
      実行結果


    2. 等速の回転に角加速度を加え角速度を変化させる

      ・等速の回転運動に一定の加速度(角加速度)を加え続けるとどうなるか.1ピクセル = 1m,1フレーム = 1/60秒とする.

      (1) 角速度(velocitiy)と角加速度(acceleration)の関係

        Processingの1/60秒間隔ごとにフレームが変わるたびに,角加速度αは回転の角速度ωを変えていく.

        1/60秒間の1フレームで考えると,

        初速度の角速度の設定 0.6 (ラジアン/秒):  1フレーム(1/60秒)ごとの角速度に換算するとangular_velocity = 0.6/60 (ラジアン/秒)

        角加速度の設定 0.012 (ラジアン/秒2 ):  1フレーム(1/60秒)ごとの角加速度に換算するとangular_acceleration = 0.012/60 (ラジアン/秒2 )

        1フレームの角加速度0.012/60 (ラジアン/秒2 )は角速度0.012/60 (ラジアン/秒)に変化し,既存の角速度に加算される.

        現在の角速度ω = 以前の角速度ω + 角加速度α  angular_velocity = angular_velocity + angular_acceleration;


      (2) 回転角度(position)と角速度(velocitiy)の関係

        Processingの1/60秒間ごとにフレームが変わるたびに,角速度ω (ラジアン/秒)は角度をθ (ラジアン)回転し位置を変えていく.

        1/60秒間隔の1フレームで考えると,

        1フレームの角速度0.012/60 (ラジアン/秒)は回転し角度を0.012/60 (ラジアン)回転し,既存の回転角度θに加算される.

        1フレームの角度 θは,現在の角度 θ = 以前の角度 θ + 角速度ω  angle = angle + angular_velocity;



      ・次のソースファイルをコピーして,Processing開発環境のエディタ領域に貼り付ける.

      ソースファイル
      // 等加速度円運動(1ピクセル = 1m,1フレーム 1/60秒) int length;// ひもの長さ,回転半径 float angle = 0.0;// 回転角,角度はラジアン float angular_velocity = 0.6/60;// 角速度 float angular_acceleration = 0.012/60;// 角加速度 void setup() { size(500, 500); length = width*2/5;// ひもの長さ,回転半径 } void draw() { background(255);//フレーム毎に,白く塗り以前の描画を消す translate(width/2, height/2);// 座標軸の原点(0,0)を移動 rotate(angle);// 以下の図形を原点を中心に回転 stroke(0); strokeWeight(2);//線の太さをピクセル単位で line(0, 0, length, 0);// ひもの形状 fill(255,0,0); ellipse(length, 0, 20, 20);// ボールの形状 angular_velocity = angular_velocity + angular_acceleration; angle = angle + angular_velocity; //save("polar_coordinates01b-2.jpg");// 実行結果を画像で保存 //saveFrame("polar_coordinates01b-###.tif");// 連続画像で保存 }
      実行結果

[ 目次に戻る ]