用C 的GNUPLOT绘制几何图

Plotting geometric graph with gnuplot from C++

本文关键字:何图 绘制 GNUPLOT      更新时间:2023-10-16

我在C 中编写了一个代码,鉴于节点的坐标(彼此足够接近的点已连接),该代码找到了几何图的边缘。我现在想绘制图形,将链接的坐标管输送到GNUPLOT。看起来这样:

FILE *pipe = popen("gnuplot -persist", "w");
fprintf(pipe, "n");
fprintf(pipe, "set polarn");
fprintf(pipe, "plot '-' with linespoints n");

现在每次找到链接时(使用广度优先搜索算法),我做

fprintf(pipe, "%g %gn", RC[j].angle,RC[j].radius);
fprintf(pipe, "%g %gn", RC[start[ptr]].angle,RC[start[ptr]].radius);
fprintf(pipe, "%g %gn");

,搜索算法完成后,我以

结尾
fprintf(pipe, "en");
fflush(pipe);
fclose(pipe);

但是,这不会打印我期望的几何图(远距离删除的点已连接)。如果我使用此过程将数据写入文件

outfile << RC[j].angle << ", " << RC[j].radius << endl;
outfile << RC[start[ptr]].angle << ", " << RC[start[ptr]].radius << endl;
outfile << " " << endl; 

我确实得到了我想要的图。管道怎么了?

来自您的 std::ostreamfprintf版本,我可以看出差异很明显:您忘记了comas(,) fprintf版本中的空行:

fprintf(pipe, "%g, %gn", RC[j].angle, RC[j].radius);
fprintf(pipe, "%g, %gn", RC[start[ptr]].angle, RC[start[ptr]].radius);
fprintf(pipe, " n");

作为替代方案,我建议使用C 类代替旧C函数(未经测试):

class Pipe : public std::ofstream // in most cases this is bad, but ok here
{
public:
    Pipe( FILE* pf ) : _pg(pf) {}
    ~Pipe() { pclose(pf); }
    // copy-ctr(), op=(), ...
private:
    FILE _pf;
};
Pipe gnuplot(popen("gnuplot -persist", "w"));
gnuplot << "n"
        << "set polarn"
        << "plot '-' with linespointsn";
for (...)
{
     gnuplot << RC[j].angle << ", " << RC[j].radius << "n";
     gnuplot << RC[start[ptr]].angle << ", " << RC[start[ptr]].radius << "n";
     gnuplot << " " << std::endl; 
}