Open Dynamics Engine


テキスト出力

標準データ

モード表

モード内容既存ファイル有り既存ファイル無し
"r"読込専用正常エラー
"w"書込専用上書き新規作成
"a"追加書込専用データ追加新規作成
"r+"読込と書込正常エラー
"w+"書込と読込上書き新規作成
"a+"読込と追加書込データ追加新規作成

書込例

// ファイル出力ポインタ
FILE *fp;
fp=fopen("data.txt","a");
if(fp==NULL){
	printf("failure\n");
	exit(-1);
}
fprintf(fp,"データ出力:%d	%2.2f",i,x);
fclose(fp);

バイナリデータ(標準の物よりデータ読み書き速度が速い)

モード表

モード内容既存ファイル有り既存ファイル無し
"rb"バイナリデータ読込専用正常エラー
"wb"バイナリデータ書込専用上書き新規作成
"ab"バイナリデータ追加書込専用データ追加新規作成
"rb+"バイナリデータ読込とバイナリデータ書込正常エラー
"wb+"バイナリデータ書込とバイナリデータ読込上書き新規作成
"ab+"バイナリデータ読込とバイナリデータ追加書込データ追加新規作成

書込例

  • fwrite
    size_t fwrite(const void *buf,size_t size,size_t n,FILE *fp);
    buf:	書き込むデータ群(配列)へのポインタ
    size:	書き込む1データのサイズ (バイト単位)
    n:	書き込む最大データ数(配列の大きさ)
    fp:	FILE構造体へのポインタ
fp=fopen("text3.dat","ab");
if(fp==NULL){
	printf("failure\n");
	exit(1);
}
	// short型(2バイト)のデータ100個(配列buf[100])をファイル入力
	fwrite(&buf,sizeof(short),100,fp);
}
fclose(fp);

読込例

  • fread
    size_t fread(void *buf, size_t size, size_t n, FILE *fp);
    buf:	データの格納配列
    size:	1データのサイズ (バイト単位) 
    n:	読み出す最大データ数(配列数) 
    fp:	FILE 構造体へのポインタ
    戻り値:	実際に読み出されたデータ数を返します。
fp=fopen("text3.dat","rb");
if(fp==NULL){
	printf("failure-data.dat\n");
	exit(1);
}	
while(1){
	// short型(2バイト)のデータを10個ずつの一括読み出しを繰り返し
	// 一括で読み出されたデータ数が10個に足りていないとき,繰り返し終了
	if(fread(&buf2,sizeof(short),10,fp) != 10){	
		break;
	}
}
fclose(fp);

GNUPLOT出力(グラフ描画)

GNUPLOTとは,無料配布されているグラフ描画ソフトウェアである.ここでは,CプログラムからのGNUPLOTの操作方法を紹介する.

2d.jpg3d.jpg
2次元グラフ3次元グラフ

GNUPLOTのインストール

順序内容
1GNUPLOTの公式HPより『gp400win32.zip』をダウンロードしてください.
2『gp400win32.zip』を解凍し,『gnuplot』フォルダを『c:\』に置いてください.

グラフの表示するためのCプログラム内における記述方法

 グラフの表示方法は,2種類の方法「system()」「popen()」がある.しかし,ここではODEの計測に利用しやすい「system()」に注目する.  「system()」は,Cプログラムから外部プログラムを起動させる方法であり,グラフ表示させたいデータ群が決定されているときにまとめて一括でグラフ表示するのに有効な方法である.

  • 宣言部
    #include <stdlib.h>
  • main部
    『sample.plt』はGNUPLOTのコマンドファイルであり,そこに書かれているコマンドが実行されることとなる.ここで気をつけることは,実行ファイルの場所指定表記を『c:\gnuplot\bin\』ではなく『c:/gnuplot/bin/』である.
// 一瞬描画ウィンドウが現れ,消えてしまう.
system("c:/gnuplot/bin/wgnuplot.exe sample.plt");

または,

