我是一名机械工程师,对 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);
我一直在使用 PLPlot 从 C 语言进行绘图,发现它既有效又简单。 它是跨平台、开源的,并支持丰富的绘图功能。 我建议先看看示例。
好的,一种解决方案,当您写入文件时,只需在写入文件时进行
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 步要求: 1. Windows 10/11 64 位 2. Install eclipse IDE(CDT 或科学计算) 3. 安装 MSYS2 4. Install
mingw64
使用 MSYS2 的 c 编译器所需组件并将其二进制路径添加到windows 环境变量 5. 使用 MSYS2 安装 mathgl
库:
第 2 步 Crete eclipse 项目女巫包含所需的
mathgl
所需的库。
将所需的库添加到项目中:
右键单击项目 -> 展开 C/C++ Build -> 设置 -> 展开 MinGW C Linker(如果未展开) -> Libraries -> Libraries (-l) -> add...
这里必须添加
mgl2
和mgl2-fltk
:
第3步(最后)编写绘图代码:在项目下创建一个.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;
}
构建此代码后,您将在调试文件夹中找到一个可执行文件。
James Black 于 2013 年 1 月 14 日撰写的有趣的短代码。只是给定答案的一个想法;
代码引用行:-
”
WriteToFile(pngData, 长度, "plot.png");
”
添加文件写入位置的路径可以使其更容易查找,例如“C:\users\myFolder\plot.png”。
或者甚至是通过蓝牙或电子邮件发送此图形图像的路径。