2

基本的に座標を追跡するパーティクルシステムがあります。これまで、すべての座標をファイルに出力し、gnuplotスクリプトでプロットし、ffmpegを使用してPNGからビデオを作成していました。すべてのファイルI/Oをスキップするために、最初にOpenGLを試してみましたが、役に立たなかったので、gnuplotへのパイプを設定することを考えました。

私はMSVC2012でこのようにします:

FILE *gnuplotpipe = _popen(GNUPLOT_NAME, "w");
setvbuf(gnuplotpipe, NULL, _IONBF, NULL);
//setbuf(gnuplotpipe, NULL);
fprintf(gnuplotpipe,"set term png\n");
fprintf(gnuplotpipe,"set size 720, 480\n");
fprintf(gnuplotpipe,"set size ratio -1\n");
fprintf(gnuplotpipe,"unset key\n");
fprintf(gnuplotpipe,"set xrange [-%d:%d]\n", RANGE+100,RANGE+100);
fprintf(gnuplotpipe,"set yrange [-%d:%d]\n", RANGE+100,RANGE+100);
for(time-steps)
    //do stuff
    fprintf(gnuplotpipe,"plot '-'\n");
    for(all particles)
          // calculate coordinates
          fprintf(gnuplotpipe,"%f %f\n", particle[i]->x, particle[i]->y);
    end for
    fprintf(gnuplotpipe, "e\n");
    //fflush(gnuplotpipe);
end for
_pcloce(gnuplotpipe);

したがって、Linuxgnuplot -persistではpgnuplot -persist、、、、popenおよびの代わりに。pcloseを使用します。これはすでに多くの試行錯誤がありました。setbufsetvbuf

Linuxではかなり一貫しています。plot '-'タイムステップごとにコンソールにコマンドが表示され、その後、理解できないテキストが表示されます。何も開きません。Windowsでは、時々動作し、gnuplotの「MSWindows」ウィンドウでデータストリーミングを見ることができるので、驚くべきことです(つまり、コンソール出力ではなく、wgnuplot_pipes.exeを使用していないので、それ自体が驚くべきことです)。何もプロットされていません。ウィンドウが閉じます。それ以外の場合は、いくつかのタイムステップでプロットされますが、タイムステップごとに異なるウィンドウで表示されます。時々、それはクラッシュするか、それは機能しますが、理解できないテキストを送信します。

私はほとんどの場合100個のパーティクルを使用しています。10,000ものタイムステップを持つことができます。それが多いかどうかはわかりません。バッファをNULLに設定していますが、Windowsのカットオフなどが疑われます。私はVirtualBoxのWin7x64のMSVCとLinuxMintx64のQtで作業しています。gnuplot 4.7(win)と4.6.0.8(linux)を使用しています。私はSOをかなり広範囲に調べましたが、私が見つけた唯一の問題は-persist、Windowsでは実際には持続しないということでした。どんな助けでもいただければ幸いです。

4

1 に答える 1

1

質問に答えられないようにするためです。これは、x11ターミナルを備えたPythonバージョンのプロシージャです。それはばかげたアニメーションで単一のウィンドウを表示します。

ただし、他のドライバーがフレームごとにウィンドウを開こうとしても、まったく驚かないでしょう。

import subprocess
f=subprocess.Popen(['/usr/bin/gnuplot','-persist'],
                      stdin=subprocess.PIPE,shell=False)
f.stdin.write('set term x11 \n')
f.stdin.write('set yrange [-2:2]\n')
import math
i=0
d=1
count=0
while count<1000 :
 count+=1
 if abs(i)==50 : d *= -1
 i+=d 
 f.stdin.write('plot \'-\' with linespoints pt 4 ps 2 \n')
 for j in range(0,500):
  f.stdin.write('%f %f\n'%(float(j),math.sin(float(j)/float(abs(i)+1))))
 f.stdin.write('e\n')
于 2013-03-29T20:33:19.043 に答える