// 『-persist』により描画ウィンドウが表示され続く.
// ただし,Cプログラムの処理は待機になる.
system("c:/gnuplot/bin/wgnuplot.exe -persist sample.plt");

または,

// 実行ファイルを『wgnuplot.exe』から『pgnuplot.exe』に変更すると,
// 描画が表示され続け,かつ,Cプログラムの処理も進む.
system("c:/gnuplot/bin/pgnuplot.exe -persist sample.plt");

//『-persist』と『/noend』は同様のオプションコマンド.
system("c:/gnuplot/bin/pgnuplot.exe /noend sample.plt");

GNUPLOTの描画コマンドを記述するPLTファイル(例:『sample.plt』)

 以下のコードは,GNUPLOTを動作させるためのコードである.system()の場合は,まずテキストファイルを作成して,以下のコードを記述し,名前を「sample.plt」に変換して利用してください._popen()の場合は,以下のコードを直接ODEプログラム内に記述して利用することとなります.

2次元グラフのためのPLTファイル作成方法

  • 『2d_graph.plt』の例
    set title "Graph Title"	# グラフタイトル
    set xlabel "Time [sec]"	# 横軸のタイトル
    set ylabel "Position [m]"	# 縦軸のタイトル
    set xzeroaxis
    set yzeroaxis
    set xrange [0:20]		# X軸の範囲
    set yrange [-10:+10]	# Y軸の範囲
    set xtics axis 2.		# X軸の目盛間隔
    set ytics axis 5.		# Y軸の目盛間隔
    set key box		# マーカー説明ボックスの位置指定
    set key right bottom	# マーカー説明ボックスの位置指定
    
    #ウィンドウ描画出力コマンド
    plot "data1.dat" using 1:2 title "A",\	# ファイルの2列目を縦軸,名前を「A」(1列目は自動的に横軸)
    "data1.dat" using 1:3 title "B",\		# ファイルの3列目を縦軸,名前を「B」(1列目は自動的に横軸)
    "data1.dat" using 1:4 notitle with lines linetype 0 linewidth 1,\	
    					# ファイルの4列目を縦軸,名前を「C」(1列目は自動的に横軸)
    "data2.dat" using 1:5 "D" with lines linetype 1 linewidth -1,\	
    					# ファイルの5列目を縦軸,名前を「D」(1列目は自動的に横軸)
    "data2.dat" using 1:6 title "E"		# ファイルの6列目を縦軸,名前を「E」(1列目は自動的に横軸)

『using 1:2』は『data.dat』の一列目(x座標)と二列目(y座標)に対応.『using 1:3』は『data.dat』の一列目(x座標)と三列目(y座標)に対応.『""』はマーカー名.『with lines』を付加することで線描画.

  • 『data.dat』の作成方法(Cプログラム内に記述)
    if(t>=2 && t<8){
    	fp=fopen("data.txt","a");
    	if(fp==NULL){
    		printf("failure\n");
    		exit(1);
    	}	
    	fprintf(fp,"%f	%f	%f\n",t,a[0],a[1]);
    	fclose(fp);
    }
  • 上記のCプログラムによりファイル出力される『data.dat』の例
    1列目	2列目	3列目
    0.00	1.01	0.56
    0.01	1.01	0.56
    0.02	1.02	0.58
    0.03	1.03	0.57

3次元グラフのためのPLTファイル作成方法

  • 『3d_graph.plt』の例
set xlabel "Axis1 [s]"	# X軸のタイトル
set ylabel "Axis2 [m]"	# Y軸のタイトル
set zlabel "Axis3 [N]"	# Z軸のタイトル
set xrange [ 0.0:+3.0]	# X軸の範囲
set yrange [-1.0:+1.0]	# Y軸の範囲
#set xtics axis 0.1	# X軸の目盛間隔
#set ytics axis 0.05	# Y軸の目盛間隔
#set xtics/ytics axisは不具合の可能性有.  
set hidden3d

