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

ベクトルを使いボールの速度を加速度で変化させる (位置と速度と加速度,減速率)


  1. Processing はベクトルを直線運動に利用する

    1. Processing ではPVector がベクトルで position(位置),velocitiy(速度),acceleration(加速度), 減速率(deceleration)を表す

      ・高校の復習 速さ(スカラー)と速度(ベクトル)

      ・高校の復習 等速直線運動  ・ 等加速度直線運動

      ・リファレンス ベクトルのクラス解説
      PVector クラスの機能ベクトルの計算メソッドを準備している
      ユークリッド幾何のベクトル
      ベクトルx成分:
      ベクトルy成分:
      PVector 変数名;
       変数名.x
       変数名.y
      ベクトル足し算add();
      ベクトル引き算sub();
      ベクトルをスカラー倍mult();
      ベクトルをスカラーで割るdiv();
    2. ベクトルで速度・加速度運動シミュレーションの解説

      ボールに力を加えない限り,ボールは静止状態を続け、動いているボールは等速直線運動を続ける.(運動の第1法則)

      ボールに力を加えると加速度が生じる. 力 = 質量 X 加速度, 加速度 = 力/質量 (運動の第2法則)

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

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


  2. 復習: 加速度なし.ボールの等速直線運動と水平位置の変化

    ・ボールに力を加えない限り,ボールは静止状態を続け、動いているボールは等速直線運動を続ける.(運動の第1法則)

    ・基本の運動として,空気抵抗や摩擦抵抗を無視し,ボールが直線上を同じ速さで動く「等速直線運動」のシミュレーションを考える.

    位置(position)と速度(velocitiy)の関係

     Processingのフレームが変わるたびに,速度はボールの位置を変えていく.1ピクセル = 1m,1フレーム = 1/60秒

     1/60秒間隔の1フレーム後の現在の位置(position)=以前の位置(position)+速度(velocitiy);

     ベクトルでの加算表現 position.add (velocitiy);  内容はposition.x = position.x + velocitiy.x; position.y = position.y + velocitiy.y; と同じ記述.



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

    ソースファイル
    //ボールの等速直線運動と水平位置の変化(1フレーム 1/60秒) //ボールの位置変数のベクトル宣言 変数 position.x と position.y を定義 PVector position; //ボールの速度変数のベクトル宣言 変数 velocitiy.x と velocitiy.y を定義 PVector velocitiy; void setup() { //初期設定 size(500,200);//キャンバスのサイズは500mX200mを想像してください? background(255); position = new PVector(20, height/2);//最初の位置(x,y) velocitiy = new PVector(300.0/60, 0.0/60);//速度(x,y)の定義 } void draw() { // 速度による新しい位置(x,y)の計算 position.add(velocitiy);//新しい位置=以前の位置+速度 //図形の軌跡をグラデーションで残す fill(255,20);noStroke();rect(0,0,width,height);//塗りつぶし stroke(255,0,0); fill(255,0,0);//線色を赤・面色を赤 ellipse(position.x, position.y,40,40);//新しい位置にボールを描く // ボールが右端に達したら左端に戻し継続して表示 if(position.x+20 > width){ position.x = 20; } //save("vector_ellipse03-1.jpg");// 実行結果を画像形式で保存 //saveFrame("vector_ellipse03-###.tif");// 連続画像で保存 }
    実行結果


  3. 常に等しい加速度を加えボールの速度を変化させる.等加速度直線運動

    ・ボールの質量 M (1 kg)に力 F (N = kg・m/s2 )を加えると加速度 a (m/s2 )が生じる.(運動の第2法則) F = M * a , a = F/M

     1N(ニュートン)は、1kgの質量をもつ物体に1 (m/s2)の加速度を生じさせる力である.

     M = 1(kg)とし, a = Fの関係で物理運動をシミュレーションする.

     (1) 速度(velocitiy)と加速度(acceleration)の関係が新たに加わる

     Processingのフレームが変わるたびに,加速度はボールの速度を変えていく.1ピクセル = 1m,1フレーム = 1/60秒


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

     速度ベクトル設定: 300.0 (m/s)  フレームごとのx成分 velocitiy.x= 300.0/60 (m/s) と y成分 velocitiy.y= 0.0/60 (m/s).

     加速度ベクトル設定: 18 (m/s2 )  フレームごとのx成分 acceleration.x= 18.0/60 (m/s2 ) と y成分 acceleration.y= 0.0/60 (m/s2 ).

     x方向の加速度は1フレーム間に,速度を18.0/60 (m/s)増すので,1フレーム後の速度は velocitiy.x = velocitiy.x + acceleration.x

     y方向の加速度は1フレーム間に,速度を0.0/60 (m/s)増すので,1フレーム後の速度は velocitiy.y = velocitiy.y + acceleration.y



     1フレーム後の現在の速度(velocitiy)=以前の速度(velocitiy)+加速度(acceleration);  ベクトル表現では加算に「+」記号が使えない.

     ベクトルでの加算表現 velocitiy.add(acceleration);  内容は velocitiy.x = velocitiy.x + acceleration.x; velocitiy.y = velocitiy.y + acceleration.y;



     (2) 復習: 位置(position)と速度(velocitiy)の関係

     Processingのフレームが変わるたびにボールの位置を変えていく.1ピクセル = 1m,1フレーム = 1/60秒


     1/60秒間隔の1フレーム後の現在の位置(position)=以前の位置(position)+速度(velocitiy);  ベクトル表現では加算に「+」記号が使えない.

     ベクトルでの加算表現 position.add (velocitiy);  内容はposition.x = position.x + velocitiy.x; position.y = position.y + velocitiy.y; と同じ記述.



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

    ソースファイル
    //ボールの等加速度直線運動と水平位置の変化(1フレーム 1/60秒) //ボールの位置変数のベクトル宣言 変数 position.x と position.y を定義 PVector position; //ボールの速度変数のベクトル宣言 変数 velocitiy.x と velocitiy.y を定義 PVector velocitiy; //ボールの加速度変数のベクトル宣言 // 変数 acceleration.x と acceleration.y を定義 PVector acceleration; void setup() { //初期設定 size(500,200);background(255); position = new PVector(20, height/2);//最初の位置(x,y) velocitiy = new PVector(300.0/60, 0.0/60);//速度(x,y)の定義 acceleration = new PVector(18.0/60 , 0.0/60);//加速度(x,y)の定義 } void draw() { // 加速度による新しい速度(x,y)の計算 velocitiy.add(acceleration);//現在の速度=以前の速度+加速度 // 速度による新しい位置(x,y)の計算 position.add(velocitiy);//現在位置=以前の位置+現在の速度 //図形の軌跡をグラデーションで残す fill(255,20);noStroke();rect(0,0,width,height);//塗りつぶし stroke(255,0,0); fill(255,0,0);//線色を赤・面色を赤 ellipse(position.x, position.y,40,40);//現在位置にボールを描く // ボールが右端に達したら左端に戻し継続して表示 if(position.x+20 > width){ position.x = 20; } //println (velocitiy.x); //save("vector_ellipse03-2.jpg");// 実行結果を画像形式で保存 //saveFrame("vector_ellipse03-###.tif");// 連続画像で保存 }
    実行結果


  4. マイナスの加速度を加えボールの速度を変化すると

    ・1フレーム後の現在の速度(velocitiy)=以前の速度(velocitiy)+加速度(acceleration), //velocitiy.add(acceleration);

     内容は 加速度がマイナスになるので1秒後の速度が減少していく.

    ・1フレーム後の現在の位置(position)=以前の位置(position)+現在の速度(velocitiy), //position.add(velocitiy);

     内容は 速度が0m/sになると進む方向が逆転する.


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

    ソースファイル
    //ボールにマイナスの加速度と水平位置の変化(1フレーム 1/60秒) //ボールの位置変数のベクトル宣言 変数 position.x と position.y を定義 PVector position; //ボールの速度変数のベクトル宣言 変数 velocitiy.x と velocitiy.y を定義 PVector velocitiy; //ボールの加速度変数のベクトル宣言 // 変数 acceleration.x と acceleration.y を定義 PVector acceleration; void setup() { //初期設定 size(500,200);background(255); position = new PVector(20, height/2);//最初の位置(x,y) velocitiy = new PVector(300.0/60, 0.0/60);//速度(x,y)の定義. acceleration = new PVector(-2.0/60, 0.0/60);//-の加速度(x,y)の定義 } void draw() { // 加速度による新しい速度(x,y)の計算 velocitiy.add(acceleration);//現在の速度=以前の速度+加速度 // 速度による新しい位置(x,y)の計算 position.add(velocitiy);//現在位置=以前の位置+現在の速度 //図形の軌跡をグラデーションで残す fill(255,20);noStroke();rect(0,0,width,height);//塗りつぶし stroke(255,0,0); fill(255,0,0);//線色を赤・面色を赤 ellipse(position.x, position.y,40,40);//現在位置にボールを描く // ボールが左端に達したら右端に戻し継続して表示 if(position.x+20 < 20){ position.x = width-10; } //println (velocitiy.x); //save("vector_ellipse03-3.jpg");// 実行結果を画像形式で保存 //saveFrame("vector_ellipse03-###.tif");// 連続画像で保存 }
    実行結果


  5. 等加速度運動に減速率(摩擦抵抗あるいは空気抵抗)を加え,ボールを減速する

    ・1フレーム後の現在の速度(velocitiy)=以前の速度(velocitiy)+加速度(acceleration), //velocitiy.add(acceleration);

    現在の速度(velocitiy)=以前の速度(velocitiy)*減速率(deceleration), //velocitiy.mult(deceleration.x);掛け算には注意する

    ・1フレーム後の現在の位置(position)=以前の位置(position)+現在の速度(velocitiy), //position.add(velocitiy);


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

    ソースファイル
    //ボールの速度と減速率と位置の変化(1フレーム 1/60秒) //減速率のベクトル宣言 変数 deceleration.x と deceleration.y を定義 PVector deceleration; //ボールの位置変数のベクトル宣言 変数 position.x と position.y を定義 PVector position; //ボールの速度変数のベクトル宣言 変数 velocitiy.x と velocitiy.y を定義 PVector velocitiy; //ボールの加速度変数のベクトル宣言 // 変数 acceleration.x と acceleration.y を定義 PVector acceleration; void setup() { //初期設定 size(500,200);background(255); deceleration = new PVector(0.9, 0.0);//減速率の定義(x,y) position = new PVector(20, height/2);//最初の位置(x,y) velocitiy = new PVector(300.0/60, 0.0/60);//速度(x,y)の定義 acceleration = new PVector(18.0/60, 0.0/60);//加速度(x,y)の定義 } void draw() { // 加速度による新しい速度(x,y)の計算@ velocitiy.add(acceleration);//現在の速度=以前の速度+加速度 // 減速率による新しい速度(x,y)の計算A velocitiy.x = velocitiy.x * deceleration.x; velocitiy.y = velocitiy.y * deceleration.y; // 速度による新しい位置(x,y)の計算 position.add(velocitiy);//現在位置=以前の位置+現在の速度 //図形の軌跡をグラデーションで残す fill(255,20);noStroke();rect(0,0,width,height);//塗りつぶし stroke(255,0,0); fill(255,0,0);//線色を赤・面色を赤 ellipse(position.x, position.y,40,40);//現在位置にボールを描く // ボールが右端に達したら左端に戻し継続して表示 if(position.x+20 > width){ position.x = 10; } //println (velocitiy.x); //save("vector_ellipse03-4.jpg");// 実行結果を画像形式で保存 //saveFrame("vector_ellipse03-###.tif");// 連続画像で保存 }
    実行結果

[ 目次に戻る ]