如何在C ++中实时绘制Gnuplot中的图形?

时间:2010-12-15 00:40:41

标签: c++ real-time gnuplot

我正在尝试使用GNUplot和C ++实时绘制图表。 有谁知道这样做的任何好的图书馆? 感谢

5 个答案:

答案 0 :(得分:4)

gnuplot支持通过管道输入(在Windows上,有一个单独的可执行文件,pgnuplot)。然后你的程序可以向gnuplot发送新命令,例如replot,就像你直接在gnuplot接口中输入它们一样。

如何设置管道连接并从C ++程序写入管道的发送端因操作系统而异,因此如果您需要更多帮助,则必须告诉我们您正在使用的是什么。

在Windows上,有CreatePipe,然后您设置传递给hStdInput的{​​{1}}结构的STARTUPINFO元素。如果您需要来自CreateProcess的状态消息,则与hStdOutput同上。

在POSIX(Unix,Linux,Mac OSX等)上,您可以使用pgnuplot作为获得单向连接的快捷方式。对于双向,它更像是在Windows上运行:popen来获取目标的句柄,然后是pipe,并在子进程中调用fork以将stdin和stdout与管道关联,然后{ {1}}让dup2替换子进程,保留您设置的管道。

编辑:来自the gnuplot documentation

  

特殊文件名' - '指定   数据是内联的;即,他们   按照命令。只有数据   按照命令; 情节等选项   过滤器,标题和线条样式   保留在 plot 命令行中。这个   类似于<<在unix shell脚本中,   和VMS DCL中的$ DECK。数据是   输入好像正在阅读   从一个文件,每个数据点   记录。字母“e”在开头   第一列终止数据   条目。可以应用使用选项   这些数据 - 使用它来过滤   他们通过一个功能可能会   感觉,但可能选择列   不!

答案 1 :(得分:3)

您是否尝试了gnuplot interfaces in ANSI C ?,这是C的接口,但在相同的链接中有一些C ++接口。或者您可以尝试PlPlot

答案 2 :(得分:1)

如果您对软实时绘图感兴趣,那么您可能最好使用硬件加速图形API(例如OpenGL),并自己绘制图表。

答案 3 :(得分:1)

查看http://search.cpan.org/~dkogan/feedGnuplot-1.08/bin/feedGnuplot这是一个命令行实用程序,但如果从程序控制,也可以正常工作。

答案 4 :(得分:0)

在我的C ++代码中,这有效(在mac OsX mavericks上,使用g ++ Apple LLVM 5.0版):

#include <sys/types.h>
#include <unistd.h>

...

// ready to make a plot

pid_t childpid=fork();
if(childpid==0) {
  // child process makes plot
  std::FILE* pipehandle=popen("gnuplot -persist","w");
  // make some plot. You can send multiple commands to the pipe each ending in \n
  std::fprintf(pipehandle,"plot \"results.txt\" using 1:2 with lines\n");
  std::fprintf(pipehandle,"quit\n");
  std::fflush(pipehandle);
  std::fclose(pipehandle);
  // child process exits
  exit(0);
}
// parent process waits for child process to exit
waitpid(childpid,NULL,0);

// you can now repeat to make other gnuplots; all will appear simultaneously in the 
// terminal and are persistent after the parent process has finished.