HOME > natural science Laboratory > コンピュータ・シミュレーション講座 > 仮想物理実験室

VisualC++ と OpenGL を利用した仮想物理実験室
【1-2-3】等加速度直線運動をグラフ化する

【1-2-2】等加速度直線運動のシミュレーションでは、等加速度直線運動のシミュレーションを行ないました。 運動の様子を理解するために、【1-1-4】等速度直線運動のグラフ化と同様に、物理量同士の関係をプロット(グラフ化)することを行ないます。 今回は、時刻 t[s] 対 位置 x[m]、速度 v[m/s]、加速度 a[m/s^2]の関係をそれぞれプロットします。

数値データの出力

数値データを出力するために、VisualC++プログラムを若干付け足します。

1.出力ファイル名の設定

//////////////////////////////////////////////////////////////////////////
// 変数の定義
//////////////////////////////////////////////////////////////////////////
#define _BITMAP 0 //アニメーション作成用ビットマップの保存 0:しない 1:する
ofstream file1( "ball1.data" );

C++言語のファイル出力関連の「ofstream」クラスを利用します。上記は、「ofstream」クラスのインスタンス「file1」を生成し、コンストラクタで出力ファイル名(ball1.data)を指定します。

2.出力フォーマットの設定

時刻 t[s] 対 位置 x[m]、速度 v[m/s]、加速度 a[m/s^2]の関係をプロットするために、 時刻 t[s] の時の位置 x[m]、速度 v[m/s]、加速度 a[m/s^2]のデータをスペース区切りで1行とします。

時刻1 座標1 速度1 加速度1
時刻2 座標2 速度2 加速度2
時刻3 座標3 速度3 加速度3
・・・

C++言語の「ofstream」クラスで出力を行なうためには、「<<」演算子を利用します。 具体的には次のように書きます。

プログラム

//--------------------------------------------------------
// 計算と物体の描画
//--------------------------------------------------------
void Calculate(){
  t = dt * double(tn);
  file1 << t << " " << ball1.x << " " << ball1.vx << " " << ball1.ax <<endl;
  //速度の算出
  ball1.vx = ball1.vx + ball1.ax * dt;
  ball1.vy = ball1.vy + ball1.ay * dt;
  ball1.vz = ball1.vz + ball1.az * dt;
  //位置の算出
  ball1.x = ball1.x + ball1.vx * dt;
  ball1.y = ball1.y + ball1.vy * dt;
  ball1.z = ball1.z + ball1.vz * dt;
 tn++;
}

インスタンス「file1」に左から順番に「t」「 (スペース)」「ball1.x」「 (スペース)」「ball1.vx」「 (スペース)」「ball1.ax」「endl(改行)」を入れることで、意図どおりファイル出力することができます。プログラムの実行が終了するまでの間の出力し続けます。 このようなスペースで区切られたデータは、SSVデータ(Space-Separated Values)呼ばれます。 スペースのほかには、カンマ区切り(CSV)タブ区切り(TSV)などもあります。

出力結果(ファイル名:ball1.data)

0 0 0 1
0.01 0.0001 0.01 1
0.02 0.0003 0.02 1
0.03 0.0006 0.03 1
・・・

数値データのグラフへのプロット

gnuplot を利用して数値データをプロットします(参照:【0.1日目】グラフ作成ソフト gnuplot のインストールと使い方 )。上記で出力した数値データファイル「ball1.data」を gnuplot の実行ファイルがある場所(「C:\gnuplot/bin/」)に移動します。gnuplot のコマンドでテンプレートを読み込ませて、グラフを出力します。

テンプレート(ファイル名:ball1.plt)

plot "ball1.data" using 1:2 with line ,\
 "ball1.data" using 1:3 with line ,\
 "ball1.data" using 1:4 with line 

「ball1.data」にある数値データをプロットします。 「using 1:2」は、タブ区切りされたデータの「1列目」対「2列目」をプロットせよ、「width line」は、点を直線で結べという命令になります。 上記では、「using 1:2」で t-x グラフ、「using 1:3」で t-v グラフ、「using 1:4」で t-a グラフをプロットします。

gnuplot コマンド

テンプレートファイル「ball1.plt」を gnuplot の実行ファイルがある場所(「C:\gnuplot/bin/」)に移動します、gnuplot コマンドで、次のコマンド入力します。

load "ball1.plt"

出力結果

gifファイルの生成テンプレート(ファイル名:ball1_.plt)

出力されたグラフを gif 形式の画像ファイルとして保存する場合には、テンプレートを次のようにします。

set terminal gif
set output 'ball1.gif'
plot "ball1.data" using 1:2 with line ,\
 "ball1.data" using 1:3 with line ,\
 "ball1.data" using 1:4 with line 

eps ファイルの生成テンプレート(ファイル名:ball1_.plt)

出力されたグラフを eps 形式の画像ファイルとして保存する場合には、テンプレートを次のようにします。

set term postscript eps enhanced color 'Times-Roman' 24
set output 'ball1.eps'
plot "ball1.data" using 1:2 with line ,\
 "ball1.data" using 1:3 with line ,\
 "ball1.data" using 1:4 with line 

「'Times-Roman' 24」は、フォントとサイズを指定します。

VisualC++ と OpenGL を利用した仮想物理実験室

第0章 仮想物理実験室の構築

第1章 様々な運動

第2章 ニュートンの運動方程式

第3章 剛体の運動(エネルギー保存則と運動量保存則)

付録

  • 【A-1】参考文献
    ・(A-1-1)OpenGL について
    ・(A-1-2)VisualC++ について
    ・(A-1-3)物理シミュレーション
    ・(A-1-4)数値計算

未分類

力学

量子力学

波動論



▲このページのトップNPO法人 natural science トップ

関連記事

コンピュータ・シミュレーション講座 授業日誌







仮想物理実験室







▲このページのトップNPO法人 natural science トップ




Warning: mysqli_connect(): (28000/1045): Access denied for user 'xsvx1015071_ri'@'sv102.xserver.jp' (using password: YES) in /home/xsvx1015071/include/natural-science/include_counter-d.php on line 8
MySQL DBとの接続に失敗しました