• ベストアンサー

逐次的なグラフ表示の方法

こんにちは、C言語においてグラフを表示することで質問があります。 いま、時間で変化していくある値を(x、y)をfprintfで出力し、datファイルに保存しました。それをwgnuplotで表示すると、きちんと表示することができました。そこで質問なんですが、 時間T=0のときに、X=1、Y=1。 T=1のときに、X=2、Y=2とY=Xの関係で変化していったとすると、直線であらわされますよね? それを、グラフ上で時間が経過していくと、点として右上に動いて行くように、視覚的に見ることはできるんでしょうか? いろいろとフリーソフトなどを探したのですが、よくわかりませんでした。。何か知っていたらお願いします。あるいは、C言語では逐次的に表現などできないとか、そういったアドバイスもあればお願いします。 すぐに返信できないかもしれませんが。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.11

あぁ、魚の群れの行動というのだから、たとえば、魚一匹ごとに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; }

kenpanch7
質問者

お礼

すいません。 myprogram.exeの実行ファイルは簡単に、みつかりました。 debugフォルダの中にありました。 ただ、myprogram | pgnuplotとうったんですが、 pgnuplotは内部コマンド、または、外部コマンド、操作可能なプログラムまたは、パッチファイルとして認識されません。と表示されてしまいました。 どのようにしたらいいでしょうか。

kenpanch7
質問者

補足

すいません。変換ミスです。群行動が正しいです。 私は、VC++を使ってC言語をくんでいますが、 実行すると、#include <unistd.h>がどうもひっかかるみたいでした。 そこで、ヘッダファイルを適当に?どうにかしてみたところ。 (人が作っていたものをコピーして、インクルードフォルダにコピペしてみた) 実行をすることができました!! ただ、コマンドラインで打ち込む方法がわからなかったので、 myproglam | pgnuplot をできませんでした・・・汗 アクセサリからコマンドプロントを探し、プログラムのあるファイルに移動して、myproglam | pgnuplotとは 入力してみたのですが、うまくいかなかったようです。 実行ファイルはプログラムとは違うところに保存されるのでしょうか。 実行して同じフォルダにできた拡張子をみてみると、 プロジェクトファイル、ncb,,opt,と書いてありました。 そこで、LINUXで動かしたのですが、gccでコンパイルして、 みると、a.out と言うのができたのですが。 myproglam | pgnuplot と打ってもcannot found しかでませんでした。 この↑記述の意味がよくわからないので、、、 a | pgnuplot とか、、、いろいろしてみたのですが、、ダメでした。 今からもう少し調べてみようと思っています。お返事ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (18)

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.8

議論する気はないんですけど^^; きっちりとした既存のプログラムが使えればOKでしょう。どうせ作っても、大体は自作のものよりすぐれていますよ(笑)それに、仕事でも、その作業がどれくらいの期間・コストでできるかを見積もるのに、どういうものが使えるのか調べるのがほんとのとこでしょう。すべて自作するコストを受注金額に含ませられるとしたら幸せなことですけどね^^ ところで、意味的には「群行動」のほうがぴったり来るような気がするんですが、学問的には「群行動」じゃなく、「郡行動」が正しいんですか?

全文を見る
すると、全ての回答が全文表示されます。
  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.7

ご参考:(サンプルプログラム) 以下のプログラムをコンパイル・リンクして実行ファイル(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; }

kenpanch7
質問者

補足

本当に親切にありがとうございます, いま,あまり深くよんでいないので,また近いうちに熟読してみたいと思います。この掲示板を読んだりしていると,C言語の奥深さに,, たじたじです。学校の授業のレベルがまだまだだなと感じさせられました。少しがんばってみたいと思います。 本当にありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • don_go
  • ベストアンサー率31% (336/1059)
回答No.6

ANo,3補足 元質問者がどういった事情(趣味、学校の課題、仕事)で 必要としているか判りませんが、少なくとも仕事の場合 であれば、自力(自社内または協力会社を含む)で作成が 可能か否かをまず判断します。 既存の物で利用できる物があるかどうかを探すのはその 後の事になります。 仕事を受けた後になって、「Web検索してみたけれど使え そうな物がなかったからできません」といった言い訳など プロの仕事としては通用しません。 ....で、どういう事で必要としているのでしょうか? #趣味、学校の課題、仕事、その他

kenpanch7
質問者

補足

私は,今,大学の四年生で,学校の課題というか,研究テーマ(郡知能)を与えられ,それに関する論文をよみ,その論文に書いてある式をもとに,魚の郡行動の動きをC言語で作っているところでした。 魚が動く点を求めることはできたのですが,それを魚が動いてるように見せたいなと思い,今回のような質問をいたしました。 というような感じです。たしかに仕事では通用しない世界とわたしも思います。 ご回答ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
  • don_go
  • ベストアンサー率31% (336/1059)
回答No.5