# メッシュ描画が可能
splot "data1.dat" u 1:2:3  title "A" with lines linetype 1 linewidth 1, \
"data1.dat" u 1:2:4  notitle with lines linetype 7 linewidth 1
  • 『data1.dat』の作成方法(Cプログラム内に記述)
    if(t>=2 && t<8){
    	fp=fopen("data1.txt","a");
    	if(fp==NULL){
    		printf("failure\n");
    		exit(1);
    	}	
    	fprintf(fp,"%f	%f	%f\n\n",t,a[0],a[1]);
    	fclose(fp);
    }
  • 上記のCプログラムによりファイル出力される『data1.dat』の例
    メッシュ描画をするには,データ記録を一行間隔にする必要がある.
    1列目	2列目	3列目
    0.00	1.01	0.56
    
    0.01	1.01	0.56
    
    0.02	1.02	0.58
    
    0.03	1.03	0.57

EPS(画像)ファイル出力のためのPLTファイル作成方法


上記に紹介したPLTファイル作成方法の後に,付加してください.

set term postscript enhanced color 
set output "graph.ps"	# 『graph.ps』という名前で出力
replot			# 再描画コマンド

画像出力(BMPファイル)→動画作成(MPGファイル)

 「fileBMP.h」と「fileBMP.cpp」をプロジェクトに追加し,以下のプログラムコードをメインCPPファイルに付加してください.それにより,特定の時間間隔でBMPファイルを連続出力できます(ファイル名は連番).

動画作成方法(BMP→AVI→MPG)

連番出力されたBMPファイル群をAVIMakerにより,動画ファイル(AVI)を作成する(この時,時間間隔FPSの単位に気をつけてください).その後,フリーソフトウェアTMPGENCによって,MPGに変換すると良い.
この方法以外に,デスクトップキャプチャーなど描画ウィンドウを動画として直接保存するソフトウェアもあるが,パソコン性能により不規則な時間間隔な動画として保存されてしまう問題点がある(画像が飛んでしまう).ここで紹介する方法は,まず特定の時間間隔で画像ファイルを出力し,その後,画像ファイルを結合し動画ファイルにしているので確実に規則的に表示される動画となる.

#include "BMP.h"
char filename[10]="000.bmp";	// 「000〜999」の連番となるファイル
int bmp_flag=1;			// BMPファイル出力フラッグ
double bmp_time=0.;		// BMPファイル出力の時間間隔
【描画コードの直後に記述】
// BMPフラッグが立ち,特定時間範囲(0〜10秒)の時,BMPファイルを連番で出力
if(bmp_flag==1 && ((t>=0)&&(t<10))){
	bmp_time=bmp_time+dt;
 
	// BMPファイル出力時間間隔(FPSに相当)
	if(bmp_time>0.10){			
		bmp_time=0;		// 初期化
 	
		WriteBMP(filename,640,480);	// BMPファイルを出力

		// ファイル名を連番にする
		filename[2]++;
		if(filename[2]=='9'+1){
			filename[2]='0';
			filename[1]++;
			if(filename[1]=='9'+1){
				filename[1]='0';
				filename[0]++;
			}
		}
	}
}

連続写真の作成方法(連番のBMPファイル→連番のJPGファイル→1枚の連続写真)

 連続写真の作成方法は,面倒だが複数のフリーソフトを利用している.

手順ソフトウェア名説明
1縮小専用。
(フリーソフト)
BMPファイルからJPGファイルに一括変換する.
2一発!切り抜き
(フリーソフト)
連番の画像ファイルから特定の範囲を切り抜く.
3Jointogether
(フリーソフト)
連番の画像を貼り合せ,1枚のファイルにする.
4Photoshop
(市販ソフト)
時間経過など必要な情報を画像に書き込む.


renban.jpg

添付ファイル: filerenban.jpg 1107件 [詳細] file2d.jpg 930件 [詳細] file3d.jpg 935件 [詳細] file3d_graph.plt 603件 [詳細] file2d_graph.plt 619件 [詳細] fileBMP.cpp 2028件 [詳細] fileBMP.h 1883件 [詳細]

トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-10-14 (日) 14:52:20 (3690d)