我是一名机械工程师,C 编程知识有限。我写了一些代码来进行模拟,我想可视化模拟结果。目前我正在使用它Dev-C
来编写我的代码。使用fopen
和fprintf
命令我生成一个.dat
包含结果的文件。然后我打开GNUPLOT
程序并导入我的.dat
文件来绘制结果。这需要时间,我必须等到模拟结束。有没有一种简单的方法可以将我的绘图仪与 连接Dev-C
,以便我的绘图仪在模拟期间开始绘制数据?任何图书馆等?
6 回答
既然您已经知道 gnuplot,那么最简单的做法可能就是从您的程序中调用 gnuplot 并将数据通过管道传递给它:
FILE *gnuplot = popen("gnuplot", "w");
fprintf(gnuplot, "plot '-'\n");
for (i = 0; i < count; i++)
fprintf(gnuplot, "%g %g\n", x[i], y[i]);
fprintf(gnuplot, "e\n");
fflush(gnuplot);
好的,当您写入文件时,一种解决方案是system()
在您写入文件时拨打电话,然后调用 gnuplot。
但是,这意味着您每次都应该更改文件名,但我担心如果您这样做,它看起来会不正确,因为您每次都发送少量数据。
http://www.gnu.org/software/libc/manual/html_node/System-Calls.html
我从未使用过 gnuplot,但如果您查看此页面 ( http://gnuplot-tricks.blogspot.com/ ),您可能会发现一些可以使其正常工作的技巧。
但是,我认为,除非您要自己绘制所有内容并跳过 gnuplot,否则您可能只需要等待,就像您一样。
您可能会发现 gnuplot 的 C 接口可以帮助您:
我一直在使用PLPlot从 C 中绘图,发现它既有效又简单。它是跨平台的、开源的,并支持丰富的绘图功能。我建议您查看示例以开始使用。
pbPlots 非常易于使用并且适用于所有 C 编译器。
从github 页面下载 pbPlots.c/h 和 supportLib.c/h并将它们包含在您的构建中。
这是一个完整的示例,它将在 PNG 文件中生成绘图。
#include "pbPlots.h"
#include "supportLib.h"
int main(){
double x [] = {-1, 0, 1, 2, 3, 4, 5, 6};
double y [] = {-5, -4, -3, -2, 1, 0, 1, 2};
RGBABitmapImageReference *imageRef = CreateRGBABitmapImageReference();
DrawScatterPlot(imageRef, 600, 400, x, 8, y, 8);
size_t length;
double *pngData = ConvertToPNG(&length, imageRef->image);
WriteToFile(pngData, length, "plot.png");
return 0;
}
还有更多可用的选项,这些在 github 页面上进行了描述。
我环顾四周,看看其他人在 gnuplot 中的实时绘图方面做了什么,发现了这个:
http://users.softlab.ntua.gr/~ttsiod/gnuplotStreaming.html
有一个小的 Perl 脚本可以驱动绘图,您只需将信息输入管道即可。
由于您的数据正在写入文件,您可能希望将其传输tail -f yourdata.dat
到实时绘图仪中。
此外,因为您正在使用 stdio 文件调用,所以您需要定期刷新(通过调用fflush
)
显然,您的模拟将在后台或另一个 shell 中运行。这样您就可以随时退出绘图而不会中断模拟。
希望这对你有一些用处。