C言語でどういった物が作られているかを知ってさえ いれば、別に自分が作れる必要はないのですが... #とりあえず、折れ線グラフの逐次表示であれば以前に #UNIX C(Motif)を使って作成した事が有ります。 折れ線グラフの表示程度であれば、座標軸とデータの 範囲に応じた目盛やデータの表示位置を計算して出力 すれば良いだけです。 その程度の計算であれば、高校数学の知識ぐらいでも 十分に作成可能です。 グラフ表示用ソフトを探すよりも、グラフ自体を表示 するのに必要な計算式、モジュールを探した方が結果 が出るのが早い様に思います。

全文を見る
すると、全ての回答が全文表示されます。
  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.4

自分で、ほんとに探して見つけられなければ、人に聞くのはいいことだと思いますよ。ほんとは存在するのに存在しないと思って、自分で作ろうとするのは、車輪の再発明で、労力の無駄でしょう(スキルアップのためなら別ですが)。 自分で全然探しもしないで人になんでも聞くのはどうかとは思いますけど^^ don_go さんって方は、「C言語を使えば大抵の物が作れる」能力の持ち主なんでしょうけどね(笑)

全文を見る
すると、全ての回答が全文表示されます。
  • don_go
  • ベストアンサー率31% (336/1059)
回答No.3

>フリーソフトなどを探したのですが、よくわかりませんでした。 求めている物がなければ、自分で作れば良いだけです。 >C言語では逐次的に表現などできないとか C言語を使えば大抵の物は作れます。 #作る人の能力・期間しだいですが...

全文を見る
すると、全ての回答が全文表示されます。
  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.2

補足: gnuplot のインストールフォルダの bin フォルダの下に pgnuplot というのがある(wgnuplot とは違う)ので、それを使えばできるでしょう。 > myprogram | pgnuplot

