我是一名机械工程师,对于C编程只有有限的知识。我编写了一些代码来进行模拟,并且想要可视化模拟结果。目前我正在使用Dev-C
来编写我的代码。利用fopen
和fprintf
命令,我生成一个包含结果的.dat
文件。然后我打开GNUPLOT
程序并导入我的.dat
文件以绘制结果。这需要时间,我必须等待模拟结束。是否有一种简单的方法将我的绘图器与Dev-C
连接起来,以便在模拟期间开始绘制数据?是否有任何库或其他东西可以做到这一点?
我是一名机械工程师,对于C编程只有有限的知识。我编写了一些代码来进行模拟,并且想要可视化模拟结果。目前我正在使用Dev-C
来编写我的代码。利用fopen
和fprintf
命令,我生成一个包含结果的.dat
文件。然后我打开GNUPLOT
程序并导入我的.dat
文件以绘制结果。这需要时间,我必须等待模拟结束。是否有一种简单的方法将我的绘图器与Dev-C
连接起来,以便在模拟期间开始绘制数据?是否有任何库或其他东西可以做到这一点?
既然您已经熟悉了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);
set nokey;
可以移除烦人的图例。 - sitilge好的,一个解决方案是,在输出到文件时,使用system()
调用并调用gnuplot。
但这意味着您每次都应更改文件名,但我担心如果您这样做,它看起来不正确,因为您每次发送的数据量很小。
http://www.gnu.org/software/libc/manual/html_node/System-Calls.html
我从未使用过gnuplot,但如果您查看此页面(http://gnuplot-tricks.blogspot.com/),您可能会发现一些技巧可以使其正常工作。
但是,除非您打算自己绘制所有内容并跳过gnuplot,否则您可能只需要等待。
您可能会发现gnuplot的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中运行。这样,您可以随时退出绘图而不会中断模拟。
希望对您有所帮助。
使用C编程语言绘图的逐步解决方案:
第一步要求:1. Windows 10/11 64位操作系统 2. 安装 Eclipse IDE(CDT或科学计算)3. 安装MSYS2 4. 安装mingw64
,使用MSYS2并将其二进制路径添加到Windows环境变量中,作为C编译器所需的组件。5. 使用MSYS2安装mathgl
库:
第二步创建包含所需mathgl
库的Eclipse项目。
将所需库添加到项目中:
右键单击项目 -> 展开 C/C++ Build -> 设置 -> 展开 MinGW C 链接器(如果未展开) -> 库 -> 库 (-l) -> 添加...
在这里,您必须添加 mgl2
和 mgl2-fltk
:
第三步(最后一步)编写绘图代码:在项目下创建一个 .c 文件,并将以下代码写入其中。
#include <mgl2/mgl_cf.h>
//#include <mgl2/wnd_cf.h>
#include <mgl2/fltk.h>
#include <synchapi.h>
HMGL gr = NULL;//HMGL mgl_create_graph_fltk
int main(int argc,char **argv)
{
gr = mgl_create_graph_fltk(NULL, "First C graph", NULL, NULL);
double x[50]={0};
HMDT dat=mgl_create_data_size(50, 1, 1);
while(1)
{
Sleep(100);
mgl_clf ( gr) ;
mgl_set_range_val(gr, 'y', -1, 1);
mgl_set_range_val(gr, 'x', 0, 512);
mgl_set_origin(gr, 0, 0, 0);
// mgl_box(gr);
mgl_axis(gr, "", "", "");
mgl_set_font_size(gr, 1.5);
// mgl_grid(gr, a, "", "");
int i=0;
while(i<50)
{
x[i]=(mgl_rnd()*2)-1;
i++;
}
mgl_data_set_double(dat, x, 50, 1, 1);
// mgl_line(gr,0,0,0,2*mgl_rnd()-1,2*mgl_rnd()-1,0,"Ar2",-.5);
mgl_stem(gr, dat, "ro", "");
// mgl_wnd_update(gr);
}
return 0;
}
gnuplot
并导入数据所需的时间,还是gnuplot
本身绘图所需要的时间较长?如果是前者,您可以通过在模拟器本身中执行gnuplot
来轻松摆脱它。例如,在类 POSIX 的操作系统中,有exec
函数。 - ArjunShankar