- ベストアンサー
逐次的なグラフ表示の方法
こんにちは、C言語においてグラフを表示することで質問があります。 いま、時間で変化していくある値を(x、y)をfprintfで出力し、datファイルに保存しました。それをwgnuplotで表示すると、きちんと表示することができました。そこで質問なんですが、 時間T=0のときに、X=1、Y=1。 T=1のときに、X=2、Y=2とY=Xの関係で変化していったとすると、直線であらわされますよね? それを、グラフ上で時間が経過していくと、点として右上に動いて行くように、視覚的に見ることはできるんでしょうか? いろいろとフリーソフトなどを探したのですが、よくわかりませんでした。。何か知っていたらお願いします。あるいは、C言語では逐次的に表現などできないとか、そういったアドバイスもあればお願いします。 すぐに返信できないかもしれませんが。よろしくお願いします。
- みんなの回答 (19)
- 専門家の回答
質問者が選んだベストアンサー
あぁ、魚の群れの行動というのだから、たとえば、魚一匹ごとに3次元の点であらわして、それを gnuplot で描画してみようってことですよね、たぶん^^ 以下のプログラムをコンパイル・リンクして実行ファイル(myprogram.exe という名前だったとします)を作成し、 myprogram | pgnuplot とコマンドラインで打ち込むと、点のかたまりが3次元で動いていくように見えると思います。 === #include <stdio.h> #include <unistd.h> typedef struct Point { float x, y, z; } Point; void advance(size_t n, Point points[], Point *v) { size_t i; for (i = 0; i < n; ++i) { points[i].x += v->x; points[i].y += v->y; points[i].z += v->z; } } int main(void) { Point points[] = { { 0.0, 0.0, 0.0 }, { 0.0, 0.0, 1.0 }, { 0.0, 1.0, 0.0 }, { 1.0, 0.0, 0.0 }, { 0.0, 1.0, 1.0 }, { 1.0, 0.0, 1.0 }, { 1.0, 1.0, 0.0 }, { 1.0, 1.0, 1.0 }, }; size_t n = sizeof points / sizeof points[0]; const int m = 90; int i, j; Point v = { .1, .1, .1 }; puts("set xrange [0:10]"); puts("set yrange [0:10]"); puts("set zrange [0:10]"); for (i = 0; i < m; ++i, advance(n, points, &v)) { puts("splot \'-\' with point"); for (j = 0; j < n; ++j) printf("%f %f %f\n", points[j].x, points[j].y, points[j].z); puts("e"); fflush(stdout); sleep(1); } return 0; }
その他の回答 (18)
- mikaemi
- ベストアンサー率50% (33/65)
議論する気はないんですけど^^; きっちりとした既存のプログラムが使えればOKでしょう。どうせ作っても、大体は自作のものよりすぐれていますよ(笑)それに、仕事でも、その作業がどれくらいの期間・コストでできるかを見積もるのに、どういうものが使えるのか調べるのがほんとのとこでしょう。すべて自作するコストを受注金額に含ませられるとしたら幸せなことですけどね^^ ところで、意味的には「群行動」のほうがぴったり来るような気がするんですが、学問的には「群行動」じゃなく、「郡行動」が正しいんですか?
- mikaemi
- ベストアンサー率50% (33/65)
ご参考:(サンプルプログラム) 以下のプログラムをコンパイル・リンクして実行ファイル(myprogram.exe という名前だったとします)を作成し、 myprogram | pgnuplot とコマンドラインで打ち込むと、(0,0)から(9,9)までの y=x のグラフが表示されるます(カレントフォルダとpgnuplot.exeがインストールされているフォルダにパスが通っている仮定して。パスの通し方がわからなければ、カレントフォルダからの相対パスあるいは絶対パスでmyprogramとpgnuplotを指定するといいです)。 ・sleep() は経過状況が目で見てわかるように入れているだけです。 ・xrange、yrange の設定は、途中で目盛りが変わると見にくいので設定しているだけです。 ・グラフ表示させたいデータを一度ファイル(aaa.txt という名前だとします)に保存してから plot 'aaa.txt' として描かせる(再描画の場合は replot と出力する)のでもいいですが、このサンプルでは、gnuplot へ与える指示と表示させたいデータもまとめて標準出力に出力しています(なので、こちらは、replot は使わず plot のみ使う)。 === #include <stdio.h> #include <unistd.h> int main(void) { struct Point { float x, y; } points[] = { { 0.0, 0.0 }, { 1.0, 1.0 }, { 2.0, 2.0 }, { 3.0, 3.0 }, { 4.0, 4.0 }, { 5.0, 5.0 }, { 6.0, 6.0 }, { 7.0, 7.0 }, { 8.0, 8.0 }, { 9.0, 9.0 }, }; const int n = sizeof points / sizeof points[0]; int i, j; puts("set xrange [0:9]"); puts("set yrange [0:9]"); for (i = 0; i < n; ++i) { puts("plot \'-\' with linespoint"); for (j = 0; j <= i; ++j) printf("%f %f\n", points[j].x, points[j].y); puts("e"); fflush(stdout); sleep(2); } return 0; }
補足
本当に親切にありがとうございます, いま,あまり深くよんでいないので,また近いうちに熟読してみたいと思います。この掲示板を読んだりしていると,C言語の奥深さに,, たじたじです。学校の授業のレベルがまだまだだなと感じさせられました。少しがんばってみたいと思います。 本当にありがとうございました。
- don_go
- ベストアンサー率31% (336/1059)
ANo,3補足 元質問者がどういった事情(趣味、学校の課題、仕事)で 必要としているか判りませんが、少なくとも仕事の場合 であれば、自力(自社内または協力会社を含む)で作成が 可能か否かをまず判断します。 既存の物で利用できる物があるかどうかを探すのはその 後の事になります。 仕事を受けた後になって、「Web検索してみたけれど使え そうな物がなかったからできません」といった言い訳など プロの仕事としては通用しません。 ....で、どういう事で必要としているのでしょうか? #趣味、学校の課題、仕事、その他
補足
私は,今,大学の四年生で,学校の課題というか,研究テーマ(郡知能)を与えられ,それに関する論文をよみ,その論文に書いてある式をもとに,魚の郡行動の動きをC言語で作っているところでした。 魚が動く点を求めることはできたのですが,それを魚が動いてるように見せたいなと思い,今回のような質問をいたしました。 というような感じです。たしかに仕事では通用しない世界とわたしも思います。 ご回答ありがとうございます。
- don_go
- ベストアンサー率31% (336/1059)
C言語でどういった物が作られているかを知ってさえ いれば、別に自分が作れる必要はないのですが... #とりあえず、折れ線グラフの逐次表示であれば以前に #UNIX C(Motif)を使って作成した事が有ります。 折れ線グラフの表示程度であれば、座標軸とデータの 範囲に応じた目盛やデータの表示位置を計算して出力 すれば良いだけです。 その程度の計算であれば、高校数学の知識ぐらいでも 十分に作成可能です。 グラフ表示用ソフトを探すよりも、グラフ自体を表示 するのに必要な計算式、モジュールを探した方が結果 が出るのが早い様に思います。
- mikaemi
- ベストアンサー率50% (33/65)
自分で、ほんとに探して見つけられなければ、人に聞くのはいいことだと思いますよ。ほんとは存在するのに存在しないと思って、自分で作ろうとするのは、車輪の再発明で、労力の無駄でしょう(スキルアップのためなら別ですが)。 自分で全然探しもしないで人になんでも聞くのはどうかとは思いますけど^^ don_go さんって方は、「C言語を使えば大抵の物が作れる」能力の持ち主なんでしょうけどね(笑)
- don_go
- ベストアンサー率31% (336/1059)
>フリーソフトなどを探したのですが、よくわかりませんでした。 求めている物がなければ、自分で作れば良いだけです。 >C言語では逐次的に表現などできないとか C言語を使えば大抵の物は作れます。 #作る人の能力・期間しだいですが...
- mikaemi
- ベストアンサー率50% (33/65)
補足: gnuplot のインストールフォルダの bin フォルダの下に pgnuplot というのがある(wgnuplot とは違う)ので、それを使えばできるでしょう。 > myprogram | pgnuplot
- mikaemi
- ベストアンサー率50% (33/65)
Windows に Unix のパイプ機能みたいなのがあるんでしたっけ?そういうのがあれば、 % myprogram | gnuplot Cプログラム(myprogram)の中では、gnuplot へのコマンドを標準術力に出してやるだけでOKですが。。。 … FILE *fp = fopen("aaa.txt", "w"); fprintf(fp, ...); /* 表示させる数値を書き込む */ fflush(fp); printf("plot \'aaa.txt\'\n"); /* gnuplot への支持 */ fflush(stdout); fprintf(fp, ...); /* 追加の数値を書き込む */ fflush(fp); printf("replot\n"); fflush(stdout); … パイプのようなものがなければ(cygwin をインストールしても、Unix 環境を作ってもいいですが(笑))、Cプログラム内で gnuplot と接続するようにプログラムを組んで、上と同様のことをすればいいのではないかと思います。Cから呼べる関数として提供されているグラフアプリケーションがあればもっとやりやすいですけどね。わたしは適当なものを知りません^^;
- 1
- 2
お礼
すいません。 myprogram.exeの実行ファイルは簡単に、みつかりました。 debugフォルダの中にありました。 ただ、myprogram | pgnuplotとうったんですが、 pgnuplotは内部コマンド、または、外部コマンド、操作可能なプログラムまたは、パッチファイルとして認識されません。と表示されてしまいました。 どのようにしたらいいでしょうか。
補足
すいません。変換ミスです。群行動が正しいです。 私は、VC++を使ってC言語をくんでいますが、 実行すると、#include <unistd.h>がどうもひっかかるみたいでした。 そこで、ヘッダファイルを適当に?どうにかしてみたところ。 (人が作っていたものをコピーして、インクルードフォルダにコピペしてみた) 実行をすることができました!! ただ、コマンドラインで打ち込む方法がわからなかったので、 myproglam | pgnuplot をできませんでした・・・汗 アクセサリからコマンドプロントを探し、プログラムのあるファイルに移動して、myproglam | pgnuplotとは 入力してみたのですが、うまくいかなかったようです。 実行ファイルはプログラムとは違うところに保存されるのでしょうか。 実行して同じフォルダにできた拡張子をみてみると、 プロジェクトファイル、ncb,,opt,と書いてありました。 そこで、LINUXで動かしたのですが、gccでコンパイルして、 みると、a.out と言うのができたのですが。 myproglam | pgnuplot と打ってもcannot found しかでませんでした。 この↑記述の意味がよくわからないので、、、 a | pgnuplot とか、、、いろいろしてみたのですが、、ダメでした。 今からもう少し調べてみようと思っています。お返事ありがとうございます。