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法則)

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

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

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


  2. 復習: 重力を無視した,等速直線運動で鉛直面を移動するボールと鉛直位置の変化

     水平方向(x)は,ボールが同じ速さで直進する「等速直線運動」を考える.

     鉛直方向(y)には,重力の影響を無視した,ボールが同じ速さで真直ぐ落下する「等速直線運動」.


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

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

     速度ベクトルの設定 初速度 300.0*√2 (m/s),下向き45゜方向:

     1/60秒間隔の1フレームに換算すると,

     1フレームの x成分 velocitiy.x= 300.0/60 (m/s) と y成分 velocitiy.y= 300.0/60 (m/s)



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

     内容は,position.x = position.x + velocitiy.x, position.y = position.y + velocitiy.y


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

    ソースファイル
    //等速直線運動で落下するボール(1フレーム = 1/60秒) int a=10; int b=10;//円の半径 //ボールの位置変数のベクトル宣言 変数 position.x と position.y を定義 PVector position; //ボールの速度変数のベクトル宣言 変数 velocitiy.x と velocitiy.y を定義 PVector velocitiy; void setup() { //初期設定 size(500,500);//キャンバスのサイズは500mX500mを想像してください? background(255); position = new PVector(10*a, 3*a);//最初の位置(x,y) velocitiy = new PVector(300.0/60, 300.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,2*a,2*a);//新しい位置にボールを描く // ボールが下端の床にぶつかると方向反転 if( (position.y+a > height) || (position.y-a < 0) ){ velocitiy.y = -1*velocitiy.y; } // ボールが左右両端の壁にぶつかると方向反転 if( (position.x+a > width) || (position.x-a < 0) ){ velocitiy.x = -1*velocitiy.x; } //save("vector_ellipse03a-1.jpg");// 実行結果を画像形式で保存 //saveFrame("vector_ellipse03a-###.tif");// 連続画像で保存 }
    実行結果


  3. ボールに加わる重力により等加速度直線運動と落下位置(鉛直位置)の変化

    ・ボールが重力加速度を受けながら速度を増す落下シミュレーションを考える.空気抵抗による減速があるがここでは無視する.


    (1) ボールに力(重力)を加えると加速度が生じる.(運動の第2法則)

     力 = 質量 X 加速度, 加速度 = 力/質量, 質量 = 1 とすると加速度 = 力

     重力加速度を使用する.重力加速度 = 9.8 (m/s2):

     これを,1/60秒間隔の1フレームに換算する.

     1フレームの 水平方向(x)は,ボールが同じ速さで直進する「等速直線運動」である. gravity.x = 0.0/60 (m/s2)

     1フレームの 鉛直方向(y)は,重力加速度を使用する「落下運動」である. gravity.y = 9.8/60 (m/s2)



    (2) 速度(velocitiy)と加速度(acceleration)の関係

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

     内容は,velocitiy.x = velocitiy.x + gravity.x,velocitiy.y = velocitiy.y + gravity.y

     速度ベクトルの設定: 初速度300*√2 (m/s),上向き45゜方向.

     これを,1/60秒間隔の1フレームに換算する.

     フレームごとのx成分 velocitiy.x= 300.0/60 (m/s) と y成分 velocitiy.y= -300.0/60 (m/s)

     加速度ベクトルの設定: 重力加速度9.8 (m/s2),下向.

     フレームごとのx成分 gravity.x= 0 (m/s2) と y成分 gravity.y= 9.8/60 (m/s2)
       gravity = new PVector(0.0, 9.8/60);


     1フレーム後の現在の速度(velocitiy)=以前の速度(velocitiy)+重力加速度(gravity) //velocitiy.add(gravity);


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

     Processingのフレームが変わるたびに,速度はボールの位置を変えていく.1ピクセル = 1m,1フレーム = 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秒) int a=10;//円の半径 PVector position;//ボールの位置変数のベクトル宣言 PVector velocitiy;//ボールの速度変数のベクトル宣言 //ボールの重力加速度変数のベクトル宣言 変数 gravity.x とgravity.y を定義 PVector gravity; void setup() { //初期設定 size(500,500);background(255); position = new PVector(a, height/2);//最初の位置(x,y) velocitiy = new PVector(300.0/60, -300.0/60);//初速度(x,y)の定義, gravity = new PVector(0.0/60, 9.8/60);//重力加速度(x,y)の定義 } void draw() { // 重力加速度による新しい速度(x,y)の計算 velocitiy.add(gravity);//現在の速度=以前の速度+重力加速度 // 速度による新しい位置(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,2*a,2*a);//新しい位置にボールを描く // ボールが下端の床にぶつかると方向反転 if( (position.y+a > height) || (position.y-a < 0) ){ velocitiy.y = -1*velocitiy.y; } // ボールが左右両端の壁にぶつかると方向反転 if( (position.x+a > width) || (position.x-a < 0) ){ velocitiy.x = -1*velocitiy.x; } //save("vector_ellipse03a-2.jpg");// 実行結果を画像形式で保存 //saveFrame("vector_ellipse03a-###.tif");// 連続画像で保存 }
    実行結果


  4. ボールの放物落下を空気抵抗により減速する

    ・速度ベクトル設定: 初速度300*√2 (m/s),上向き45゜方向.

     フレームごとのx成分 velocitiy.x= 300 (m/s) と y成分 velocitiy.y= -300 (m/s)


    ・ボールが重力加速度を受けながら落下速度を増し,かつ,空気抵抗により減速する落下シミュレーションを考える.

    (1) 現在の速度(velocitiy)=以前の速度(velocitiy)+加速度(gravity)

    (2) さらに,空気抵抗により減速する現在の速度(velocitiy)=以前の速度(velocitiy)*減速率(deceleration)

     フレームごとのx成分 deceleration.x= 0.995 と y成分 deceleration.y= 0.995

     velocitiy.x = velocitiy.x * deceleration.x; //掛け算 

     velocitiy.y = velocitiy.y * deceleration.y; //掛け算 


    (3) 現在のフレームの位置(position)=以前のフレームの位置(position)+現在の速度(velocitiy)


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

    ソースファイル
    //ボールの速度と減速率と位置の変化(1フレーム = 1/60秒) int a=10;//円の半径 PVector position;//ボールの位置変数のベクトル宣言 PVector velocitiy;//ボールの速度変数のベクトル宣言 PVector gravity;//ボールの重力加速度変数のベクトル宣言 //減速率のベクトル宣言 変数 deceleration.x と deceleration.y を定義 PVector deceleration; void setup() { //初期設定 size(500,500);background(255); deceleration = new PVector(0.995, 0.995);//減速率の定義(x,y) position = new PVector(a, height/2);//最初の位置(x,y) velocitiy = new PVector(300.0/60, -300.0/60);//初速度(x,y)の定義, gravity = new PVector(0.0/60, 9.8/60);//重力加速度(x,y)の定義 } void draw() { // 重力加速度による新しい速度1(x,y)の計算 velocitiy.add(gravity);//現在の速度=以前の速度+重力加速度 // 減速率による新しい速度2(x,y)=以前の速度*減速率の計算 velocitiy.x = velocitiy.x * deceleration.x;//掛け算 velocitiy.y = velocitiy.y * deceleration.y;//掛け算 // 速度による新しい位置(x,y)の計算 position.add(velocitiy);//新しい位置(x,y)=以前の位置+速度 //図形の軌跡をグラデーションで残す fill(255,20);noStroke();rect(0,0,width,height);//塗りつぶし stroke(255,0,0); fill(255,0,0);//線色を赤・面色を赤 ellipse(position.x, position.y,2*a,2*a);//新しい位置にボールを描く // ボールが下端の床にぶつかると方向反転 if( (position.y+a > height) || (position.y-a < 0) ){ velocitiy.y = -1*velocitiy.y; } // ボールが左右両端の壁にぶつかると方向反転 if( (position.x+a > width) || (position.x-a < 0) ){ velocitiy.x = -1*velocitiy.x; } //save("vector_ellipse03a-3.jpg");// 実行結果を画像形式で保存 //saveFrame("vector_ellipse03a-###.tif");// 連続画像で保存 }
    実行結果

[ 目次に戻る ]