全文を見る
すると、全ての回答が全文表示されます。
  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.1

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から呼べる関数として提供されているグラフアプリケーションがあればもっとやりやすいですけどね。わたしは適当なものを知りません^^;

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Excelのグラフの書き方について

    軌道の変化を見るためにグラフを作りたいのですが、別のソフトで出てくるデータをエクセルに移すと、 X1Y1 X2Y2 X3Y3・・・X99Y99 X100Y100といった形で並びます。これは1秒後にXとYがどのように変化していくかといったデータです。 分かりにくいと思いますが、これが横軸で更に縦に200個くらいずつ座標が表示されます。 グラフを作っていたのですが、自分の作り方は まずX1とY1についてのグラフを作り(A1からA200のX座標とB1からB200までのY座標をグラフ化)、その瞬間の軌道を表示させます。 次にそのグラフを右クリックして、オプションでグラフの追加をクリックして、X2Y2に関する軌道を表示させます。 つまりグラフの追加画面でX軸項目にC1からC200まで、Y軸項目にD1からD200と入れます。 これを繰り返すことで、一つのグラフ内にいくつも軌道を表示してます。一定の時間が経過するごとにどのように軌道が変化していくかを一つのグラフで表すためにこの方法をとっています。 非常に説明が分かりづらいかもしれません・・・ でもこの方法だと一度作ってしまえば次回からは数値の部分をコピーアンドペーストで変えるだけでいろんな軌道変化を表示させることが出来るんですが、今回は横軸が200個以上あり、一つずつグラフの追加でインプットするのが非常に大変なのですが、 この方法より簡単に出来る方法を知っている方がいましたら教えていただきたいです。 つまりX1Y1Y2Y3Y4Y5Y6・・・Y100だったらXが固定なので一回で全てのデータを一つのグラフに書き表せると思うのですが、 今回はXもYが変化するに応じて変化していってしまうということで悩んでます。 エクセルでなくてもX1Y1 X2Y2・・・などを簡単に一つのグラフに表せるフリーソフトがあれば教えていただきたいです。 また上記のように一つのグラフにいくつもの散布図を表し、一つのグラフ内に何本も線があるようにした場合、毎回散布図に表すと、一つのデータずつ色が変わってしまいます。 線の太さも色も同じにしたいので、毎回1系列ごとに書式を直しています。 これを一度でやる方法ってありますか?書式設定をグラフ内の全てに適用する方法を知っている方もいましたら教えてください。

  • 二次関数のグラフで

    直線x=-1とx>0とx軸で区切り、右上から半時計回りにA~Dと名付けたとき(境界線は含まない)y=x^2+ax+1(aは定数)のグラフがAとBを通り、CとDは通らないaの範囲を求める問題なんですが、解説お願いします 分かりにくくてすみません…

  • 6次関数のグラフから各係数の符号を知る方法

    6次関数y=f(x)=ax^6+bx^5+cx^4+dx^3+ex^2+fx+g のグラフがxy平面に描かれているとします。そのグラフから各係数の符号を、計算しないで視覚的に知る方法を考えたいのです。 x≒0のとき、y≒ex^2+fx+gなので、(0,f(0))の近傍でのグラフの様子から視覚的にe,f,gの符号を知ることができます。 つまり、y軸との交点がy>0なら、g>0。 グラフが右上がりなら、f>0。 グラフが下に凸なら、e>0。 |x|が十分大きいとき、y≒ax^6+bx^5≒a(x+b/6a)^6なので、グラフの大域的な様子から視覚的にa,bの符号を知ることができます。 つまり、大域的に「U字型」の形なら、a>0。 大域的に、いわゆるグラフの「軸」がy軸より左にあれば、b/6a>0。 c,dの符号を視覚的に知るようなアイデアがありましたら教えてください。

  • 2次関数グラフについて

    2次関数グラフについて お恥ずかしいことですが、以下の問題を解くことが出来ません。 出来る限り易しくお教えください。 (1)2点 A(0,1)とB(1,0)を通る直線上の点C(2,α)を放物線のグラフ y=x2乗+βは通る。αとβを求 めよ。 (2)2点 A(-1,1)とB(1,0)を通る直線上の点C(2,α)を放物線のグラフ y=x2乗+X-βは通る。  αとβを求めよ。 以上よろしくお願い致します。

  • グラフの概形をしめす??

    y=x^3+xのグラフの概形を示せと言う問題の解説に「y’=3x^2+1より、全ての実数xに対してy'>0である。したがってこの関数は増加関数であるがy'=0となることがない。また、この関数のグラフは原点に関して対称である。関数の増減だけからこのグラフの形の細かい点について知ることはできないがx=0のときy'=1であることからグラフが原点で直線y=xに接していることがわかる。」とあったのですが、なぜいきなり「この関数のグラフも原点に関して対称である」ということができるのでしょうか?グラフが原点に関して対象ではなく、値は分からないけどx≠0ではないどこかのxの値に関して対称でグラフが原点で直線y=xに接しているということもありえるのではないか?と思えてしまいます・・  お願いします!教えてください!

  • グラフの問題についてですが

    y=x^2 と y=x+6 の交点をA,C y=x^2 と y=x の交点をBと置いたとき A(-2,4) , B(1,1) , C(3,9) となるグラフで 点Aを通り、△ABCの面積を二等分する直線の式がわかりません。 三平方の定理を使わない解き方でお願いします。

  • グラフ表示

    例えば下記のような式を、グラフ表示してみたいのですが できるフリーソフトはありますか。 f(x,y)=xy/(x*x + y*y),(x,y)≠(0,0),f(0,0)=0

  • 両対数グラフでも通常のグラフでも直線に見える関数

    大学の授業でとあるデータをコンピュータでプロットしたのですが、それがよくわからなくて困っています。 両対数グラフで表示しても通常のグラフで表示しても直線に見えるのです。 通る点のうち二つは(1,9.85)(38,265.99)で、通常のグラフでの式を求めてみるとy=6.9227x+2.9273となりました。 グラフで直線に見えるといってもどちらでも微妙に歪んでいて、それがカギかと思うのですが、まったく分かりません。 どうしてこのデータのグラフはそう見えるのでしょうか。 確証がない説でもいいので、教えてください。

  • 4次多項式のグラフ

    4次多項式のグラフをEXCELで書く問題で困っています。 式と完成したグラフはあるのですが、なぜこのグラフになるのか分かりません。 式:F(t)=t^4/4-2*t^3+11*t^2/3-6*t グラフ:y軸が-100~900まで100目盛りづつ、x軸は0~10まで1目盛りづつ グラフにはF(t)とf(t)、2つのグラフがあります。 F(t)は式が与えられているのでなぜこのグラフになるのか理解できますが、f(t)は式もないしなぜこのグラフになるのかわかりません。 f(t)はF(t)のy軸と同じ値(0)から始まりy軸の200辺りで収まっています。 F(t)を計算すると F(t) x軸 0→y軸 0 x軸 1→y軸 -4.0833 x軸 2→y軸 -9.3333 x軸 3→y軸 -18.75 x軸 4→y軸 -29.333 x軸 5→y軸 -32.083 x軸 6→y軸 -12 x軸 7→y軸 51.916 x軸 8→y軸 186.66 x軸 9→y軸 425.25 x軸10→y軸 806.66 になります。 数学は得意ではないので説明が分かりにくいですが、よろしくお願いいたします。

  • グラフの書き方

    工学部の1年です。 周期的に変化する電場での電子の運動を表す式のグラフの書き方が分かりません。 グラフの書き方なのでこのカテゴリーで質問させて頂きます。 mω^2/eE・x(t)=-sinωt+ωt mω^2/eEやωは定数です。 y=ωtに対して振動する-sinωtのグラフになるのですが、その考え方や書き方が分かりません。 回答よろしくお願いします。